From 362969589d7dd95548db41a428606f357704a40f Mon Sep 17 00:00:00 2001 From: Denis Pushkarev Date: Thu, 24 Nov 2022 07:41:01 +0700 Subject: [PATCH 01/11] drop `speciesConstructor` from the old proposal methods --- packages/core-js/modules/esnext.set.difference.js | 3 +-- packages/core-js/modules/esnext.set.intersection.js | 3 +-- packages/core-js/modules/esnext.set.symmetric-difference.js | 3 +-- packages/core-js/modules/esnext.set.union.js | 3 +-- 4 files changed, 4 insertions(+), 8 deletions(-) diff --git a/packages/core-js/modules/esnext.set.difference.js b/packages/core-js/modules/esnext.set.difference.js index 9509035fb11d..44551b55c37e 100644 --- a/packages/core-js/modules/esnext.set.difference.js +++ b/packages/core-js/modules/esnext.set.difference.js @@ -4,7 +4,6 @@ var getBuiltIn = require('../internals/get-built-in'); var call = require('../internals/function-call'); var aCallable = require('../internals/a-callable'); var anObject = require('../internals/an-object'); -var speciesConstructor = require('../internals/species-constructor'); var iterate = require('../internals/iterate'); // `Set.prototype.difference` method @@ -12,7 +11,7 @@ var iterate = require('../internals/iterate'); $({ target: 'Set', proto: true, real: true, forced: true }, { difference: function difference(iterable) { var set = anObject(this); - var newSet = new (speciesConstructor(set, getBuiltIn('Set')))(set); + var newSet = new (getBuiltIn('Set'))(set); var remover = aCallable(newSet['delete']); iterate(iterable, function (value) { call(remover, newSet, value); diff --git a/packages/core-js/modules/esnext.set.intersection.js b/packages/core-js/modules/esnext.set.intersection.js index 9fecc8a180ae..401cef510dde 100644 --- a/packages/core-js/modules/esnext.set.intersection.js +++ b/packages/core-js/modules/esnext.set.intersection.js @@ -4,7 +4,6 @@ var getBuiltIn = require('../internals/get-built-in'); var call = require('../internals/function-call'); var aCallable = require('../internals/a-callable'); var anObject = require('../internals/an-object'); -var speciesConstructor = require('../internals/species-constructor'); var iterate = require('../internals/iterate'); // `Set.prototype.intersection` method @@ -12,7 +11,7 @@ var iterate = require('../internals/iterate'); $({ target: 'Set', proto: true, real: true, forced: true }, { intersection: function intersection(iterable) { var set = anObject(this); - var newSet = new (speciesConstructor(set, getBuiltIn('Set')))(); + var newSet = new (getBuiltIn('Set'))(); var hasCheck = aCallable(set.has); var adder = aCallable(newSet.add); iterate(iterable, function (value) { diff --git a/packages/core-js/modules/esnext.set.symmetric-difference.js b/packages/core-js/modules/esnext.set.symmetric-difference.js index 0c45a9b8b8c6..b1ed83caa647 100644 --- a/packages/core-js/modules/esnext.set.symmetric-difference.js +++ b/packages/core-js/modules/esnext.set.symmetric-difference.js @@ -4,7 +4,6 @@ var getBuiltIn = require('../internals/get-built-in'); var call = require('../internals/function-call'); var aCallable = require('../internals/a-callable'); var anObject = require('../internals/an-object'); -var speciesConstructor = require('../internals/species-constructor'); var iterate = require('../internals/iterate'); // `Set.prototype.symmetricDifference` method @@ -12,7 +11,7 @@ var iterate = require('../internals/iterate'); $({ target: 'Set', proto: true, real: true, forced: true }, { symmetricDifference: function symmetricDifference(iterable) { var set = anObject(this); - var newSet = new (speciesConstructor(set, getBuiltIn('Set')))(set); + var newSet = new (getBuiltIn('Set'))(set); var remover = aCallable(newSet['delete']); var adder = aCallable(newSet.add); iterate(iterable, function (value) { diff --git a/packages/core-js/modules/esnext.set.union.js b/packages/core-js/modules/esnext.set.union.js index 49888e06b568..8691dcf98dc8 100644 --- a/packages/core-js/modules/esnext.set.union.js +++ b/packages/core-js/modules/esnext.set.union.js @@ -3,7 +3,6 @@ var $ = require('../internals/export'); var getBuiltIn = require('../internals/get-built-in'); var aCallable = require('../internals/a-callable'); var anObject = require('../internals/an-object'); -var speciesConstructor = require('../internals/species-constructor'); var iterate = require('../internals/iterate'); // `Set.prototype.union` method @@ -11,7 +10,7 @@ var iterate = require('../internals/iterate'); $({ target: 'Set', proto: true, real: true, forced: true }, { union: function union(iterable) { var set = anObject(this); - var newSet = new (speciesConstructor(set, getBuiltIn('Set')))(set); + var newSet = new (getBuiltIn('Set'))(set); iterate(iterable, aCallable(newSet.add), { that: newSet }); return newSet; } From 8691a5e88e61e048c9f86a0e6845024807f94c1e Mon Sep 17 00:00:00 2001 From: Denis Pushkarev Date: Fri, 25 Nov 2022 06:26:48 +0700 Subject: [PATCH 02/11] rewrite set methods internals to the new semantic --- .../override/internals/set-helpers.js | 58 +++++++++++++++++++ packages/core-js/internals/get-set-record.js | 38 ++++++++++++ packages/core-js/internals/iterate-simple.js | 10 ++++ packages/core-js/internals/set-difference.js | 26 +++++++++ packages/core-js/internals/set-helpers.js | 46 +++++++++++++++ .../core-js/internals/set-intersection.js | 26 +++++++++ .../core-js/internals/set-is-disjoint-from.js | 24 ++++++++ .../core-js/internals/set-is-subset-of.js | 18 ++++++ .../core-js/internals/set-is-superset-of.js | 19 ++++++ .../internals/set-symmetric-difference.js | 23 ++++++++ packages/core-js/internals/set-union.js | 20 +++++++ packages/core-js/internals/to-set-like.js | 19 ++++++ .../core-js/modules/esnext.set.difference.js | 14 +---- .../modules/esnext.set.intersection.js | 15 +---- .../modules/esnext.set.is-disjoint-from.js | 13 ++--- .../modules/esnext.set.is-subset-of.js | 21 ++----- .../modules/esnext.set.is-superset-of.js | 13 ++--- .../esnext.set.symmetric-difference.js | 15 +---- packages/core-js/modules/esnext.set.union.js | 12 ++-- tests/unit-global/esnext.set.is-subset-of.js | 6 -- tests/unit-pure/esnext.set.is-subset-of.js | 6 -- 21 files changed, 352 insertions(+), 90 deletions(-) create mode 100644 packages/core-js-pure/override/internals/set-helpers.js create mode 100644 packages/core-js/internals/get-set-record.js create mode 100644 packages/core-js/internals/iterate-simple.js create mode 100644 packages/core-js/internals/set-difference.js create mode 100644 packages/core-js/internals/set-helpers.js create mode 100644 packages/core-js/internals/set-intersection.js create mode 100644 packages/core-js/internals/set-is-disjoint-from.js create mode 100644 packages/core-js/internals/set-is-subset-of.js create mode 100644 packages/core-js/internals/set-is-superset-of.js create mode 100644 packages/core-js/internals/set-symmetric-difference.js create mode 100644 packages/core-js/internals/set-union.js create mode 100644 packages/core-js/internals/to-set-like.js diff --git a/packages/core-js-pure/override/internals/set-helpers.js b/packages/core-js-pure/override/internals/set-helpers.js new file mode 100644 index 000000000000..bdf35ecde927 --- /dev/null +++ b/packages/core-js-pure/override/internals/set-helpers.js @@ -0,0 +1,58 @@ +var getBuiltIn = require('../internals/get-built-in'); +var anObject = require('../internals/an-object'); +var tryToString = require('../internals/try-to-string'); +var iterateSimple = require('../internals/iterate-simple'); + +var Set = getBuiltIn('Set'); +var $TypeError = TypeError; + +var aSet = function (it) { + anObject(it); + if ('size' in it && 'has' in it && 'add' in it && 'delete' in it && 'keys' in it) return it; + throw $TypeError(tryToString(it) + ' is not a set'); +}; + +var add = function (set, it) { + return set.add(it); +}; + +var remove = function (set, it) { + return set['delete'](it); +}; + +var forEach = function (set, fn) { + set.forEach(fn); +}; + +var has = function (set, it) { + return set.has(it); +}; + +var size = function (set) { + return set.size; +}; + +var clone = function (set) { + var result = new Set(); + forEach(set, function (it) { + add(result, it); + }); + return result; +}; + +var iterate = function (set, fn) { + var iterator = set.keys(); + return iterateSimple(iterator, fn, iterator.next); +}; + +module.exports = { + Set: Set, + aSet: aSet, + add: add, + remove: remove, + forEach: forEach, + has: has, + size: size, + clone: clone, + iterate: iterate +}; diff --git a/packages/core-js/internals/get-set-record.js b/packages/core-js/internals/get-set-record.js new file mode 100644 index 000000000000..a0d5133d7fdb --- /dev/null +++ b/packages/core-js/internals/get-set-record.js @@ -0,0 +1,38 @@ +var aCallable = require('../internals/a-callable'); +var anObject = require('../internals/an-object'); +var call = require('../internals/function-call'); +var toIntegerOrInfinity = require('../internals/to-integer-or-infinity'); + +var $TypeError = TypeError; + +var SetRecord = function (set, size, has, keys) { + this.set = set; + this.size = size; + this.has = has; + this.keys = keys; +}; + +SetRecord.prototype = { + getIterator: function () { + return anObject(call(this.keys, this.set)); + }, + includes: function (it) { + return call(this.has, this.set, it); + } +}; + +// `GetSetRecord` abstract operation +// https://tc39.es/proposal-set-methods/#sec-getsetrecord +module.exports = function (obj) { + anObject(obj); + var numSize = +obj.size; + // NOTE: If size is undefined, then numSize will be NaN + // eslint-disable-next-line no-self-compare -- NaN check + if (numSize != numSize) throw $TypeError('Invalid size'); + return new SetRecord( + obj, + toIntegerOrInfinity(numSize), + aCallable(obj.has), + aCallable(obj.keys) + ); +}; diff --git a/packages/core-js/internals/iterate-simple.js b/packages/core-js/internals/iterate-simple.js new file mode 100644 index 000000000000..e8da34f5c2bd --- /dev/null +++ b/packages/core-js/internals/iterate-simple.js @@ -0,0 +1,10 @@ +var call = require('../internals/function-call'); + +module.exports = function (iterator, fn, $next) { + var next = arguments.length > 2 ? $next : iterator.next; + var step, result; + while (!(step = call(next, iterator)).done) { + result = fn(step.value); + if (result !== undefined) return result; + } +}; diff --git a/packages/core-js/internals/set-difference.js b/packages/core-js/internals/set-difference.js new file mode 100644 index 000000000000..4614ce548d26 --- /dev/null +++ b/packages/core-js/internals/set-difference.js @@ -0,0 +1,26 @@ +'use strict'; +var SetHelpers = require('../internals/set-helpers'); +var getSetRecord = require('../internals/get-set-record'); +var iterateSimple = require('../internals/iterate-simple'); + +var aSet = SetHelpers.aSet; +var has = SetHelpers.has; +var remove = SetHelpers.remove; +var size = SetHelpers.size; +var forEach = SetHelpers.forEach; +var clone = SetHelpers.clone; + +// `Set.prototype.difference` method +// https://github.com/tc39/proposal-set-methods +module.exports = function difference(other) { + var O = aSet(this); + var otherRec = getSetRecord(other); + var result = clone(O); + if (size(O) <= otherRec.size) forEach(O, function (e) { + if (otherRec.includes(e)) remove(result, e); + }); + else iterateSimple(otherRec.getIterator(), function (e) { + if (has(O, e)) remove(result, e); + }); + return result; +}; diff --git a/packages/core-js/internals/set-helpers.js b/packages/core-js/internals/set-helpers.js new file mode 100644 index 000000000000..bc7cae631611 --- /dev/null +++ b/packages/core-js/internals/set-helpers.js @@ -0,0 +1,46 @@ +var DESCRIPTORS = require('../internals/descriptors'); +var uncurryThis = require('../internals/function-uncurry-this'); +var iterateSimple = require('../internals/iterate-simple'); + +// eslint-disable-next-line es/no-set -- safe +var $Set = Set; +var SetPrototype = $Set.prototype; +var add = uncurryThis(SetPrototype.add); +var forEach = uncurryThis(SetPrototype.forEach); +var has = uncurryThis(SetPrototype.has); +var keys = uncurryThis(SetPrototype.keys); +var next = keys(new $Set()).next; + +var aSet = function (it) { + has(it); + return it; +}; + +// eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe +var size = DESCRIPTORS ? uncurryThis(Object.getOwnPropertyDescriptor(SetPrototype, 'size').get) : function (set) { + return set.size; +}; + +var clone = function (set) { + var result = new $Set(); + forEach(set, function (it) { + add(result, it); + }); + return result; +}; + +var iterate = function (set, fn) { + return iterateSimple(keys(set), fn, next); +}; + +module.exports = { + Set: $Set, + aSet: aSet, + add: add, + remove: uncurryThis(SetPrototype['delete']), + forEach: forEach, + has: has, + size: size, + clone: clone, + iterate: iterate +}; diff --git a/packages/core-js/internals/set-intersection.js b/packages/core-js/internals/set-intersection.js new file mode 100644 index 000000000000..bcbf8a9d49b1 --- /dev/null +++ b/packages/core-js/internals/set-intersection.js @@ -0,0 +1,26 @@ +'use strict'; +var SetHelpers = require('../internals/set-helpers'); +var getSetRecord = require('../internals/get-set-record'); +var iterateSimple = require('../internals/iterate-simple'); + +var Set = SetHelpers.Set; +var aSet = SetHelpers.aSet; +var add = SetHelpers.add; +var has = SetHelpers.has; +var size = SetHelpers.size; +var forEach = SetHelpers.forEach; + +// `Set.prototype.intersection` method +// https://github.com/tc39/proposal-set-methods +module.exports = function intersection(other) { + var O = aSet(this); + var otherRec = getSetRecord(other); + var result = new Set(); + if (size(O) <= otherRec.size) forEach(O, function (e) { + if (otherRec.includes(e)) add(result, e); + }); + else iterateSimple(otherRec.getIterator(), function (e) { + if (has(O, e)) add(result, e); + }); + return result; +}; diff --git a/packages/core-js/internals/set-is-disjoint-from.js b/packages/core-js/internals/set-is-disjoint-from.js new file mode 100644 index 000000000000..5a6ca01fcbe8 --- /dev/null +++ b/packages/core-js/internals/set-is-disjoint-from.js @@ -0,0 +1,24 @@ +'use strict'; +var SetHelpers = require('../internals/set-helpers'); +var getSetRecord = require('../internals/get-set-record'); +var iterateSimple = require('../internals/iterate-simple'); + +var aSet = SetHelpers.aSet; +var has = SetHelpers.has; +var size = SetHelpers.size; +var iterate = SetHelpers.iterate; + +// `Set.prototype.isDisjointFrom` method +// https://tc39.github.io/proposal-set-methods/#Set.prototype.isDisjointFrom +module.exports = function isDisjointFrom(other) { + var O = aSet(this); + var otherRec = getSetRecord(other); + return false !== (size(O) <= otherRec.size + ? iterate(O, function (e) { + if (otherRec.includes(e)) return false; + }) + : iterateSimple(otherRec.getIterator(), function (e) { + if (has(O, e)) return false; + }) + ); +}; diff --git a/packages/core-js/internals/set-is-subset-of.js b/packages/core-js/internals/set-is-subset-of.js new file mode 100644 index 000000000000..3b1073395503 --- /dev/null +++ b/packages/core-js/internals/set-is-subset-of.js @@ -0,0 +1,18 @@ +'use strict'; +var SetHelpers = require('../internals/set-helpers'); +var getSetRecord = require('../internals/get-set-record'); + +var aSet = SetHelpers.aSet; +var size = SetHelpers.size; +var iterate = SetHelpers.iterate; + +// `Set.prototype.isSubsetOf` method +// https://tc39.github.io/proposal-set-methods/#Set.prototype.isSubsetOf +module.exports = function isSubsetOf(other) { + var O = aSet(this); + var otherRec = getSetRecord(other); + if (size(O) > otherRec.size) return false; + return iterate(O, function (e) { + if (!otherRec.includes(e)) return false; + }) !== false; +}; diff --git a/packages/core-js/internals/set-is-superset-of.js b/packages/core-js/internals/set-is-superset-of.js new file mode 100644 index 000000000000..46fb4433fb82 --- /dev/null +++ b/packages/core-js/internals/set-is-superset-of.js @@ -0,0 +1,19 @@ +'use strict'; +var SetHelpers = require('../internals/set-helpers'); +var getSetRecord = require('../internals/get-set-record'); +var iterateSimple = require('../internals/iterate-simple'); + +var aSet = SetHelpers.aSet; +var has = SetHelpers.has; +var size = SetHelpers.size; + +// `Set.prototype.isSupersetOf` method +// https://tc39.github.io/proposal-set-methods/#Set.prototype.isSupersetOf +module.exports = function isSupersetOf(other) { + var O = aSet(this); + var otherRec = getSetRecord(other); + if (size(O) < otherRec.size) return false; + return iterateSimple(otherRec.getIterator(), function (e) { + if (has(O, e) === false) return false; + }) !== false; +}; diff --git a/packages/core-js/internals/set-symmetric-difference.js b/packages/core-js/internals/set-symmetric-difference.js new file mode 100644 index 000000000000..b86128a8fb38 --- /dev/null +++ b/packages/core-js/internals/set-symmetric-difference.js @@ -0,0 +1,23 @@ +'use strict'; +var SetHelpers = require('../internals/set-helpers'); +var getSetRecord = require('../internals/get-set-record'); +var iterateSimple = require('../internals/iterate-simple'); + +var aSet = SetHelpers.aSet; +var add = SetHelpers.add; +var has = SetHelpers.has; +var remove = SetHelpers.remove; +var clone = SetHelpers.clone; + +// `Set.prototype.symmetricDifference` method +// https://github.com/tc39/proposal-set-methods +module.exports = function symmetricDifference(other) { + var O = aSet(this); + var keysIter = getSetRecord(other).getIterator(); + var result = clone(O); + iterateSimple(keysIter, function (e) { + if (has(O, e)) remove(result, e); + else add(result, e); + }); + return result; +}; diff --git a/packages/core-js/internals/set-union.js b/packages/core-js/internals/set-union.js new file mode 100644 index 000000000000..57c389bc8a00 --- /dev/null +++ b/packages/core-js/internals/set-union.js @@ -0,0 +1,20 @@ +'use strict'; +var SetHelpers = require('../internals/set-helpers'); +var getSetRecord = require('../internals/get-set-record'); +var iterateSimple = require('../internals/iterate-simple'); + +var aSet = SetHelpers.aSet; +var add = SetHelpers.add; +var clone = SetHelpers.clone; + +// `Set.prototype.union` method +// https://github.com/tc39/proposal-set-methods +module.exports = function union(other) { + var O = aSet(this); + var keysIter = getSetRecord(other).getIterator(); + var result = clone(O); + iterateSimple(keysIter, function (it) { + add(result, it); + }); + return result; +}; diff --git a/packages/core-js/internals/to-set-like.js b/packages/core-js/internals/to-set-like.js new file mode 100644 index 000000000000..1cc76fc70db8 --- /dev/null +++ b/packages/core-js/internals/to-set-like.js @@ -0,0 +1,19 @@ +var getBuiltIn = require('../internals/get-built-in'); +var isCallable = require('../internals/is-callable'); +var isIterable = require('../internals/is-iterable'); +var isObject = require('../internals/is-object'); + +var Set = getBuiltIn('Set'); + +var isSetLike = function (it) { + return isObject(it) + && typeof it.size == 'number' + && isCallable(it.has) + && isCallable(it.keys); +}; + +// fallback old -> new set methods proposal arguments +module.exports = function (it) { + if (isSetLike(it)) return it; + if (isIterable(it)) return new Set(it); +}; diff --git a/packages/core-js/modules/esnext.set.difference.js b/packages/core-js/modules/esnext.set.difference.js index 44551b55c37e..13853b5712ba 100644 --- a/packages/core-js/modules/esnext.set.difference.js +++ b/packages/core-js/modules/esnext.set.difference.js @@ -1,21 +1,13 @@ 'use strict'; var $ = require('../internals/export'); -var getBuiltIn = require('../internals/get-built-in'); var call = require('../internals/function-call'); -var aCallable = require('../internals/a-callable'); -var anObject = require('../internals/an-object'); -var iterate = require('../internals/iterate'); +var toSetLike = require('../internals/to-set-like'); +var $difference = require('../internals/set-difference'); // `Set.prototype.difference` method // https://github.com/tc39/proposal-set-methods $({ target: 'Set', proto: true, real: true, forced: true }, { difference: function difference(iterable) { - var set = anObject(this); - var newSet = new (getBuiltIn('Set'))(set); - var remover = aCallable(newSet['delete']); - iterate(iterable, function (value) { - call(remover, newSet, value); - }); - return newSet; + return call($difference, this, toSetLike(iterable)); } }); diff --git a/packages/core-js/modules/esnext.set.intersection.js b/packages/core-js/modules/esnext.set.intersection.js index 401cef510dde..e62287b4bf9b 100644 --- a/packages/core-js/modules/esnext.set.intersection.js +++ b/packages/core-js/modules/esnext.set.intersection.js @@ -1,22 +1,13 @@ 'use strict'; var $ = require('../internals/export'); -var getBuiltIn = require('../internals/get-built-in'); var call = require('../internals/function-call'); -var aCallable = require('../internals/a-callable'); -var anObject = require('../internals/an-object'); -var iterate = require('../internals/iterate'); +var toSetLike = require('../internals/to-set-like'); +var $intersection = require('../internals/set-intersection'); // `Set.prototype.intersection` method // https://github.com/tc39/proposal-set-methods $({ target: 'Set', proto: true, real: true, forced: true }, { intersection: function intersection(iterable) { - var set = anObject(this); - var newSet = new (getBuiltIn('Set'))(); - var hasCheck = aCallable(set.has); - var adder = aCallable(newSet.add); - iterate(iterable, function (value) { - if (call(hasCheck, set, value)) call(adder, newSet, value); - }); - return newSet; + return call($intersection, this, toSetLike(iterable)); } }); diff --git a/packages/core-js/modules/esnext.set.is-disjoint-from.js b/packages/core-js/modules/esnext.set.is-disjoint-from.js index 2dde2ab7642f..c3df7a5122f8 100644 --- a/packages/core-js/modules/esnext.set.is-disjoint-from.js +++ b/packages/core-js/modules/esnext.set.is-disjoint-from.js @@ -1,18 +1,13 @@ 'use strict'; var $ = require('../internals/export'); var call = require('../internals/function-call'); -var aCallable = require('../internals/a-callable'); -var anObject = require('../internals/an-object'); -var iterate = require('../internals/iterate'); +var toSetLike = require('../internals/to-set-like'); +var $isDisjointFrom = require('../internals/set-is-disjoint-from'); // `Set.prototype.isDisjointFrom` method -// https://tc39.github.io/proposal-set-methods/#Set.prototype.isDisjointFrom +// https://github.com/tc39/proposal-set-methods $({ target: 'Set', proto: true, real: true, forced: true }, { isDisjointFrom: function isDisjointFrom(iterable) { - var set = anObject(this); - var hasCheck = aCallable(set.has); - return !iterate(iterable, function (value, stop) { - if (call(hasCheck, set, value) === true) return stop(); - }, { INTERRUPTED: true }).stopped; + return call($isDisjointFrom, this, toSetLike(iterable)); } }); diff --git a/packages/core-js/modules/esnext.set.is-subset-of.js b/packages/core-js/modules/esnext.set.is-subset-of.js index c1235250bcdd..8adcad41348e 100644 --- a/packages/core-js/modules/esnext.set.is-subset-of.js +++ b/packages/core-js/modules/esnext.set.is-subset-of.js @@ -1,26 +1,13 @@ 'use strict'; var $ = require('../internals/export'); -var getBuiltIn = require('../internals/get-built-in'); var call = require('../internals/function-call'); -var aCallable = require('../internals/a-callable'); -var isCallable = require('../internals/is-callable'); -var anObject = require('../internals/an-object'); -var getIterator = require('../internals/get-iterator'); -var iterate = require('../internals/iterate'); +var toSetLike = require('../internals/to-set-like'); +var $isSubsetOf = require('../internals/set-is-subset-of'); // `Set.prototype.isSubsetOf` method -// https://tc39.github.io/proposal-set-methods/#Set.prototype.isSubsetOf +// https://github.com/tc39/proposal-set-methods $({ target: 'Set', proto: true, real: true, forced: true }, { isSubsetOf: function isSubsetOf(iterable) { - var iterator = getIterator(this); - var otherSet = anObject(iterable); - var hasCheck = otherSet.has; - if (!isCallable(hasCheck)) { - otherSet = new (getBuiltIn('Set'))(iterable); - hasCheck = aCallable(otherSet.has); - } - return !iterate(iterator, function (value, stop) { - if (call(hasCheck, otherSet, value) === false) return stop(); - }, { IS_ITERATOR: true, INTERRUPTED: true }).stopped; + return call($isSubsetOf, this, toSetLike(iterable)); } }); diff --git a/packages/core-js/modules/esnext.set.is-superset-of.js b/packages/core-js/modules/esnext.set.is-superset-of.js index 59b15bb173c4..306b762cc5d8 100644 --- a/packages/core-js/modules/esnext.set.is-superset-of.js +++ b/packages/core-js/modules/esnext.set.is-superset-of.js @@ -1,18 +1,13 @@ 'use strict'; var $ = require('../internals/export'); var call = require('../internals/function-call'); -var aCallable = require('../internals/a-callable'); -var anObject = require('../internals/an-object'); -var iterate = require('../internals/iterate'); +var toSetLike = require('../internals/to-set-like'); +var $isSupersetOf = require('../internals/set-is-superset-of'); // `Set.prototype.isSupersetOf` method -// https://tc39.github.io/proposal-set-methods/#Set.prototype.isSupersetOf +// https://github.com/tc39/proposal-set-methods $({ target: 'Set', proto: true, real: true, forced: true }, { isSupersetOf: function isSupersetOf(iterable) { - var set = anObject(this); - var hasCheck = aCallable(set.has); - return !iterate(iterable, function (value, stop) { - if (call(hasCheck, set, value) === false) return stop(); - }, { INTERRUPTED: true }).stopped; + return call($isSupersetOf, this, toSetLike(iterable)); } }); diff --git a/packages/core-js/modules/esnext.set.symmetric-difference.js b/packages/core-js/modules/esnext.set.symmetric-difference.js index b1ed83caa647..30b63c31d448 100644 --- a/packages/core-js/modules/esnext.set.symmetric-difference.js +++ b/packages/core-js/modules/esnext.set.symmetric-difference.js @@ -1,22 +1,13 @@ 'use strict'; var $ = require('../internals/export'); -var getBuiltIn = require('../internals/get-built-in'); var call = require('../internals/function-call'); -var aCallable = require('../internals/a-callable'); -var anObject = require('../internals/an-object'); -var iterate = require('../internals/iterate'); +var toSetLike = require('../internals/to-set-like'); +var $symmetricDifference = require('../internals/set-symmetric-difference'); // `Set.prototype.symmetricDifference` method // https://github.com/tc39/proposal-set-methods $({ target: 'Set', proto: true, real: true, forced: true }, { symmetricDifference: function symmetricDifference(iterable) { - var set = anObject(this); - var newSet = new (getBuiltIn('Set'))(set); - var remover = aCallable(newSet['delete']); - var adder = aCallable(newSet.add); - iterate(iterable, function (value) { - call(remover, newSet, value) || call(adder, newSet, value); - }); - return newSet; + return call($symmetricDifference, this, toSetLike(iterable)); } }); diff --git a/packages/core-js/modules/esnext.set.union.js b/packages/core-js/modules/esnext.set.union.js index 8691dcf98dc8..fed65735b9be 100644 --- a/packages/core-js/modules/esnext.set.union.js +++ b/packages/core-js/modules/esnext.set.union.js @@ -1,17 +1,13 @@ 'use strict'; var $ = require('../internals/export'); -var getBuiltIn = require('../internals/get-built-in'); -var aCallable = require('../internals/a-callable'); -var anObject = require('../internals/an-object'); -var iterate = require('../internals/iterate'); +var call = require('../internals/function-call'); +var toSetLike = require('../internals/to-set-like'); +var $union = require('../internals/set-union'); // `Set.prototype.union` method // https://github.com/tc39/proposal-set-methods $({ target: 'Set', proto: true, real: true, forced: true }, { union: function union(iterable) { - var set = anObject(this); - var newSet = new (getBuiltIn('Set'))(set); - iterate(iterable, aCallable(newSet.add), { that: newSet }); - return newSet; + return call($union, this, toSetLike(iterable)); } }); diff --git a/tests/unit-global/esnext.set.is-subset-of.js b/tests/unit-global/esnext.set.is-subset-of.js index 84b5d115b704..1f749464e257 100644 --- a/tests/unit-global/esnext.set.is-subset-of.js +++ b/tests/unit-global/esnext.set.is-subset-of.js @@ -17,12 +17,6 @@ QUnit.test('Set#isSubsetOf', assert => { assert.true(new Set([1]).isSubsetOf(createIterable([1, 2, 3]))); assert.false(new Set([1]).isSubsetOf(createIterable([2, 3, 4]))); - assert.true(new Set([1]).isSubsetOf({ has: () => true })); - assert.false(new Set([1]).isSubsetOf({ has: () => false })); - - assert.true(isSubsetOf.call('ab', ['a', 'b', 'c'])); - assert.false(isSubsetOf.call('ab', ['a'])); - assert.throws(() => new Set([1, 2, 3]).isSubsetOf(), TypeError); assert.throws(() => isSubsetOf.call({}, [1, 2, 3]), TypeError); assert.throws(() => isSubsetOf.call(undefined, [1, 2, 3]), TypeError); diff --git a/tests/unit-pure/esnext.set.is-subset-of.js b/tests/unit-pure/esnext.set.is-subset-of.js index 965c7c88562d..ba0b0a998e76 100644 --- a/tests/unit-pure/esnext.set.is-subset-of.js +++ b/tests/unit-pure/esnext.set.is-subset-of.js @@ -18,12 +18,6 @@ QUnit.test('Set#isSubsetOf', assert => { assert.true(new Set([1]).isSubsetOf(createIterable([1, 2, 3]))); assert.false(new Set([1]).isSubsetOf(createIterable([2, 3, 4]))); - assert.true(new Set([1]).isSubsetOf({ has: () => true })); - assert.false(new Set([1]).isSubsetOf({ has: () => false })); - - assert.true(isSubsetOf.call('ab', ['a', 'b', 'c'])); - assert.false(isSubsetOf.call('ab', ['a'])); - assert.throws(() => new Set([1, 2, 3]).isSubsetOf(), TypeError); assert.throws(() => isSubsetOf.call({}, [1, 2, 3]), TypeError); assert.throws(() => isSubsetOf.call(undefined, [1, 2, 3]), TypeError); From b96d83fabf294719448a5d5f10bcb11bd7072727 Mon Sep 17 00:00:00 2001 From: Denis Pushkarev Date: Fri, 25 Nov 2022 08:50:01 +0700 Subject: [PATCH 03/11] expose new iteration of the `Set` methods proposal, move it to stage 3 --- README.md | 73 +++++++++---------- packages/core-js-compat/src/data.mjs | 21 ++++++ .../src/modules-by-versions.mjs | 9 +++ packages/core-js/actual/set/difference.js | 5 ++ packages/core-js/actual/set/index.js | 7 ++ packages/core-js/actual/set/intersection.js | 5 ++ .../core-js/actual/set/is-disjoint-from.js | 5 ++ packages/core-js/actual/set/is-subset-of.js | 5 ++ packages/core-js/actual/set/is-superset-of.js | 5 ++ .../actual/set/symmetric-difference.js | 5 ++ packages/core-js/actual/set/union.js | 5 ++ packages/core-js/full/set/difference.js | 2 +- packages/core-js/full/set/intersection.js | 2 +- packages/core-js/full/set/is-disjoint-from.js | 2 +- packages/core-js/full/set/is-subset-of.js | 2 +- packages/core-js/full/set/is-superset-of.js | 2 +- .../core-js/full/set/symmetric-difference.js | 2 +- packages/core-js/full/set/union.js | 2 +- .../core-js/modules/esnext.set.difference.js | 1 + .../modules/esnext.set.difference.v2.js | 9 +++ .../modules/esnext.set.intersection.js | 1 + .../modules/esnext.set.intersection.v2.js | 9 +++ .../modules/esnext.set.is-disjoint-from.js | 1 + .../modules/esnext.set.is-disjoint-from.v2.js | 9 +++ .../modules/esnext.set.is-subset-of.js | 1 + .../modules/esnext.set.is-subset-of.v2.js | 9 +++ .../modules/esnext.set.is-superset-of.js | 1 + .../modules/esnext.set.is-superset-of.v2.js | 9 +++ .../esnext.set.symmetric-difference.js | 1 + .../esnext.set.symmetric-difference.v2.js | 9 +++ packages/core-js/modules/esnext.set.union.js | 1 + .../core-js/modules/esnext.set.union.v2.js | 9 +++ packages/core-js/proposals/set-methods-v2.js | 8 ++ packages/core-js/proposals/set-methods.js | 8 ++ packages/core-js/stage/3.js | 1 + tests/compat-data/tests-coverage.mjs | 7 ++ tests/compat/tests.js | 14 ++-- tests/entries/unit.mjs | 15 ++-- 38 files changed, 224 insertions(+), 58 deletions(-) create mode 100644 packages/core-js/actual/set/difference.js create mode 100644 packages/core-js/actual/set/intersection.js create mode 100644 packages/core-js/actual/set/is-disjoint-from.js create mode 100644 packages/core-js/actual/set/is-subset-of.js create mode 100644 packages/core-js/actual/set/is-superset-of.js create mode 100644 packages/core-js/actual/set/symmetric-difference.js create mode 100644 packages/core-js/actual/set/union.js create mode 100644 packages/core-js/modules/esnext.set.difference.v2.js create mode 100644 packages/core-js/modules/esnext.set.intersection.v2.js create mode 100644 packages/core-js/modules/esnext.set.is-disjoint-from.v2.js create mode 100644 packages/core-js/modules/esnext.set.is-subset-of.v2.js create mode 100644 packages/core-js/modules/esnext.set.is-superset-of.v2.js create mode 100644 packages/core-js/modules/esnext.set.symmetric-difference.v2.js create mode 100644 packages/core-js/modules/esnext.set.union.v2.js create mode 100644 packages/core-js/proposals/set-methods-v2.js diff --git a/README.md b/README.md index 18e31624418e..60abba77b5fc 100644 --- a/README.md +++ b/README.md @@ -129,9 +129,9 @@ queueMicrotask(() => console.log('called as microtask')); - [`Array.fromAsync`](#arrayfromasync) - [`Array` grouping](#array-grouping) - [Change `Array` by copy](#change-array-by-copy) + - [New `Set` methods](#new-set-methods) - [Well-formed unicode strings](#well-formed-unicode-strings) - [Stage 2 proposals](#stage-2-proposals) - - [New `Set` methods](#new-set-methods) - [`Map.prototype.emplace`](#mapprototypeemplace) - [`Array.isTemplateObject`](#arrayistemplateobject) - [`Symbol.{ asyncDispose, dispose }` for `using` statement](#symbol-asyncdispose-dispose--for-using-statement) @@ -2277,6 +2277,40 @@ const correctionNeeded = [1, 1, 3]; correctionNeeded.with(1, 2); // => [1, 2, 3] correctionNeeded; // => [1, 1, 3] ```` +##### [New `Set` methods](https://github.com/tc39/proposal-set-methods)[⬆](#index) +Modules [`esnext.set.difference.v2`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/esnext.set.difference.v2.js), [`esnext.set.intersection.v2`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/esnext.set.intersection.v2.js), [`esnext.set.is-disjoint-from.v2`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/esnext.set.is-disjoint-from.v2.js), [`esnext.set.is-subset-of.v2`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/esnext.set.is-subset-of.v2.js), [`esnext.set.is-superset-of.v2`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/esnext.set.is-superset-of.v2.js), [`esnext.set.symmetric-difference.v2`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/esnext.set.symmetric-difference.v2.js), [`esnext.set.union.v2`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/esnext.set.union.v2.js) +```js +class Set { + difference(other: SetLike): Set; + intersection(other: SetLike): Set; + isDisjointFrom(other: SetLike): boolean; + isSubsetOf(other: SetLike): boolean; + isSupersetOf(other: SetLike): boolean; + symmetricDifference(other: SetLike): Set; + union(other: SetLike): Set; +} +``` +[*CommonJS entry points:*](#commonjs-api) +```js +core-js/proposals/set-methods-v2 +core-js(-pure)/actual|full/set/difference +core-js(-pure)/actual|full/set/intersection +core-js(-pure)/actual|full/set/is-disjoint-from +core-js(-pure)/actual|full/set/is-subset-of +core-js(-pure)/actual|full/set/is-superset-of +core-js(-pure)/actual|full/set/symmetric-difference +core-js(-pure)/actual|full/set/union +``` +[*Examples*](https://tinyurl.com/2henaoac): +```js +new Set([1, 2, 3]).union(new Set([3, 4, 5])); // => Set {1, 2, 3, 4, 5} +new Set([1, 2, 3]).intersection(new Set([3, 4, 5])); // => Set {3} +new Set([1, 2, 3]).difference(new Set([3, 4, 5])); // => Set {1, 2} +new Set([1, 2, 3]).symmetricDifference(new Set([3, 4, 5])); // => Set {1, 2, 4, 5} +new Set([1, 2, 3]).isDisjointFrom(new Set([4, 5, 6])); // => true +new Set([1, 2, 3]).isSubsetOf(new Set([5, 4, 3, 2, 1])); // => true +new Set([5, 4, 3, 2, 1]).isSupersetOf(new Set([1, 2, 3])); // => true +``` ##### [Well-formed unicode strings](https://github.com/tc39/proposal-is-usv-string)[⬆](#index) Modules [`esnext.string.is-well-formed`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/esnext.string.is-well-formed.js) and [`esnext.string.to-well-formed`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/esnext.string.to-well-formed.js) ```js @@ -2305,41 +2339,6 @@ core-js(-pure)/actual|full/string(/virtual)/to-well-formed ``` core-js(-pure)/stage/2 ``` -##### [New `Set` methods](https://github.com/tc39/proposal-set-methods)[⬆](#index) -Modules [`esnext.set.difference`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/esnext.set.difference.js), [`esnext.set.intersection`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/esnext.set.intersection.js), [`esnext.set.is-disjoint-from`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/esnext.set.is-disjoint-from.js), [`esnext.set.is-subset-of`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/esnext.set.is-subset-of.js), [`esnext.set.is-superset-of`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/esnext.set.is-superset-of.js), [`esnext.set.symmetric-difference`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/esnext.set.symmetric-difference.js), [`esnext.set.union`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/esnext.set.union.js) -```js -class Set { - difference(iterable: SetLike): Set; - intersection(iterable: SetLike): Set; - isDisjointFrom(iterable: SetLike): boolean; - isSubsetOf(iterable: SetLike): boolean; - isSupersetOf(iterable: SetLike): boolean; - symmetricDifference(iterable: SetLike): Set; - union(iterable: SetLike): Set; -} -``` -[*CommonJS entry points:*](#commonjs-api) -```js -core-js/proposals/set-methods -core-js(-pure)/full/set/difference -core-js(-pure)/full/set/intersection -core-js(-pure)/full/set/is-disjoint-from -core-js(-pure)/full/set/is-subset-of -core-js(-pure)/full/set/is-superset-of -core-js(-pure)/full/set/symmetric-difference -core-js(-pure)/full/set/union -``` -[*Examples*](https://tinyurl.com/2henaoac): -```js -new Set([1, 2, 3]).union(new Set([3, 4, 5])); // => Set {1, 2, 3, 4, 5} -new Set([1, 2, 3]).intersection(new Set([3, 4, 5])); // => Set {3} -new Set([1, 2, 3]).difference(new Set([3, 4, 5])); // => Set {1, 2} -new Set([1, 2, 3]).symmetricDifference(new Set([3, 4, 5])); // => Set {1, 2, 4, 5} - -new Set([1, 2, 3]).isDisjointFrom(new Set([4, 5, 6])); // => true -new Set([1, 2, 3]).isSubsetOf(new Set([5, 4, 3, 2, 1])); // => true -new Set([5, 4, 3, 2, 1]).isSupersetOf(new Set([1, 2, 3])); // => true -``` ##### [`Map.prototype.emplace`](https://github.com/thumbsupep/proposal-upsert)[⬆](#index) Modules [`esnext.map.emplace`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/esnext.map.emplace.js) and [`esnext.weak-map.emplace`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/esnext.weak-map.emplace.js) ```js @@ -3371,4 +3370,4 @@ console.log(getIteratorMethod({})); // undefined - ES `Proxy` can't be polyfilled, you can try to use [`proxy-polyfill`](https://github.com/GoogleChrome/proxy-polyfill) which provides a very little subset of features. - ES `String#normalize` is not a very useful feature, but this polyfill will be very large. If you need it, you can use [unorm](https://github.com/walling/unorm/). - ECMA-402 `Intl` is missed because of the size. You can use [those polyfills](https://formatjs.io/docs/polyfills). -- `window.fetch` is not a cross-platform feature, in some environments, it makes no sense. For this reason, I don't think it should be in `core-js`. Looking at a large number of requests it *might be* added in the future. Now you can use, for example, [this polyfill](https://github.com/github/fetch). +- `window.fetch` is not a cross-platform feature, in some environments, it makes no sense. For this reason, I don't think it should be in `core-js`. Looking at a large number of requests it *might be* added in the future. Now you can use, for example, [this polyfill](https://github.com/github/fetch). \ No newline at end of file diff --git a/packages/core-js-compat/src/data.mjs b/packages/core-js-compat/src/data.mjs index fb81426fd979..7fabd6ce139d 100644 --- a/packages/core-js-compat/src/data.mjs +++ b/packages/core-js-compat/src/data.mjs @@ -2071,6 +2071,9 @@ export const data = { }, 'esnext.set.delete-all': { }, + 'esnext.set.difference.v2': { + }, + // TODO: Remove from `core-js@4` 'esnext.set.difference': { }, 'esnext.set.every': { @@ -2081,12 +2084,24 @@ export const data = { }, 'esnext.set.from': { }, + 'esnext.set.intersection.v2': { + }, + // TODO: Remove from `core-js@4` 'esnext.set.intersection': { }, + 'esnext.set.is-disjoint-from.v2': { + }, + // TODO: Remove from `core-js@4` 'esnext.set.is-disjoint-from': { }, + 'esnext.set.is-subset-of.v2': { + }, + // TODO: Remove from `core-js@4` 'esnext.set.is-subset-of': { }, + 'esnext.set.is-superset-of.v2': { + }, + // TODO: Remove from `core-js@4` 'esnext.set.is-superset-of': { }, 'esnext.set.join': { @@ -2099,8 +2114,14 @@ export const data = { }, 'esnext.set.some': { }, + 'esnext.set.symmetric-difference.v2': { + }, + // TODO: Remove from `core-js@4` 'esnext.set.symmetric-difference': { }, + 'esnext.set.union.v2': { + }, + // TODO: Remove from `core-js@4` 'esnext.set.union': { }, // TODO: Remove from `core-js@4` diff --git a/packages/core-js-compat/src/modules-by-versions.mjs b/packages/core-js-compat/src/modules-by-versions.mjs index b205bb46c72b..4c9cda9c7043 100644 --- a/packages/core-js-compat/src/modules-by-versions.mjs +++ b/packages/core-js-compat/src/modules-by-versions.mjs @@ -162,4 +162,13 @@ export default { 'esnext.string.to-well-formed', 'web.self', ], + 3.27: [ + 'esnext.set.difference.v2', + 'esnext.set.intersection.v2', + 'esnext.set.is-disjoint-from.v2', + 'esnext.set.is-subset-of.v2', + 'esnext.set.is-superset-of.v2', + 'esnext.set.symmetric-difference.v2', + 'esnext.set.union.v2', + ], }; diff --git a/packages/core-js/actual/set/difference.js b/packages/core-js/actual/set/difference.js new file mode 100644 index 000000000000..3e14a08feea1 --- /dev/null +++ b/packages/core-js/actual/set/difference.js @@ -0,0 +1,5 @@ +require('../../modules/es.set'); +require('../../modules/esnext.set.difference.v2'); +var entryUnbind = require('../../internals/entry-unbind'); + +module.exports = entryUnbind('Set', 'difference'); diff --git a/packages/core-js/actual/set/index.js b/packages/core-js/actual/set/index.js index 7962e69ec7a5..9375f8a75a9e 100644 --- a/packages/core-js/actual/set/index.js +++ b/packages/core-js/actual/set/index.js @@ -1,3 +1,10 @@ var parent = require('../../stable/set'); +require('../../modules/esnext.set.difference.v2'); +require('../../modules/esnext.set.intersection.v2'); +require('../../modules/esnext.set.is-disjoint-from.v2'); +require('../../modules/esnext.set.is-subset-of.v2'); +require('../../modules/esnext.set.is-superset-of.v2'); +require('../../modules/esnext.set.symmetric-difference.v2'); +require('../../modules/esnext.set.union.v2'); module.exports = parent; diff --git a/packages/core-js/actual/set/intersection.js b/packages/core-js/actual/set/intersection.js new file mode 100644 index 000000000000..fab4c10985ba --- /dev/null +++ b/packages/core-js/actual/set/intersection.js @@ -0,0 +1,5 @@ +require('../../modules/es.set'); +require('../../modules/esnext.set.intersection.v2'); +var entryUnbind = require('../../internals/entry-unbind'); + +module.exports = entryUnbind('Set', 'intersection'); diff --git a/packages/core-js/actual/set/is-disjoint-from.js b/packages/core-js/actual/set/is-disjoint-from.js new file mode 100644 index 000000000000..221643750bac --- /dev/null +++ b/packages/core-js/actual/set/is-disjoint-from.js @@ -0,0 +1,5 @@ +require('../../modules/es.set'); +require('../../modules/esnext.set.is-disjoint-from.v2'); +var entryUnbind = require('../../internals/entry-unbind'); + +module.exports = entryUnbind('Set', 'isDisjointFrom'); diff --git a/packages/core-js/actual/set/is-subset-of.js b/packages/core-js/actual/set/is-subset-of.js new file mode 100644 index 000000000000..60158c70eb6f --- /dev/null +++ b/packages/core-js/actual/set/is-subset-of.js @@ -0,0 +1,5 @@ +require('../../modules/es.set'); +require('../../modules/esnext.set.is-subset-of.v2'); +var entryUnbind = require('../../internals/entry-unbind'); + +module.exports = entryUnbind('Set', 'isSubsetOf'); diff --git a/packages/core-js/actual/set/is-superset-of.js b/packages/core-js/actual/set/is-superset-of.js new file mode 100644 index 000000000000..f72e03c6d5ab --- /dev/null +++ b/packages/core-js/actual/set/is-superset-of.js @@ -0,0 +1,5 @@ +require('../../modules/es.set'); +require('../../modules/esnext.set.is-superset-of.v2'); +var entryUnbind = require('../../internals/entry-unbind'); + +module.exports = entryUnbind('Set', 'isSupersetOf'); diff --git a/packages/core-js/actual/set/symmetric-difference.js b/packages/core-js/actual/set/symmetric-difference.js new file mode 100644 index 000000000000..875e334c6189 --- /dev/null +++ b/packages/core-js/actual/set/symmetric-difference.js @@ -0,0 +1,5 @@ +require('../../modules/es.set'); +require('../../modules/esnext.set.symmetric-difference.v2'); +var entryUnbind = require('../../internals/entry-unbind'); + +module.exports = entryUnbind('Set', 'symmetricDifference'); diff --git a/packages/core-js/actual/set/union.js b/packages/core-js/actual/set/union.js new file mode 100644 index 000000000000..aab1c0e122d0 --- /dev/null +++ b/packages/core-js/actual/set/union.js @@ -0,0 +1,5 @@ +require('../../modules/es.set'); +require('../../modules/esnext.set.union.v2'); +var entryUnbind = require('../../internals/entry-unbind'); + +module.exports = entryUnbind('Set', 'union'); diff --git a/packages/core-js/full/set/difference.js b/packages/core-js/full/set/difference.js index c48cab13b096..55e611ad2fdc 100644 --- a/packages/core-js/full/set/difference.js +++ b/packages/core-js/full/set/difference.js @@ -1,5 +1,5 @@ +require('../../actual/set/difference'); require('../../modules/es.array.iterator'); -require('../../modules/es.set'); require('../../modules/es.string.iterator'); require('../../modules/esnext.set.difference'); require('../../modules/web.dom-collections.iterator'); diff --git a/packages/core-js/full/set/intersection.js b/packages/core-js/full/set/intersection.js index cb6190806660..78a3181fadfa 100644 --- a/packages/core-js/full/set/intersection.js +++ b/packages/core-js/full/set/intersection.js @@ -1,5 +1,5 @@ +require('../../actual/set/difference'); require('../../modules/es.array.iterator'); -require('../../modules/es.set'); require('../../modules/es.string.iterator'); require('../../modules/esnext.set.intersection'); require('../../modules/web.dom-collections.iterator'); diff --git a/packages/core-js/full/set/is-disjoint-from.js b/packages/core-js/full/set/is-disjoint-from.js index 223fe94f1b1c..b017552ae07c 100644 --- a/packages/core-js/full/set/is-disjoint-from.js +++ b/packages/core-js/full/set/is-disjoint-from.js @@ -1,5 +1,5 @@ +require('../../actual/set/is-disjoint-from'); require('../../modules/es.array.iterator'); -require('../../modules/es.set'); require('../../modules/es.string.iterator'); require('../../modules/esnext.set.is-disjoint-from'); require('../../modules/web.dom-collections.iterator'); diff --git a/packages/core-js/full/set/is-subset-of.js b/packages/core-js/full/set/is-subset-of.js index 2e1d868edd8c..1b1c78c1a90c 100644 --- a/packages/core-js/full/set/is-subset-of.js +++ b/packages/core-js/full/set/is-subset-of.js @@ -1,5 +1,5 @@ +require('../../actual/set/is-subset-of'); require('../../modules/es.array.iterator'); -require('../../modules/es.set'); require('../../modules/es.string.iterator'); require('../../modules/esnext.set.is-subset-of'); require('../../modules/web.dom-collections.iterator'); diff --git a/packages/core-js/full/set/is-superset-of.js b/packages/core-js/full/set/is-superset-of.js index 008da15ab2cf..1ac816927093 100644 --- a/packages/core-js/full/set/is-superset-of.js +++ b/packages/core-js/full/set/is-superset-of.js @@ -1,5 +1,5 @@ +require('../../actual/set/is-superset-of'); require('../../modules/es.array.iterator'); -require('../../modules/es.set'); require('../../modules/es.string.iterator'); require('../../modules/esnext.set.is-superset-of'); require('../../modules/web.dom-collections.iterator'); diff --git a/packages/core-js/full/set/symmetric-difference.js b/packages/core-js/full/set/symmetric-difference.js index 33f08a2bedf0..1aebeb219a1d 100644 --- a/packages/core-js/full/set/symmetric-difference.js +++ b/packages/core-js/full/set/symmetric-difference.js @@ -1,5 +1,5 @@ +require('../../actual/set/symmetric-difference'); require('../../modules/es.array.iterator'); -require('../../modules/es.set'); require('../../modules/es.string.iterator'); require('../../modules/esnext.set.symmetric-difference'); require('../../modules/web.dom-collections.iterator'); diff --git a/packages/core-js/full/set/union.js b/packages/core-js/full/set/union.js index 7906cac70dc4..d88ed004ae9c 100644 --- a/packages/core-js/full/set/union.js +++ b/packages/core-js/full/set/union.js @@ -1,5 +1,5 @@ +require('../../actual/set/union'); require('../../modules/es.array.iterator'); -require('../../modules/es.set'); require('../../modules/es.string.iterator'); require('../../modules/esnext.set.union'); require('../../modules/web.dom-collections.iterator'); diff --git a/packages/core-js/modules/esnext.set.difference.js b/packages/core-js/modules/esnext.set.difference.js index 13853b5712ba..eaac4734c009 100644 --- a/packages/core-js/modules/esnext.set.difference.js +++ b/packages/core-js/modules/esnext.set.difference.js @@ -6,6 +6,7 @@ var $difference = require('../internals/set-difference'); // `Set.prototype.difference` method // https://github.com/tc39/proposal-set-methods +// TODO: Obsolete version, remove from `core-js@4` $({ target: 'Set', proto: true, real: true, forced: true }, { difference: function difference(iterable) { return call($difference, this, toSetLike(iterable)); diff --git a/packages/core-js/modules/esnext.set.difference.v2.js b/packages/core-js/modules/esnext.set.difference.v2.js new file mode 100644 index 000000000000..8a3e1029bad3 --- /dev/null +++ b/packages/core-js/modules/esnext.set.difference.v2.js @@ -0,0 +1,9 @@ +var $ = require('../internals/export'); +var IS_PURE = require('../internals/is-pure'); +var difference = require('../internals/set-difference'); + +// `Set.prototype.difference` method +// https://github.com/tc39/proposal-set-methods +$({ target: 'Set', proto: true, real: true, forced: IS_PURE }, { + difference: difference +}); diff --git a/packages/core-js/modules/esnext.set.intersection.js b/packages/core-js/modules/esnext.set.intersection.js index e62287b4bf9b..96fe676f7430 100644 --- a/packages/core-js/modules/esnext.set.intersection.js +++ b/packages/core-js/modules/esnext.set.intersection.js @@ -6,6 +6,7 @@ var $intersection = require('../internals/set-intersection'); // `Set.prototype.intersection` method // https://github.com/tc39/proposal-set-methods +// TODO: Obsolete version, remove from `core-js@4` $({ target: 'Set', proto: true, real: true, forced: true }, { intersection: function intersection(iterable) { return call($intersection, this, toSetLike(iterable)); diff --git a/packages/core-js/modules/esnext.set.intersection.v2.js b/packages/core-js/modules/esnext.set.intersection.v2.js new file mode 100644 index 000000000000..dde5795cb3d2 --- /dev/null +++ b/packages/core-js/modules/esnext.set.intersection.v2.js @@ -0,0 +1,9 @@ +var $ = require('../internals/export'); +var IS_PURE = require('../internals/is-pure'); +var intersection = require('../internals/set-intersection'); + +// `Set.prototype.intersection` method +// https://github.com/tc39/proposal-set-methods +$({ target: 'Set', proto: true, real: true, forced: IS_PURE }, { + intersection: intersection +}); diff --git a/packages/core-js/modules/esnext.set.is-disjoint-from.js b/packages/core-js/modules/esnext.set.is-disjoint-from.js index c3df7a5122f8..6e55fa83027b 100644 --- a/packages/core-js/modules/esnext.set.is-disjoint-from.js +++ b/packages/core-js/modules/esnext.set.is-disjoint-from.js @@ -6,6 +6,7 @@ var $isDisjointFrom = require('../internals/set-is-disjoint-from'); // `Set.prototype.isDisjointFrom` method // https://github.com/tc39/proposal-set-methods +// TODO: Obsolete version, remove from `core-js@4` $({ target: 'Set', proto: true, real: true, forced: true }, { isDisjointFrom: function isDisjointFrom(iterable) { return call($isDisjointFrom, this, toSetLike(iterable)); diff --git a/packages/core-js/modules/esnext.set.is-disjoint-from.v2.js b/packages/core-js/modules/esnext.set.is-disjoint-from.v2.js new file mode 100644 index 000000000000..1385aee1bd15 --- /dev/null +++ b/packages/core-js/modules/esnext.set.is-disjoint-from.v2.js @@ -0,0 +1,9 @@ +var $ = require('../internals/export'); +var IS_PURE = require('../internals/is-pure'); +var isDisjointFrom = require('../internals/set-is-disjoint-from'); + +// `Set.prototype.isDisjointFrom` method +// https://github.com/tc39/proposal-set-methods +$({ target: 'Set', proto: true, real: true, forced: IS_PURE }, { + isDisjointFrom: isDisjointFrom +}); diff --git a/packages/core-js/modules/esnext.set.is-subset-of.js b/packages/core-js/modules/esnext.set.is-subset-of.js index 8adcad41348e..d36bb4780c4f 100644 --- a/packages/core-js/modules/esnext.set.is-subset-of.js +++ b/packages/core-js/modules/esnext.set.is-subset-of.js @@ -6,6 +6,7 @@ var $isSubsetOf = require('../internals/set-is-subset-of'); // `Set.prototype.isSubsetOf` method // https://github.com/tc39/proposal-set-methods +// TODO: Obsolete version, remove from `core-js@4` $({ target: 'Set', proto: true, real: true, forced: true }, { isSubsetOf: function isSubsetOf(iterable) { return call($isSubsetOf, this, toSetLike(iterable)); diff --git a/packages/core-js/modules/esnext.set.is-subset-of.v2.js b/packages/core-js/modules/esnext.set.is-subset-of.v2.js new file mode 100644 index 000000000000..453414d5082a --- /dev/null +++ b/packages/core-js/modules/esnext.set.is-subset-of.v2.js @@ -0,0 +1,9 @@ +var $ = require('../internals/export'); +var IS_PURE = require('../internals/is-pure'); +var isSubsetOf = require('../internals/set-is-subset-of'); + +// `Set.prototype.isSubsetOf` method +// https://github.com/tc39/proposal-set-methods +$({ target: 'Set', proto: true, real: true, forced: IS_PURE }, { + isSubsetOf: isSubsetOf +}); diff --git a/packages/core-js/modules/esnext.set.is-superset-of.js b/packages/core-js/modules/esnext.set.is-superset-of.js index 306b762cc5d8..8faf8d3cf779 100644 --- a/packages/core-js/modules/esnext.set.is-superset-of.js +++ b/packages/core-js/modules/esnext.set.is-superset-of.js @@ -6,6 +6,7 @@ var $isSupersetOf = require('../internals/set-is-superset-of'); // `Set.prototype.isSupersetOf` method // https://github.com/tc39/proposal-set-methods +// TODO: Obsolete version, remove from `core-js@4` $({ target: 'Set', proto: true, real: true, forced: true }, { isSupersetOf: function isSupersetOf(iterable) { return call($isSupersetOf, this, toSetLike(iterable)); diff --git a/packages/core-js/modules/esnext.set.is-superset-of.v2.js b/packages/core-js/modules/esnext.set.is-superset-of.v2.js new file mode 100644 index 000000000000..ec6d951f71c2 --- /dev/null +++ b/packages/core-js/modules/esnext.set.is-superset-of.v2.js @@ -0,0 +1,9 @@ +var $ = require('../internals/export'); +var IS_PURE = require('../internals/is-pure'); +var isSupersetOf = require('../internals/set-is-superset-of'); + +// `Set.prototype.isSupersetOf` method +// https://github.com/tc39/proposal-set-methods +$({ target: 'Set', proto: true, real: true, forced: IS_PURE }, { + isSupersetOf: isSupersetOf +}); diff --git a/packages/core-js/modules/esnext.set.symmetric-difference.js b/packages/core-js/modules/esnext.set.symmetric-difference.js index 30b63c31d448..035d28695641 100644 --- a/packages/core-js/modules/esnext.set.symmetric-difference.js +++ b/packages/core-js/modules/esnext.set.symmetric-difference.js @@ -6,6 +6,7 @@ var $symmetricDifference = require('../internals/set-symmetric-difference'); // `Set.prototype.symmetricDifference` method // https://github.com/tc39/proposal-set-methods +// TODO: Obsolete version, remove from `core-js@4` $({ target: 'Set', proto: true, real: true, forced: true }, { symmetricDifference: function symmetricDifference(iterable) { return call($symmetricDifference, this, toSetLike(iterable)); diff --git a/packages/core-js/modules/esnext.set.symmetric-difference.v2.js b/packages/core-js/modules/esnext.set.symmetric-difference.v2.js new file mode 100644 index 000000000000..d394a82d1062 --- /dev/null +++ b/packages/core-js/modules/esnext.set.symmetric-difference.v2.js @@ -0,0 +1,9 @@ +var $ = require('../internals/export'); +var IS_PURE = require('../internals/is-pure'); +var symmetricDifference = require('../internals/set-symmetric-difference'); + +// `Set.prototype.symmetricDifference` method +// https://github.com/tc39/proposal-set-methods +$({ target: 'Set', proto: true, real: true, forced: IS_PURE }, { + symmetricDifference: symmetricDifference +}); diff --git a/packages/core-js/modules/esnext.set.union.js b/packages/core-js/modules/esnext.set.union.js index fed65735b9be..43aec2ae395a 100644 --- a/packages/core-js/modules/esnext.set.union.js +++ b/packages/core-js/modules/esnext.set.union.js @@ -6,6 +6,7 @@ var $union = require('../internals/set-union'); // `Set.prototype.union` method // https://github.com/tc39/proposal-set-methods +// TODO: Obsolete version, remove from `core-js@4` $({ target: 'Set', proto: true, real: true, forced: true }, { union: function union(iterable) { return call($union, this, toSetLike(iterable)); diff --git a/packages/core-js/modules/esnext.set.union.v2.js b/packages/core-js/modules/esnext.set.union.v2.js new file mode 100644 index 000000000000..b40307f85281 --- /dev/null +++ b/packages/core-js/modules/esnext.set.union.v2.js @@ -0,0 +1,9 @@ +var $ = require('../internals/export'); +var IS_PURE = require('../internals/is-pure'); +var union = require('../internals/set-union'); + +// `Set.prototype.union` method +// https://github.com/tc39/proposal-set-methods +$({ target: 'Set', proto: true, real: true, forced: IS_PURE }, { + union: union +}); diff --git a/packages/core-js/proposals/set-methods-v2.js b/packages/core-js/proposals/set-methods-v2.js new file mode 100644 index 000000000000..2b74dc284e91 --- /dev/null +++ b/packages/core-js/proposals/set-methods-v2.js @@ -0,0 +1,8 @@ +// https://github.com/tc39/proposal-set-methods +require('../modules/esnext.set.difference.v2'); +require('../modules/esnext.set.intersection.v2'); +require('../modules/esnext.set.is-disjoint-from.v2'); +require('../modules/esnext.set.is-subset-of.v2'); +require('../modules/esnext.set.is-superset-of.v2'); +require('../modules/esnext.set.union.v2'); +require('../modules/esnext.set.symmetric-difference.v2'); diff --git a/packages/core-js/proposals/set-methods.js b/packages/core-js/proposals/set-methods.js index e54fd30f8b4d..888a30c8a5aa 100644 --- a/packages/core-js/proposals/set-methods.js +++ b/packages/core-js/proposals/set-methods.js @@ -1,4 +1,12 @@ // https://github.com/tc39/proposal-set-methods +require('../modules/esnext.set.difference.v2'); +require('../modules/esnext.set.intersection.v2'); +require('../modules/esnext.set.is-disjoint-from.v2'); +require('../modules/esnext.set.is-subset-of.v2'); +require('../modules/esnext.set.is-superset-of.v2'); +require('../modules/esnext.set.union.v2'); +require('../modules/esnext.set.symmetric-difference.v2'); +// TODO: Obsolete versions, remove from `core-js@4` require('../modules/esnext.set.difference'); require('../modules/esnext.set.intersection'); require('../modules/esnext.set.is-disjoint-from'); diff --git a/packages/core-js/stage/3.js b/packages/core-js/stage/3.js index e5dc5cb7edd6..be4945b4e737 100644 --- a/packages/core-js/stage/3.js +++ b/packages/core-js/stage/3.js @@ -4,6 +4,7 @@ require('../proposals/array-from-async-stage-2'); require('../proposals/array-grouping-stage-3-2'); require('../proposals/change-array-by-copy'); require('../proposals/iterator-helpers-stage-3'); +require('../proposals/set-methods-v2'); require('../proposals/well-formed-unicode-strings'); // TODO: Obsolete versions, remove from `core-js@4` require('../proposals/array-grouping-stage-3'); diff --git a/tests/compat-data/tests-coverage.mjs b/tests/compat-data/tests-coverage.mjs index a32f1700b84e..9ba9e3779f64 100644 --- a/tests/compat-data/tests-coverage.mjs +++ b/tests/compat-data/tests-coverage.mjs @@ -43,6 +43,13 @@ const ignore = new Set([ 'esnext.reflect.has-metadata', 'esnext.reflect.has-own-metadata', 'esnext.reflect.metadata', + 'esnext.set.difference', + 'esnext.set.intersection', + 'esnext.set.is-disjoint-from', + 'esnext.set.is-subset-of', + 'esnext.set.is-superset-of', + 'esnext.set.symmetric-difference', + 'esnext.set.union', 'esnext.string.at', 'esnext.symbol.metadata', 'esnext.symbol.pattern-match', diff --git a/tests/compat/tests.js b/tests/compat/tests.js index 1b0f554320b1..8139caf39e31 100644 --- a/tests/compat/tests.js +++ b/tests/compat/tests.js @@ -1645,7 +1645,7 @@ GLOBAL.tests = { 'esnext.set.delete-all': function () { return Set.prototype.deleteAll; }, - 'esnext.set.difference': function () { + 'esnext.set.difference.v2': function () { return Set.prototype.difference; }, 'esnext.set.every': function () { @@ -1660,16 +1660,16 @@ GLOBAL.tests = { 'esnext.set.from': function () { return Set.from; }, - 'esnext.set.intersection': function () { + 'esnext.set.intersection.v2': function () { return Set.prototype.intersection; }, - 'esnext.set.is-disjoint-from': function () { + 'esnext.set.is-disjoint-from.v2': function () { return Set.prototype.isDisjointFrom; }, - 'esnext.set.is-subset-of': function () { + 'esnext.set.is-subset-of.v2': function () { return Set.prototype.isSubsetOf; }, - 'esnext.set.is-superset-of': function () { + 'esnext.set.is-superset-of.v2': function () { return Set.prototype.isSupersetOf; }, 'esnext.set.join': function () { @@ -1687,10 +1687,10 @@ GLOBAL.tests = { 'esnext.set.some': function () { return Set.prototype.some; }, - 'esnext.set.symmetric-difference': function () { + 'esnext.set.symmetric-difference.v2': function () { return Set.prototype.symmetricDifference; }, - 'esnext.set.union': function () { + 'esnext.set.union.v2': function () { return Set.prototype.union; }, 'esnext.string.code-points': function () { diff --git a/tests/entries/unit.mjs b/tests/entries/unit.mjs index 8d6bc657dbc7..663fb6e7a0bb 100644 --- a/tests/entries/unit.mjs +++ b/tests/entries/unit.mjs @@ -641,6 +641,13 @@ for (PATH of ['core-js-pure', 'core-js']) { ok(typeof load(NS, 'iterator/take') == 'function'); ok(typeof load(NS, 'iterator/to-array') == 'function'); ok(typeof load(NS, 'iterator/to-async') == 'function'); + 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]))); + ok(load(NS, 'set/is-subset-of')(new Set([1, 2, 3]), new Set([1, 2, 3, 4]))); + ok(load(NS, 'set/is-superset-of')(new Set([1, 2, 3, 4]), new Set([1, 2, 3]))); + ok(load(NS, 'set/symmetric-difference')(new Set([1, 2, 3]), new Set([3, 4, 5])).size === 4); + ok(load(NS, 'set/union')(new Set([1, 2, 3]), new Set([3, 4, 5])).size === 5); ok(load(NS, 'string/is-well-formed')('a')); ok(load(NS, 'string/virtual/is-well-formed').call('a')); ok(load(NS, 'string/to-well-formed')('a') === 'a'); @@ -784,22 +791,15 @@ for (PATH of ['core-js-pure', 'core-js']) { ok(load(NS, 'promise/try')(() => 42) instanceof load(NS, 'promise')); ok(load(NS, 'set/add-all')(new Set([1, 2, 3]), 4, 5).size === 5); ok(load(NS, 'set/delete-all')(new Set([1, 2, 3]), 4, 5) === false); - ok(load(NS, 'set/difference')(new Set([1, 2, 3]), [3, 4, 5]).size === 2); ok(load(NS, 'set/every')(new Set([1, 2, 3]), it => typeof it == 'number')); ok(load(NS, 'set/filter')(new Set([1, 2, 3]), it => it % 2).size === 2); ok(load(NS, 'set/find')(new Set([2, 3, 4]), it => it % 2) === 3); ok(load(NS, 'set/from')([1, 2, 3, 2, 1]) instanceof Set); - ok(load(NS, 'set/intersection')(new Set([1, 2, 3]), [1, 3, 4]).size === 2); - ok(load(NS, 'set/is-disjoint-from')(new Set([1, 2, 3]), [4, 5, 6])); - ok(load(NS, 'set/is-subset-of')(new Set([1, 2, 3]), [1, 2, 3, 4])); - ok(load(NS, 'set/is-superset-of')(new Set([1, 2, 3, 4]), [1, 2, 3])); ok(load(NS, 'set/join')(new Set([1, 2, 3])) === '1,2,3'); ok(load(NS, 'set/map')(new Set([1, 2, 3]), it => it % 2).size === 2); ok(load(NS, 'set/of')(1, 2, 3, 2, 1) instanceof Set); ok(load(NS, 'set/reduce')(new Set([1, 2, 3]), (it, v) => it + v) === 6); ok(load(NS, 'set/some')(new Set([1, 2, 3]), it => typeof it == 'number')); - ok(load(NS, 'set/symmetric-difference')(new Set([1, 2, 3]), [3, 4, 5]).size === 4); - ok(load(NS, 'set/union')(new Set([1, 2, 3]), [3, 4, 5]).size === 5); ok(load(NS, 'string/cooked')`a${ 1 }b` === 'a1b'); ok('next' in load(NS, 'string/code-points')('a')); ok('next' in load(NS, 'string/virtual/code-points').call('a')); @@ -903,6 +903,7 @@ for (PATH of ['core-js-pure', 'core-js']) { load('proposals/relative-indexing-method'); load('proposals/seeded-random'); load('proposals/set-methods'); + load('proposals/set-methods-v2'); load('proposals/string-at'); load('proposals/string-cooked'); load('proposals/string-code-points'); From 7a755ebff7d2dc288932bf27033788690618d62e Mon Sep 17 00:00:00 2001 From: Denis Pushkarev Date: Sat, 26 Nov 2022 03:36:45 +0700 Subject: [PATCH 04/11] add feature detection --- .../internals/set-method-accept-set-like.js | 3 +++ .../internals/set-method-accept-set-like.js | 27 +++++++++++++++++++ .../modules/esnext.set.difference.v2.js | 4 +-- .../modules/esnext.set.intersection.v2.js | 4 +-- .../modules/esnext.set.is-disjoint-from.v2.js | 4 +-- .../modules/esnext.set.is-subset-of.v2.js | 4 +-- .../modules/esnext.set.is-superset-of.v2.js | 4 +-- .../esnext.set.symmetric-difference.v2.js | 4 +-- .../core-js/modules/esnext.set.union.v2.js | 4 +-- 9 files changed, 44 insertions(+), 14 deletions(-) create mode 100644 packages/core-js-pure/override/internals/set-method-accept-set-like.js create mode 100644 packages/core-js/internals/set-method-accept-set-like.js diff --git a/packages/core-js-pure/override/internals/set-method-accept-set-like.js b/packages/core-js-pure/override/internals/set-method-accept-set-like.js new file mode 100644 index 000000000000..2bb3cbc5230d --- /dev/null +++ b/packages/core-js-pure/override/internals/set-method-accept-set-like.js @@ -0,0 +1,3 @@ +module.exports = function () { + return false; +}; diff --git a/packages/core-js/internals/set-method-accept-set-like.js b/packages/core-js/internals/set-method-accept-set-like.js new file mode 100644 index 000000000000..2bb07bd97335 --- /dev/null +++ b/packages/core-js/internals/set-method-accept-set-like.js @@ -0,0 +1,27 @@ +var getBuiltIn = require('../internals/get-built-in'); + +var createEmptySetLike = function () { + return { + size: 0, + has: function () { + return false; + }, + keys: function () { + return { + next: function () { + return { done: true }; + } + }; + } + }; +}; + +module.exports = function (name) { + try { + var Set = getBuiltIn('Set'); + new Set()[name](createEmptySetLike()); + return true; + } catch (error) { + return false; + } +}; diff --git a/packages/core-js/modules/esnext.set.difference.v2.js b/packages/core-js/modules/esnext.set.difference.v2.js index 8a3e1029bad3..db2f08572bd1 100644 --- a/packages/core-js/modules/esnext.set.difference.v2.js +++ b/packages/core-js/modules/esnext.set.difference.v2.js @@ -1,9 +1,9 @@ var $ = require('../internals/export'); -var IS_PURE = require('../internals/is-pure'); var difference = require('../internals/set-difference'); +var setMethodAcceptSetLike = require('../internals/set-method-accept-set-like'); // `Set.prototype.difference` method // https://github.com/tc39/proposal-set-methods -$({ target: 'Set', proto: true, real: true, forced: IS_PURE }, { +$({ target: 'Set', proto: true, real: true, forced: !setMethodAcceptSetLike('difference') }, { difference: difference }); diff --git a/packages/core-js/modules/esnext.set.intersection.v2.js b/packages/core-js/modules/esnext.set.intersection.v2.js index dde5795cb3d2..135acad786f2 100644 --- a/packages/core-js/modules/esnext.set.intersection.v2.js +++ b/packages/core-js/modules/esnext.set.intersection.v2.js @@ -1,9 +1,9 @@ var $ = require('../internals/export'); -var IS_PURE = require('../internals/is-pure'); var intersection = require('../internals/set-intersection'); +var setMethodAcceptSetLike = require('../internals/set-method-accept-set-like'); // `Set.prototype.intersection` method // https://github.com/tc39/proposal-set-methods -$({ target: 'Set', proto: true, real: true, forced: IS_PURE }, { +$({ target: 'Set', proto: true, real: true, forced: !setMethodAcceptSetLike('intersection') }, { intersection: intersection }); diff --git a/packages/core-js/modules/esnext.set.is-disjoint-from.v2.js b/packages/core-js/modules/esnext.set.is-disjoint-from.v2.js index 1385aee1bd15..e441af203033 100644 --- a/packages/core-js/modules/esnext.set.is-disjoint-from.v2.js +++ b/packages/core-js/modules/esnext.set.is-disjoint-from.v2.js @@ -1,9 +1,9 @@ var $ = require('../internals/export'); -var IS_PURE = require('../internals/is-pure'); var isDisjointFrom = require('../internals/set-is-disjoint-from'); +var setMethodAcceptSetLike = require('../internals/set-method-accept-set-like'); // `Set.prototype.isDisjointFrom` method // https://github.com/tc39/proposal-set-methods -$({ target: 'Set', proto: true, real: true, forced: IS_PURE }, { +$({ target: 'Set', proto: true, real: true, forced: !setMethodAcceptSetLike('isDisjointFrom') }, { isDisjointFrom: isDisjointFrom }); diff --git a/packages/core-js/modules/esnext.set.is-subset-of.v2.js b/packages/core-js/modules/esnext.set.is-subset-of.v2.js index 453414d5082a..a239a824a8e7 100644 --- a/packages/core-js/modules/esnext.set.is-subset-of.v2.js +++ b/packages/core-js/modules/esnext.set.is-subset-of.v2.js @@ -1,9 +1,9 @@ var $ = require('../internals/export'); -var IS_PURE = require('../internals/is-pure'); var isSubsetOf = require('../internals/set-is-subset-of'); +var setMethodAcceptSetLike = require('../internals/set-method-accept-set-like'); // `Set.prototype.isSubsetOf` method // https://github.com/tc39/proposal-set-methods -$({ target: 'Set', proto: true, real: true, forced: IS_PURE }, { +$({ target: 'Set', proto: true, real: true, forced: !setMethodAcceptSetLike('isSubsetOf') }, { isSubsetOf: isSubsetOf }); diff --git a/packages/core-js/modules/esnext.set.is-superset-of.v2.js b/packages/core-js/modules/esnext.set.is-superset-of.v2.js index ec6d951f71c2..8001ff620142 100644 --- a/packages/core-js/modules/esnext.set.is-superset-of.v2.js +++ b/packages/core-js/modules/esnext.set.is-superset-of.v2.js @@ -1,9 +1,9 @@ var $ = require('../internals/export'); -var IS_PURE = require('../internals/is-pure'); var isSupersetOf = require('../internals/set-is-superset-of'); +var setMethodAcceptSetLike = require('../internals/set-method-accept-set-like'); // `Set.prototype.isSupersetOf` method // https://github.com/tc39/proposal-set-methods -$({ target: 'Set', proto: true, real: true, forced: IS_PURE }, { +$({ target: 'Set', proto: true, real: true, forced: !setMethodAcceptSetLike('isSupersetOf') }, { isSupersetOf: isSupersetOf }); diff --git a/packages/core-js/modules/esnext.set.symmetric-difference.v2.js b/packages/core-js/modules/esnext.set.symmetric-difference.v2.js index d394a82d1062..fb4cb6d56c6d 100644 --- a/packages/core-js/modules/esnext.set.symmetric-difference.v2.js +++ b/packages/core-js/modules/esnext.set.symmetric-difference.v2.js @@ -1,9 +1,9 @@ var $ = require('../internals/export'); -var IS_PURE = require('../internals/is-pure'); var symmetricDifference = require('../internals/set-symmetric-difference'); +var setMethodAcceptSetLike = require('../internals/set-method-accept-set-like'); // `Set.prototype.symmetricDifference` method // https://github.com/tc39/proposal-set-methods -$({ target: 'Set', proto: true, real: true, forced: IS_PURE }, { +$({ target: 'Set', proto: true, real: true, forced: !setMethodAcceptSetLike('symmetricDifference') }, { symmetricDifference: symmetricDifference }); diff --git a/packages/core-js/modules/esnext.set.union.v2.js b/packages/core-js/modules/esnext.set.union.v2.js index b40307f85281..51abc7be9abf 100644 --- a/packages/core-js/modules/esnext.set.union.v2.js +++ b/packages/core-js/modules/esnext.set.union.v2.js @@ -1,9 +1,9 @@ var $ = require('../internals/export'); -var IS_PURE = require('../internals/is-pure'); var union = require('../internals/set-union'); +var setMethodAcceptSetLike = require('../internals/set-method-accept-set-like'); // `Set.prototype.union` method // https://github.com/tc39/proposal-set-methods -$({ target: 'Set', proto: true, real: true, forced: IS_PURE }, { +$({ target: 'Set', proto: true, real: true, forced: !setMethodAcceptSetLike('union') }, { union: union }); From 770f2ba0c8bf866741ef78439c8ffbd68fa775a1 Mon Sep 17 00:00:00 2001 From: Denis Pushkarev Date: Sat, 26 Nov 2022 04:37:47 +0700 Subject: [PATCH 05/11] add some tests --- tests/helpers/helpers.js | 12 ++++++++++++ tests/unit-global/esnext.set.difference.js | 10 ++++++++-- tests/unit-global/esnext.set.intersection.js | 10 ++++++++-- tests/unit-global/esnext.set.is-disjoint-from.js | 13 +++++++++++-- tests/unit-global/esnext.set.is-subset-of.js | 13 +++++++++++-- tests/unit-global/esnext.set.is-superset-of.js | 13 +++++++++++-- .../unit-global/esnext.set.symmetric-difference.js | 11 +++++++++-- tests/unit-global/esnext.set.union.js | 10 ++++++++-- tests/unit-pure/esnext.set.difference.js | 10 ++++++++-- tests/unit-pure/esnext.set.intersection.js | 10 ++++++++-- tests/unit-pure/esnext.set.is-disjoint-from.js | 13 +++++++++++-- tests/unit-pure/esnext.set.is-subset-of.js | 13 +++++++++++-- tests/unit-pure/esnext.set.is-superset-of.js | 13 +++++++++++-- tests/unit-pure/esnext.set.symmetric-difference.js | 11 +++++++++-- tests/unit-pure/esnext.set.union.js | 10 ++++++++-- 15 files changed, 144 insertions(+), 28 deletions(-) diff --git a/tests/helpers/helpers.js b/tests/helpers/helpers.js index c1847dc0bfe4..19077cf0941f 100644 --- a/tests/helpers/helpers.js +++ b/tests/helpers/helpers.js @@ -23,6 +23,18 @@ export function createIterator(elements, methods) { return iterator; } +export function createSetLike(elements) { + return { + size: elements.length, + has(it) { + return includes(elements, it); + }, + keys() { + return createIterator(elements); + }, + }; +} + export function createIterable(elements, methods) { const iterable = { called: false, diff --git a/tests/unit-global/esnext.set.difference.js b/tests/unit-global/esnext.set.difference.js index ea1a2092fc60..04ba9799b1f1 100644 --- a/tests/unit-global/esnext.set.difference.js +++ b/tests/unit-global/esnext.set.difference.js @@ -1,4 +1,4 @@ -import { createIterable } from '../helpers/helpers'; +import { createIterable, createSetLike } from '../helpers/helpers'; QUnit.test('Set#difference', assert => { const { difference } = Set.prototype; @@ -11,8 +11,14 @@ QUnit.test('Set#difference', assert => { assert.nonEnumerable(Set.prototype, 'difference'); const set = new Set([1]); - assert.notSame(set.difference([2]), set); + assert.notSame(set.difference(new Set()), set); + assert.deepEqual(from(new Set([1, 2, 3]).difference(new Set([4, 5]))), [1, 2, 3]); + assert.deepEqual(from(new Set([1, 2, 3]).difference(new Set([3, 4]))), [1, 2]); + assert.deepEqual(from(new Set([1, 2, 3]).difference(createSetLike([4, 5]))), [1, 2, 3]); + assert.deepEqual(from(new Set([1, 2, 3]).difference(createSetLike([3, 4]))), [1, 2]); + + // TODO: drop from core-js@4 assert.deepEqual(from(new Set([1, 2, 3]).difference([4, 5])), [1, 2, 3]); assert.deepEqual(from(new Set([1, 2, 3]).difference([3, 4])), [1, 2]); assert.deepEqual(from(new Set([1, 2, 3]).difference(createIterable([3, 4]))), [1, 2]); diff --git a/tests/unit-global/esnext.set.intersection.js b/tests/unit-global/esnext.set.intersection.js index a51c442ba484..3111adec2550 100644 --- a/tests/unit-global/esnext.set.intersection.js +++ b/tests/unit-global/esnext.set.intersection.js @@ -1,4 +1,4 @@ -import { createIterable } from '../helpers/helpers'; +import { createIterable, createSetLike } from '../helpers/helpers'; QUnit.test('Set#intersection', assert => { const { intersection } = Set.prototype; @@ -11,8 +11,14 @@ QUnit.test('Set#intersection', assert => { assert.nonEnumerable(Set.prototype, 'intersection'); const set = new Set([1]); - assert.notSame(set.intersection([2]), set); + assert.notSame(set.intersection(new Set()), set); + assert.deepEqual(from(new Set([1, 2, 3]).intersection(new Set([4, 5]))), []); + assert.deepEqual(from(new Set([1, 2, 3]).intersection(new Set([2, 3, 4]))), [2, 3]); + assert.deepEqual(from(new Set([1, 2, 3]).intersection(createSetLike([4, 5]))), []); + assert.deepEqual(from(new Set([1, 2, 3]).intersection(createSetLike([2, 3, 4]))), [2, 3]); + + // TODO: drop from core-js@4 assert.deepEqual(from(new Set([1, 2, 3]).intersection([4, 5])), []); assert.deepEqual(from(new Set([1, 2, 3]).intersection([2, 3, 4])), [2, 3]); assert.deepEqual(from(new Set([1, 2, 3]).intersection(createIterable([2, 3, 4]))), [2, 3]); diff --git a/tests/unit-global/esnext.set.is-disjoint-from.js b/tests/unit-global/esnext.set.is-disjoint-from.js index e66f9e540ab5..9f424b93f533 100644 --- a/tests/unit-global/esnext.set.is-disjoint-from.js +++ b/tests/unit-global/esnext.set.is-disjoint-from.js @@ -1,4 +1,4 @@ -import { createIterable } from '../helpers/helpers'; +import { createIterable, createSetLike } from '../helpers/helpers'; QUnit.test('Set#isDisjointFrom', assert => { const { isDisjointFrom } = Set.prototype; @@ -9,11 +9,20 @@ QUnit.test('Set#isDisjointFrom', assert => { assert.looksNative(isDisjointFrom); assert.nonEnumerable(Set.prototype, 'isDisjointFrom'); + assert.true(new Set([1]).isDisjointFrom(new Set([2]))); + assert.false(new Set([1]).isDisjointFrom(new Set([1]))); + assert.true(new Set([1, 2, 3]).isDisjointFrom(new Set([4, 5, 6]))); + assert.false(new Set([1, 2, 3]).isDisjointFrom(new Set([5, 4, 3]))); + assert.true(new Set([1]).isDisjointFrom(createSetLike([2]))); + assert.false(new Set([1]).isDisjointFrom(createSetLike([1]))); + assert.true(new Set([1, 2, 3]).isDisjointFrom(createSetLike([4, 5, 6]))); + assert.false(new Set([1, 2, 3]).isDisjointFrom(createSetLike([5, 4, 3]))); + + // TODO: drop from core-js@4 assert.true(new Set([1]).isDisjointFrom([2])); assert.false(new Set([1]).isDisjointFrom([1])); assert.true(new Set([1, 2, 3]).isDisjointFrom([4, 5, 6])); assert.false(new Set([1, 2, 3]).isDisjointFrom([5, 4, 3])); - assert.true(new Set([1]).isDisjointFrom(createIterable([2]))); assert.false(new Set([1]).isDisjointFrom(createIterable([1]))); diff --git a/tests/unit-global/esnext.set.is-subset-of.js b/tests/unit-global/esnext.set.is-subset-of.js index 1f749464e257..7840f6254a91 100644 --- a/tests/unit-global/esnext.set.is-subset-of.js +++ b/tests/unit-global/esnext.set.is-subset-of.js @@ -1,4 +1,4 @@ -import { createIterable } from '../helpers/helpers'; +import { createIterable, createSetLike } from '../helpers/helpers'; QUnit.test('Set#isSubsetOf', assert => { const { isSubsetOf } = Set.prototype; @@ -9,11 +9,20 @@ QUnit.test('Set#isSubsetOf', assert => { assert.looksNative(isSubsetOf); assert.nonEnumerable(Set.prototype, 'isSubsetOf'); + assert.true(new Set([1]).isSubsetOf(new Set([1, 2, 3]))); + assert.false(new Set([1]).isSubsetOf(new Set([2, 3, 4]))); + assert.true(new Set([1, 2, 3]).isSubsetOf(new Set([5, 4, 3, 2, 1]))); + assert.false(new Set([1, 2, 3]).isSubsetOf(new Set([5, 4, 3, 2]))); + assert.true(new Set([1]).isSubsetOf(createSetLike([1, 2, 3]))); + assert.false(new Set([1]).isSubsetOf(createSetLike([2, 3, 4]))); + assert.true(new Set([1, 2, 3]).isSubsetOf(createSetLike([5, 4, 3, 2, 1]))); + assert.false(new Set([1, 2, 3]).isSubsetOf(createSetLike([5, 4, 3, 2]))); + + // TODO: drop from core-js@4 assert.true(new Set([1]).isSubsetOf([1, 2, 3])); assert.false(new Set([1]).isSubsetOf([2, 3, 4])); assert.true(new Set([1, 2, 3]).isSubsetOf([5, 4, 3, 2, 1])); assert.false(new Set([1, 2, 3]).isSubsetOf([5, 4, 3, 2])); - assert.true(new Set([1]).isSubsetOf(createIterable([1, 2, 3]))); assert.false(new Set([1]).isSubsetOf(createIterable([2, 3, 4]))); diff --git a/tests/unit-global/esnext.set.is-superset-of.js b/tests/unit-global/esnext.set.is-superset-of.js index 6f47472d95e8..8e61482bb41e 100644 --- a/tests/unit-global/esnext.set.is-superset-of.js +++ b/tests/unit-global/esnext.set.is-superset-of.js @@ -1,4 +1,4 @@ -import { createIterable } from '../helpers/helpers'; +import { createIterable, createSetLike } from '../helpers/helpers'; QUnit.test('Set#isSupersetOf', assert => { const { isSupersetOf } = Set.prototype; @@ -9,11 +9,20 @@ QUnit.test('Set#isSupersetOf', assert => { assert.looksNative(isSupersetOf); assert.nonEnumerable(Set.prototype, 'isSupersetOf'); + assert.true(new Set([1, 2, 3]).isSupersetOf(new Set([1]))); + assert.false(new Set([2, 3, 4]).isSupersetOf(new Set([1]))); + assert.true(new Set([5, 4, 3, 2, 1]).isSupersetOf(new Set([1, 2, 3]))); + assert.false(new Set([5, 4, 3, 2]).isSupersetOf(new Set([1, 2, 3]))); + assert.true(new Set([1, 2, 3]).isSupersetOf(createSetLike([1]))); + assert.false(new Set([2, 3, 4]).isSupersetOf(createSetLike([1]))); + assert.true(new Set([5, 4, 3, 2, 1]).isSupersetOf(createSetLike([1, 2, 3]))); + assert.false(new Set([5, 4, 3, 2]).isSupersetOf(createSetLike([1, 2, 3]))); + + // TODO: drop from core-js@4 assert.true(new Set([1, 2, 3]).isSupersetOf([1])); assert.false(new Set([2, 3, 4]).isSupersetOf([1])); assert.true(new Set([5, 4, 3, 2, 1]).isSupersetOf([1, 2, 3])); assert.false(new Set([5, 4, 3, 2]).isSupersetOf([1, 2, 3])); - assert.true(new Set([1, 2, 3]).isSupersetOf(createIterable([1]))); assert.false(new Set([2, 3, 4]).isSupersetOf(createIterable([1]))); diff --git a/tests/unit-global/esnext.set.symmetric-difference.js b/tests/unit-global/esnext.set.symmetric-difference.js index b6e9a668c923..cb73e76d74a2 100644 --- a/tests/unit-global/esnext.set.symmetric-difference.js +++ b/tests/unit-global/esnext.set.symmetric-difference.js @@ -1,4 +1,4 @@ -import { createIterable } from '../helpers/helpers'; +import { createIterable, createSetLike } from '../helpers/helpers'; QUnit.test('Set#symmetricDifference', assert => { const { symmetricDifference } = Set.prototype; @@ -11,10 +11,17 @@ QUnit.test('Set#symmetricDifference', assert => { assert.nonEnumerable(Set.prototype, 'symmetricDifference'); const set = new Set([1]); - assert.notSame(set.symmetricDifference([2]), set); + assert.notSame(set.symmetricDifference(new Set()), set); + assert.deepEqual(from(new Set([1, 2, 3]).symmetricDifference(new Set([4, 5]))), [1, 2, 3, 4, 5]); + assert.deepEqual(from(new Set([1, 2, 3]).symmetricDifference(new Set([3, 4]))), [1, 2, 4]); + assert.deepEqual(from(new Set([1, 2, 3]).symmetricDifference(createSetLike([4, 5]))), [1, 2, 3, 4, 5]); + assert.deepEqual(from(new Set([1, 2, 3]).symmetricDifference(createSetLike([3, 4]))), [1, 2, 4]); + + // TODO: drop from core-js@4 assert.deepEqual(from(new Set([1, 2, 3]).symmetricDifference([4, 5])), [1, 2, 3, 4, 5]); assert.deepEqual(from(new Set([1, 2, 3]).symmetricDifference([3, 4])), [1, 2, 4]); + assert.deepEqual(from(new Set([1, 2, 3]).symmetricDifference(createIterable([4, 5]))), [1, 2, 3, 4, 5]); assert.deepEqual(from(new Set([1, 2, 3]).symmetricDifference(createIterable([3, 4]))), [1, 2, 4]); assert.throws(() => new Set([1, 2, 3]).symmetricDifference(), TypeError); diff --git a/tests/unit-global/esnext.set.union.js b/tests/unit-global/esnext.set.union.js index d11792992750..5087c3fc8988 100644 --- a/tests/unit-global/esnext.set.union.js +++ b/tests/unit-global/esnext.set.union.js @@ -1,4 +1,4 @@ -import { createIterable } from '../helpers/helpers'; +import { createIterable, createSetLike } from '../helpers/helpers'; QUnit.test('Set#union', assert => { const { union } = Set.prototype; @@ -11,8 +11,14 @@ QUnit.test('Set#union', assert => { assert.nonEnumerable(Set.prototype, 'union'); const set = new Set([1]); - assert.notSame(set.union([2]), set); + assert.notSame(set.union(new Set()), set); + assert.deepEqual(from(new Set([1, 2, 3]).union(new Set([4, 5]))), [1, 2, 3, 4, 5]); + assert.deepEqual(from(new Set([1, 2, 3]).union(new Set([3, 4]))), [1, 2, 3, 4]); + assert.deepEqual(from(new Set([1, 2, 3]).union(createSetLike([4, 5]))), [1, 2, 3, 4, 5]); + assert.deepEqual(from(new Set([1, 2, 3]).union(createSetLike([3, 4]))), [1, 2, 3, 4]); + + // TODO: drop from core-js@4 assert.deepEqual(from(new Set([1, 2, 3]).union([4, 5])), [1, 2, 3, 4, 5]); assert.deepEqual(from(new Set([1, 2, 3]).union([3, 4])), [1, 2, 3, 4]); assert.deepEqual(from(new Set([1, 2, 3]).union(createIterable([3, 4]))), [1, 2, 3, 4]); diff --git a/tests/unit-pure/esnext.set.difference.js b/tests/unit-pure/esnext.set.difference.js index d9a00373c57a..885dd0007b74 100644 --- a/tests/unit-pure/esnext.set.difference.js +++ b/tests/unit-pure/esnext.set.difference.js @@ -1,4 +1,4 @@ -import { createIterable } from '../helpers/helpers'; +import { createIterable, createSetLike } from '../helpers/helpers'; import from from 'core-js-pure/es/array/from'; import Set from 'core-js-pure/full/set'; @@ -12,8 +12,14 @@ QUnit.test('Set#difference', assert => { assert.nonEnumerable(Set.prototype, 'difference'); const set = new Set([1]); - assert.notSame(set.difference([2]), set); + assert.notSame(set.difference(new Set()), set); + assert.deepEqual(from(new Set([1, 2, 3]).difference(new Set([4, 5]))), [1, 2, 3]); + assert.deepEqual(from(new Set([1, 2, 3]).difference(new Set([3, 4]))), [1, 2]); + assert.deepEqual(from(new Set([1, 2, 3]).difference(createSetLike([3, 4]))), [1, 2]); + assert.deepEqual(from(new Set([1, 2, 3]).difference(createSetLike([3, 4]))), [1, 2]); + + // TODO: drop from core-js@4 assert.deepEqual(from(new Set([1, 2, 3]).difference([4, 5])), [1, 2, 3]); assert.deepEqual(from(new Set([1, 2, 3]).difference([3, 4])), [1, 2]); assert.deepEqual(from(new Set([1, 2, 3]).difference(createIterable([3, 4]))), [1, 2]); diff --git a/tests/unit-pure/esnext.set.intersection.js b/tests/unit-pure/esnext.set.intersection.js index dcbd7f44e594..d2798cce7740 100644 --- a/tests/unit-pure/esnext.set.intersection.js +++ b/tests/unit-pure/esnext.set.intersection.js @@ -1,4 +1,4 @@ -import { createIterable } from '../helpers/helpers'; +import { createIterable, createSetLike } from '../helpers/helpers'; import from from 'core-js-pure/es/array/from'; import Set from 'core-js-pure/full/set'; @@ -12,8 +12,14 @@ QUnit.test('Set#intersection', assert => { assert.nonEnumerable(Set.prototype, 'intersection'); const set = new Set([1]); - assert.notSame(set.intersection([2]), set); + assert.notSame(set.intersection(new Set()), set); + assert.deepEqual(from(new Set([1, 2, 3]).intersection(new Set([4, 5]))), []); + assert.deepEqual(from(new Set([1, 2, 3]).intersection(new Set([2, 3, 4]))), [2, 3]); + assert.deepEqual(from(new Set([1, 2, 3]).intersection(createSetLike([4, 5]))), []); + assert.deepEqual(from(new Set([1, 2, 3]).intersection(createSetLike([2, 3, 4]))), [2, 3]); + + // TODO: drop from core-js@4 assert.deepEqual(from(new Set([1, 2, 3]).intersection([4, 5])), []); assert.deepEqual(from(new Set([1, 2, 3]).intersection([2, 3, 4])), [2, 3]); assert.deepEqual(from(new Set([1, 2, 3]).intersection(createIterable([2, 3, 4]))), [2, 3]); diff --git a/tests/unit-pure/esnext.set.is-disjoint-from.js b/tests/unit-pure/esnext.set.is-disjoint-from.js index f2c2c5550477..f18f3502cc0d 100644 --- a/tests/unit-pure/esnext.set.is-disjoint-from.js +++ b/tests/unit-pure/esnext.set.is-disjoint-from.js @@ -1,4 +1,4 @@ -import { createIterable } from '../helpers/helpers'; +import { createIterable, createSetLike } from '../helpers/helpers'; import Set from 'core-js-pure/full/set'; @@ -10,11 +10,20 @@ QUnit.test('Set#isDisjointFrom', assert => { assert.name(isDisjointFrom, 'isDisjointFrom'); assert.nonEnumerable(Set.prototype, 'isDisjointFrom'); + assert.true(new Set([1]).isDisjointFrom(new Set([2]))); + assert.false(new Set([1]).isDisjointFrom(new Set([1]))); + assert.true(new Set([1, 2, 3]).isDisjointFrom(new Set([4, 5, 6]))); + assert.false(new Set([1, 2, 3]).isDisjointFrom(new Set([5, 4, 3]))); + assert.true(new Set([1]).isDisjointFrom(createSetLike([2]))); + assert.false(new Set([1]).isDisjointFrom(createSetLike([1]))); + assert.true(new Set([1, 2, 3]).isDisjointFrom(createSetLike([4, 5, 6]))); + assert.false(new Set([1, 2, 3]).isDisjointFrom(createSetLike([5, 4, 3]))); + + // TODO: drop from core-js@4 assert.true(new Set([1]).isDisjointFrom([2])); assert.false(new Set([1]).isDisjointFrom([1])); assert.true(new Set([1, 2, 3]).isDisjointFrom([4, 5, 6])); assert.false(new Set([1, 2, 3]).isDisjointFrom([5, 4, 3])); - assert.true(new Set([1]).isDisjointFrom(createIterable([2]))); assert.false(new Set([1]).isDisjointFrom(createIterable([1]))); diff --git a/tests/unit-pure/esnext.set.is-subset-of.js b/tests/unit-pure/esnext.set.is-subset-of.js index ba0b0a998e76..e78a00dc3968 100644 --- a/tests/unit-pure/esnext.set.is-subset-of.js +++ b/tests/unit-pure/esnext.set.is-subset-of.js @@ -1,4 +1,4 @@ -import { createIterable } from '../helpers/helpers'; +import { createIterable, createSetLike } from '../helpers/helpers'; import Set from 'core-js-pure/full/set'; @@ -10,11 +10,20 @@ QUnit.test('Set#isSubsetOf', assert => { assert.name(isSubsetOf, 'isSubsetOf'); assert.nonEnumerable(Set.prototype, 'isSubsetOf'); + assert.true(new Set([1]).isSubsetOf(new Set([1, 2, 3]))); + assert.false(new Set([1]).isSubsetOf(new Set([2, 3, 4]))); + assert.true(new Set([1, 2, 3]).isSubsetOf(new Set([5, 4, 3, 2, 1]))); + assert.false(new Set([1, 2, 3]).isSubsetOf(new Set([5, 4, 3, 2]))); + assert.true(new Set([1]).isSubsetOf(createSetLike([1, 2, 3]))); + assert.false(new Set([1]).isSubsetOf(createSetLike([2, 3, 4]))); + assert.true(new Set([1, 2, 3]).isSubsetOf(createSetLike([5, 4, 3, 2, 1]))); + assert.false(new Set([1, 2, 3]).isSubsetOf(createSetLike([5, 4, 3, 2]))); + + // TODO: drop from core-js@4 assert.true(new Set([1]).isSubsetOf([1, 2, 3])); assert.false(new Set([1]).isSubsetOf([2, 3, 4])); assert.true(new Set([1, 2, 3]).isSubsetOf([5, 4, 3, 2, 1])); assert.false(new Set([1, 2, 3]).isSubsetOf([5, 4, 3, 2])); - assert.true(new Set([1]).isSubsetOf(createIterable([1, 2, 3]))); assert.false(new Set([1]).isSubsetOf(createIterable([2, 3, 4]))); diff --git a/tests/unit-pure/esnext.set.is-superset-of.js b/tests/unit-pure/esnext.set.is-superset-of.js index d822adbc70b9..a6562e922a3b 100644 --- a/tests/unit-pure/esnext.set.is-superset-of.js +++ b/tests/unit-pure/esnext.set.is-superset-of.js @@ -1,4 +1,4 @@ -import { createIterable } from '../helpers/helpers'; +import { createIterable, createSetLike } from '../helpers/helpers'; import Set from 'core-js-pure/full/set'; @@ -10,11 +10,20 @@ QUnit.test('Set#isSupersetOf', assert => { assert.name(isSupersetOf, 'isSupersetOf'); assert.nonEnumerable(Set.prototype, 'isSupersetOf'); + assert.true(new Set([1, 2, 3]).isSupersetOf(new Set([1]))); + assert.false(new Set([2, 3, 4]).isSupersetOf(new Set([1]))); + assert.true(new Set([5, 4, 3, 2, 1]).isSupersetOf(new Set([1, 2, 3]))); + assert.false(new Set([5, 4, 3, 2]).isSupersetOf(new Set([1, 2, 3]))); + assert.true(new Set([1, 2, 3]).isSupersetOf(createSetLike([1]))); + assert.false(new Set([2, 3, 4]).isSupersetOf(createSetLike([1]))); + assert.true(new Set([5, 4, 3, 2, 1]).isSupersetOf(createSetLike([1, 2, 3]))); + assert.false(new Set([5, 4, 3, 2]).isSupersetOf(createSetLike([1, 2, 3]))); + + // TODO: drop from core-js@4 assert.true(new Set([1, 2, 3]).isSupersetOf([1])); assert.false(new Set([2, 3, 4]).isSupersetOf([1])); assert.true(new Set([5, 4, 3, 2, 1]).isSupersetOf([1, 2, 3])); assert.false(new Set([5, 4, 3, 2]).isSupersetOf([1, 2, 3])); - assert.true(new Set([1, 2, 3]).isSupersetOf(createIterable([1]))); assert.false(new Set([2, 3, 4]).isSupersetOf(createIterable([1]))); diff --git a/tests/unit-pure/esnext.set.symmetric-difference.js b/tests/unit-pure/esnext.set.symmetric-difference.js index 048b2159a5ba..981024261dae 100644 --- a/tests/unit-pure/esnext.set.symmetric-difference.js +++ b/tests/unit-pure/esnext.set.symmetric-difference.js @@ -1,4 +1,4 @@ -import { createIterable } from '../helpers/helpers'; +import { createIterable, createSetLike } from '../helpers/helpers'; import from from 'core-js-pure/es/array/from'; import Set from 'core-js-pure/full/set'; @@ -12,10 +12,17 @@ QUnit.test('Set#symmetricDifference', assert => { assert.nonEnumerable(Set.prototype, 'symmetricDifference'); const set = new Set([1]); - assert.notSame(set.symmetricDifference([2]), set); + assert.notSame(set.symmetricDifference(new Set()), set); + assert.deepEqual(from(new Set([1, 2, 3]).symmetricDifference(new Set([4, 5]))), [1, 2, 3, 4, 5]); + assert.deepEqual(from(new Set([1, 2, 3]).symmetricDifference(new Set([3, 4]))), [1, 2, 4]); + assert.deepEqual(from(new Set([1, 2, 3]).symmetricDifference(createSetLike([4, 5]))), [1, 2, 3, 4, 5]); + assert.deepEqual(from(new Set([1, 2, 3]).symmetricDifference(createSetLike([3, 4]))), [1, 2, 4]); + + // TODO: drop from core-js@4 assert.deepEqual(from(new Set([1, 2, 3]).symmetricDifference([4, 5])), [1, 2, 3, 4, 5]); assert.deepEqual(from(new Set([1, 2, 3]).symmetricDifference([3, 4])), [1, 2, 4]); + assert.deepEqual(from(new Set([1, 2, 3]).symmetricDifference(createIterable([4, 5]))), [1, 2, 3, 4, 5]); assert.deepEqual(from(new Set([1, 2, 3]).symmetricDifference(createIterable([3, 4]))), [1, 2, 4]); assert.throws(() => new Set([1, 2, 3]).symmetricDifference(), TypeError); diff --git a/tests/unit-pure/esnext.set.union.js b/tests/unit-pure/esnext.set.union.js index 6887f20a9415..5f2f6fccfd49 100644 --- a/tests/unit-pure/esnext.set.union.js +++ b/tests/unit-pure/esnext.set.union.js @@ -1,4 +1,4 @@ -import { createIterable } from '../helpers/helpers'; +import { createIterable, createSetLike } from '../helpers/helpers'; import from from 'core-js-pure/es/array/from'; import Set from 'core-js-pure/full/set'; @@ -12,8 +12,14 @@ QUnit.test('Set#union', assert => { assert.nonEnumerable(Set.prototype, 'union'); const set = new Set([1]); - assert.notSame(set.union([2]), set); + assert.notSame(set.union(new Set()), set); + assert.deepEqual(from(new Set([1, 2, 3]).union(new Set([4, 5]))), [1, 2, 3, 4, 5]); + assert.deepEqual(from(new Set([1, 2, 3]).union(new Set([3, 4]))), [1, 2, 3, 4]); + assert.deepEqual(from(new Set([1, 2, 3]).union(createSetLike([4, 5]))), [1, 2, 3, 4, 5]); + assert.deepEqual(from(new Set([1, 2, 3]).union(createSetLike([3, 4]))), [1, 2, 3, 4]); + + // TODO: drop from core-js@4 assert.deepEqual(from(new Set([1, 2, 3]).union([4, 5])), [1, 2, 3, 4, 5]); assert.deepEqual(from(new Set([1, 2, 3]).union([3, 4])), [1, 2, 3, 4]); assert.deepEqual(from(new Set([1, 2, 3]).union(createIterable([3, 4]))), [1, 2, 3, 4]); From 648f23260d9fc5ff53c0f8be9fcc0b5a9531eb62 Mon Sep 17 00:00:00 2001 From: Denis Pushkarev Date: Sat, 26 Nov 2022 07:02:39 +0700 Subject: [PATCH 06/11] update docs --- CHANGELOG.md | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 436a67e3707c..128cc12d5f45 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -41,6 +41,23 @@ - `String.prototype.toWellFormed` - Moved to Stage 3, [November 2022 TC39 meeting](https://github.com/babel/proposals/issues/85#issuecomment-1332180862) - Added `/actual/` entries, disabled unconditional forced replacement +- [`Set` methods proposal](https://github.com/tc39/proposal-set-methods): + - Methods: + - `Set.prototype.intersection` + - `Set.prototype.union` + - `Set.prototype.difference` + - `Set.prototype.symmetricDifference` + - `Set.prototype.isSubsetOf` + - `Set.prototype.isSupersetOf` + - `Set.prototype.isDisjointFrom` + - Moved to Stage 3, [November 2022 TC39 meeting](https://github.com/babel/proposals/issues/85#issuecomment-1332175557) + - Reimplemented with [new semantics](https://tc39.es/proposal-set-methods/): + - Optimized performance (iteration over lowest set) + - Accepted only `Set`-like objects as an argument, not all iterables + - Accepted only `Set`s as `this`, no `@@species` support, and other minor changes + - For avoiding breaking changes: + - New versions of methods are implemented as new modules and available in new entries or entries where old versions of methods were not available before (like `/actual/` namespace) + - In entries where they were available before (like `/full/` namespace), those methods are available with fallbacks to old semantics (in addition to `Set`-like, they accept iterable objects). This behavior will be removed from the next major release - [Compat data targets](/packages/core-js-compat#targets-option) improvements: - [React Native from 0.70 shipped with Hermes as the default engine.](https://reactnative.dev/blog/2022/07/08/hermes-as-the-default) However, bundled Hermes versions differ from standalone Hermes releases. So added **`react-native`** target for React Native with bundled Hermes. - [According to the documentation](https://developer.oculus.com/documentation/web/browser-intro/), Oculus Browser was renamed to Meta Quest Browser, so `oculus` target was renamed to **`quest`**. From c8fe54a0b096227756f54a9fa96b4a4e4281ebf4 Mon Sep 17 00:00:00 2001 From: Denis Pushkarev Date: Thu, 1 Dec 2022 04:25:56 +0700 Subject: [PATCH 07/11] add a note --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 128cc12d5f45..abaa8232a5dc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -55,6 +55,7 @@ - Optimized performance (iteration over lowest set) - Accepted only `Set`-like objects as an argument, not all iterables - Accepted only `Set`s as `this`, no `@@species` support, and other minor changes + - Added `/actual/` entries, unconditional forced replacement changed to feature detection - For avoiding breaking changes: - New versions of methods are implemented as new modules and available in new entries or entries where old versions of methods were not available before (like `/actual/` namespace) - In entries where they were available before (like `/full/` namespace), those methods are available with fallbacks to old semantics (in addition to `Set`-like, they accept iterable objects). This behavior will be removed from the next major release From 0a7e12d2db84e6a869b46ffeaa59acc0d91c2802 Mon Sep 17 00:00:00 2001 From: Denis Pushkarev Date: Thu, 1 Dec 2022 07:20:11 +0700 Subject: [PATCH 08/11] fix import --- packages/core-js/full/set/intersection.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/core-js/full/set/intersection.js b/packages/core-js/full/set/intersection.js index 78a3181fadfa..d2586c60bdcc 100644 --- a/packages/core-js/full/set/intersection.js +++ b/packages/core-js/full/set/intersection.js @@ -1,4 +1,4 @@ -require('../../actual/set/difference'); +require('../../actual/set/intersection'); require('../../modules/es.array.iterator'); require('../../modules/es.string.iterator'); require('../../modules/esnext.set.intersection'); From 4f6ded31a4c5b08309da572f503481ae3444eec3 Mon Sep 17 00:00:00 2001 From: Denis Pushkarev Date: Sat, 3 Dec 2022 03:51:15 +0700 Subject: [PATCH 09/11] rename arguments --- packages/core-js/modules/esnext.set.difference.js | 4 ++-- packages/core-js/modules/esnext.set.intersection.js | 4 ++-- packages/core-js/modules/esnext.set.is-disjoint-from.js | 4 ++-- packages/core-js/modules/esnext.set.is-subset-of.js | 4 ++-- packages/core-js/modules/esnext.set.is-superset-of.js | 4 ++-- packages/core-js/modules/esnext.set.symmetric-difference.js | 4 ++-- packages/core-js/modules/esnext.set.union.js | 4 ++-- 7 files changed, 14 insertions(+), 14 deletions(-) diff --git a/packages/core-js/modules/esnext.set.difference.js b/packages/core-js/modules/esnext.set.difference.js index eaac4734c009..d2a400883292 100644 --- a/packages/core-js/modules/esnext.set.difference.js +++ b/packages/core-js/modules/esnext.set.difference.js @@ -8,7 +8,7 @@ var $difference = require('../internals/set-difference'); // https://github.com/tc39/proposal-set-methods // TODO: Obsolete version, remove from `core-js@4` $({ target: 'Set', proto: true, real: true, forced: true }, { - difference: function difference(iterable) { - return call($difference, this, toSetLike(iterable)); + difference: function difference(other) { + return call($difference, this, toSetLike(other)); } }); diff --git a/packages/core-js/modules/esnext.set.intersection.js b/packages/core-js/modules/esnext.set.intersection.js index 96fe676f7430..fed2c4380543 100644 --- a/packages/core-js/modules/esnext.set.intersection.js +++ b/packages/core-js/modules/esnext.set.intersection.js @@ -8,7 +8,7 @@ var $intersection = require('../internals/set-intersection'); // https://github.com/tc39/proposal-set-methods // TODO: Obsolete version, remove from `core-js@4` $({ target: 'Set', proto: true, real: true, forced: true }, { - intersection: function intersection(iterable) { - return call($intersection, this, toSetLike(iterable)); + intersection: function intersection(other) { + return call($intersection, this, toSetLike(other)); } }); diff --git a/packages/core-js/modules/esnext.set.is-disjoint-from.js b/packages/core-js/modules/esnext.set.is-disjoint-from.js index 6e55fa83027b..bec2b235e0bc 100644 --- a/packages/core-js/modules/esnext.set.is-disjoint-from.js +++ b/packages/core-js/modules/esnext.set.is-disjoint-from.js @@ -8,7 +8,7 @@ var $isDisjointFrom = require('../internals/set-is-disjoint-from'); // https://github.com/tc39/proposal-set-methods // TODO: Obsolete version, remove from `core-js@4` $({ target: 'Set', proto: true, real: true, forced: true }, { - isDisjointFrom: function isDisjointFrom(iterable) { - return call($isDisjointFrom, this, toSetLike(iterable)); + isDisjointFrom: function isDisjointFrom(other) { + return call($isDisjointFrom, this, toSetLike(other)); } }); diff --git a/packages/core-js/modules/esnext.set.is-subset-of.js b/packages/core-js/modules/esnext.set.is-subset-of.js index d36bb4780c4f..7b30e93501af 100644 --- a/packages/core-js/modules/esnext.set.is-subset-of.js +++ b/packages/core-js/modules/esnext.set.is-subset-of.js @@ -8,7 +8,7 @@ var $isSubsetOf = require('../internals/set-is-subset-of'); // https://github.com/tc39/proposal-set-methods // TODO: Obsolete version, remove from `core-js@4` $({ target: 'Set', proto: true, real: true, forced: true }, { - isSubsetOf: function isSubsetOf(iterable) { - return call($isSubsetOf, this, toSetLike(iterable)); + isSubsetOf: function isSubsetOf(other) { + return call($isSubsetOf, this, toSetLike(other)); } }); diff --git a/packages/core-js/modules/esnext.set.is-superset-of.js b/packages/core-js/modules/esnext.set.is-superset-of.js index 8faf8d3cf779..432508534e8c 100644 --- a/packages/core-js/modules/esnext.set.is-superset-of.js +++ b/packages/core-js/modules/esnext.set.is-superset-of.js @@ -8,7 +8,7 @@ var $isSupersetOf = require('../internals/set-is-superset-of'); // https://github.com/tc39/proposal-set-methods // TODO: Obsolete version, remove from `core-js@4` $({ target: 'Set', proto: true, real: true, forced: true }, { - isSupersetOf: function isSupersetOf(iterable) { - return call($isSupersetOf, this, toSetLike(iterable)); + isSupersetOf: function isSupersetOf(other) { + return call($isSupersetOf, this, toSetLike(other)); } }); diff --git a/packages/core-js/modules/esnext.set.symmetric-difference.js b/packages/core-js/modules/esnext.set.symmetric-difference.js index 035d28695641..fa697f02df3b 100644 --- a/packages/core-js/modules/esnext.set.symmetric-difference.js +++ b/packages/core-js/modules/esnext.set.symmetric-difference.js @@ -8,7 +8,7 @@ var $symmetricDifference = require('../internals/set-symmetric-difference'); // https://github.com/tc39/proposal-set-methods // TODO: Obsolete version, remove from `core-js@4` $({ target: 'Set', proto: true, real: true, forced: true }, { - symmetricDifference: function symmetricDifference(iterable) { - return call($symmetricDifference, this, toSetLike(iterable)); + symmetricDifference: function symmetricDifference(other) { + return call($symmetricDifference, this, toSetLike(other)); } }); diff --git a/packages/core-js/modules/esnext.set.union.js b/packages/core-js/modules/esnext.set.union.js index 43aec2ae395a..0ff06962564d 100644 --- a/packages/core-js/modules/esnext.set.union.js +++ b/packages/core-js/modules/esnext.set.union.js @@ -8,7 +8,7 @@ var $union = require('../internals/set-union'); // https://github.com/tc39/proposal-set-methods // TODO: Obsolete version, remove from `core-js@4` $({ target: 'Set', proto: true, real: true, forced: true }, { - union: function union(iterable) { - return call($union, this, toSetLike(iterable)); + union: function union(other) { + return call($union, this, toSetLike(other)); } }); From 0eaeaf4001c4b0054f3f0021fd3b04a7ec633b0e Mon Sep 17 00:00:00 2001 From: Denis Pushkarev Date: Sun, 4 Dec 2022 02:27:55 +0700 Subject: [PATCH 10/11] ensure result order in `Set#intersection` --- .../override/internals/set-helpers.js | 5 ++- packages/core-js/internals/set-helpers.js | 10 ++++-- .../core-js/internals/set-intersection.js | 32 +++++++++++++++---- tests/unit-global/esnext.set.intersection.js | 7 ++++ tests/unit-pure/esnext.set.intersection.js | 7 ++++ 5 files changed, 51 insertions(+), 10 deletions(-) diff --git a/packages/core-js-pure/override/internals/set-helpers.js b/packages/core-js-pure/override/internals/set-helpers.js index bdf35ecde927..73dc651cc017 100644 --- a/packages/core-js-pure/override/internals/set-helpers.js +++ b/packages/core-js-pure/override/internals/set-helpers.js @@ -4,6 +4,7 @@ var tryToString = require('../internals/try-to-string'); var iterateSimple = require('../internals/iterate-simple'); var Set = getBuiltIn('Set'); +var SetPrototype = Set.prototype; var $TypeError = TypeError; var aSet = function (it) { @@ -54,5 +55,7 @@ module.exports = { has: has, size: size, clone: clone, - iterate: iterate + iterate: iterate, + $has: SetPrototype.has, + $keys: SetPrototype.keys }; diff --git a/packages/core-js/internals/set-helpers.js b/packages/core-js/internals/set-helpers.js index bc7cae631611..beedb7cb1a1f 100644 --- a/packages/core-js/internals/set-helpers.js +++ b/packages/core-js/internals/set-helpers.js @@ -5,10 +5,12 @@ var iterateSimple = require('../internals/iterate-simple'); // eslint-disable-next-line es/no-set -- safe var $Set = Set; var SetPrototype = $Set.prototype; +var $has = SetPrototype.has; +var $keys = SetPrototype.keys; var add = uncurryThis(SetPrototype.add); var forEach = uncurryThis(SetPrototype.forEach); -var has = uncurryThis(SetPrototype.has); -var keys = uncurryThis(SetPrototype.keys); +var has = uncurryThis($has); +var keys = uncurryThis($keys); var next = keys(new $Set()).next; var aSet = function (it) { @@ -42,5 +44,7 @@ module.exports = { has: has, size: size, clone: clone, - iterate: iterate + iterate: iterate, + $has: $has, + $keys: $keys }; diff --git a/packages/core-js/internals/set-intersection.js b/packages/core-js/internals/set-intersection.js index bcbf8a9d49b1..8e86fece661b 100644 --- a/packages/core-js/internals/set-intersection.js +++ b/packages/core-js/internals/set-intersection.js @@ -9,6 +9,12 @@ var add = SetHelpers.add; var has = SetHelpers.has; var size = SetHelpers.size; var forEach = SetHelpers.forEach; +var nativeHas = SetHelpers.$has; +var nativeKeys = SetHelpers.$keys; + +var isNativeSetRecord = function (record) { + return record.has === nativeHas && record.keys === nativeKeys; +}; // `Set.prototype.intersection` method // https://github.com/tc39/proposal-set-methods @@ -16,11 +22,25 @@ module.exports = function intersection(other) { var O = aSet(this); var otherRec = getSetRecord(other); var result = new Set(); - if (size(O) <= otherRec.size) forEach(O, function (e) { - if (otherRec.includes(e)) add(result, e); - }); - else iterateSimple(otherRec.getIterator(), function (e) { - if (has(O, e)) add(result, e); - }); + + // observable side effects + if (!isNativeSetRecord(otherRec) && size(O) > otherRec.size) { + iterateSimple(otherRec.getIterator(), function (e) { + if (has(O, e)) add(result, e); + }); + + if (size(result) < 2) return result; + + var disordered = result; + result = new Set(); + forEach(O, function (e) { + if (has(disordered, e)) add(result, e); + }); + } else { + forEach(O, function (e) { + if (otherRec.includes(e)) add(result, e); + }); + } + return result; }; diff --git a/tests/unit-global/esnext.set.intersection.js b/tests/unit-global/esnext.set.intersection.js index 3111adec2550..133767833bd2 100644 --- a/tests/unit-global/esnext.set.intersection.js +++ b/tests/unit-global/esnext.set.intersection.js @@ -18,6 +18,13 @@ QUnit.test('Set#intersection', assert => { assert.deepEqual(from(new Set([1, 2, 3]).intersection(createSetLike([4, 5]))), []); assert.deepEqual(from(new Set([1, 2, 3]).intersection(createSetLike([2, 3, 4]))), [2, 3]); + assert.deepEqual(from(new Set([1, 2, 3]).intersection(new Set([3, 2]))), [2, 3]); + assert.deepEqual(from(new Set([1, 2, 3]).intersection(new Set([3, 2, 1]))), [1, 2, 3]); + assert.deepEqual(from(new Set([1, 2, 3]).intersection(new Set([3, 2, 1, 0]))), [1, 2, 3]); + assert.deepEqual(from(new Set([1, 2, 3]).intersection(createSetLike([3, 2]))), [2, 3]); + assert.deepEqual(from(new Set([1, 2, 3]).intersection(createSetLike([3, 2, 1]))), [1, 2, 3]); + assert.deepEqual(from(new Set([1, 2, 3]).intersection(createSetLike([3, 2, 1, 0]))), [1, 2, 3]); + // TODO: drop from core-js@4 assert.deepEqual(from(new Set([1, 2, 3]).intersection([4, 5])), []); assert.deepEqual(from(new Set([1, 2, 3]).intersection([2, 3, 4])), [2, 3]); diff --git a/tests/unit-pure/esnext.set.intersection.js b/tests/unit-pure/esnext.set.intersection.js index d2798cce7740..e69270a33403 100644 --- a/tests/unit-pure/esnext.set.intersection.js +++ b/tests/unit-pure/esnext.set.intersection.js @@ -19,6 +19,13 @@ QUnit.test('Set#intersection', assert => { assert.deepEqual(from(new Set([1, 2, 3]).intersection(createSetLike([4, 5]))), []); assert.deepEqual(from(new Set([1, 2, 3]).intersection(createSetLike([2, 3, 4]))), [2, 3]); + assert.deepEqual(from(new Set([1, 2, 3]).intersection(new Set([3, 2]))), [2, 3]); + assert.deepEqual(from(new Set([1, 2, 3]).intersection(new Set([3, 2, 1]))), [1, 2, 3]); + assert.deepEqual(from(new Set([1, 2, 3]).intersection(new Set([3, 2, 1, 0]))), [1, 2, 3]); + assert.deepEqual(from(new Set([1, 2, 3]).intersection(createSetLike([3, 2]))), [2, 3]); + assert.deepEqual(from(new Set([1, 2, 3]).intersection(createSetLike([3, 2, 1]))), [1, 2, 3]); + assert.deepEqual(from(new Set([1, 2, 3]).intersection(createSetLike([3, 2, 1, 0]))), [1, 2, 3]); + // TODO: drop from core-js@4 assert.deepEqual(from(new Set([1, 2, 3]).intersection([4, 5])), []); assert.deepEqual(from(new Set([1, 2, 3]).intersection([2, 3, 4])), [2, 3]); From 4adbf162191193c3d9a8bbd359d8e0dc65d12627 Mon Sep 17 00:00:00 2001 From: Denis Pushkarev Date: Sat, 10 Dec 2022 13:20:02 +0700 Subject: [PATCH 11/11] fix a couple of rebasing issues --- CHANGELOG.md | 12 ++++++------ README.md | 2 +- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index abaa8232a5dc..63a5ae7d327f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -35,12 +35,6 @@ - Added `/actual/` entries, unconditional forced replacement disabled for features that survived to Stage 3 - `.from` accept strings, `.flatMap` throws on strings returned from the callback, [proposal-iterator-helpers/244](https://github.com/tc39/proposal-iterator-helpers/pull/244), [proposal-iterator-helpers/250](https://github.com/tc39/proposal-iterator-helpers/pull/250) - `.from` and `.flatMap` throws on non-object *iterators*, [proposal-iterator-helpers/253](https://github.com/tc39/proposal-iterator-helpers/pull/253) -- [Well-Formed Unicode Strings](https://github.com/tc39/proposal-is-usv-string) proposal: - - Methods: - - `String.prototype.isWellFormed` - - `String.prototype.toWellFormed` - - Moved to Stage 3, [November 2022 TC39 meeting](https://github.com/babel/proposals/issues/85#issuecomment-1332180862) - - Added `/actual/` entries, disabled unconditional forced replacement - [`Set` methods proposal](https://github.com/tc39/proposal-set-methods): - Methods: - `Set.prototype.intersection` @@ -59,6 +53,12 @@ - For avoiding breaking changes: - New versions of methods are implemented as new modules and available in new entries or entries where old versions of methods were not available before (like `/actual/` namespace) - In entries where they were available before (like `/full/` namespace), those methods are available with fallbacks to old semantics (in addition to `Set`-like, they accept iterable objects). This behavior will be removed from the next major release +- [Well-Formed Unicode Strings](https://github.com/tc39/proposal-is-usv-string) proposal: + - Methods: + - `String.prototype.isWellFormed` + - `String.prototype.toWellFormed` + - Moved to Stage 3, [November 2022 TC39 meeting](https://github.com/babel/proposals/issues/85#issuecomment-1332180862) + - Added `/actual/` entries, disabled unconditional forced replacement - [Compat data targets](/packages/core-js-compat#targets-option) improvements: - [React Native from 0.70 shipped with Hermes as the default engine.](https://reactnative.dev/blog/2022/07/08/hermes-as-the-default) However, bundled Hermes versions differ from standalone Hermes releases. So added **`react-native`** target for React Native with bundled Hermes. - [According to the documentation](https://developer.oculus.com/documentation/web/browser-intro/), Oculus Browser was renamed to Meta Quest Browser, so `oculus` target was renamed to **`quest`**. diff --git a/README.md b/README.md index 60abba77b5fc..4fcbea36081a 100644 --- a/README.md +++ b/README.md @@ -3370,4 +3370,4 @@ console.log(getIteratorMethod({})); // undefined - ES `Proxy` can't be polyfilled, you can try to use [`proxy-polyfill`](https://github.com/GoogleChrome/proxy-polyfill) which provides a very little subset of features. - ES `String#normalize` is not a very useful feature, but this polyfill will be very large. If you need it, you can use [unorm](https://github.com/walling/unorm/). - ECMA-402 `Intl` is missed because of the size. You can use [those polyfills](https://formatjs.io/docs/polyfills). -- `window.fetch` is not a cross-platform feature, in some environments, it makes no sense. For this reason, I don't think it should be in `core-js`. Looking at a large number of requests it *might be* added in the future. Now you can use, for example, [this polyfill](https://github.com/github/fetch). \ No newline at end of file +- `window.fetch` is not a cross-platform feature, in some environments, it makes no sense. For this reason, I don't think it should be in `core-js`. Looking at a large number of requests it *might be* added in the future. Now you can use, for example, [this polyfill](https://github.com/github/fetch).