From 2d8fdf30457021c287a23c19fc5bb48eb8f46a67 Mon Sep 17 00:00:00 2001 From: Adam Miller Date: Sun, 4 Sep 2016 20:59:52 -0700 Subject: [PATCH 1/2] Allow native Symbols as computed property names (#6705) The for-in loop in helpers.defineEnumerableProperties doesn't iterate over Symbols. If Object.getOwnPropertySymbols exists, include the discovered values when defining properties. --- packages/babel-helpers/src/helpers.js | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/packages/babel-helpers/src/helpers.js b/packages/babel-helpers/src/helpers.js index b4b8c203a2..24e796a48c 100644 --- a/packages/babel-helpers/src/helpers.js +++ b/packages/babel-helpers/src/helpers.js @@ -278,6 +278,20 @@ helpers.defineEnumerableProperties = template(` if ("value" in desc) desc.writable = true; Object.defineProperty(obj, key, desc); } + + // Symbols are not enumerated over by for-in loops. If native + // Symbols are available, fetch all of the descs object's own + // symbol properties and define them on our target object too. + if (Object.getOwnPropertySymbols) { + var objectSymbols = Object.getOwnPropertySymbols(descs); + for (var idx in objectSymbols) { + var sym = objectSymbols[idx]; + var desc = descs[sym]; + desc.configurable = desc.enumerable = true; + if ("value" in desc) desc.writable = true; + Object.defineProperty(obj, sym, desc); + } + } return obj; }) `); From 77957508622ba94c86f01d8157684848f66f154f Mon Sep 17 00:00:00 2001 From: Justin Ridgewell Date: Fri, 25 Aug 2017 22:52:17 -0400 Subject: [PATCH 2/2] Tests --- packages/babel-helpers/src/helpers.js | 4 ++-- .../test/fixtures/loose/ignore-symbol/actual.js | 3 --- .../test/fixtures/loose/ignore-symbol/expected.js | 3 --- .../test/fixtures/loose/symbol/actual.js | 7 +++++++ .../test/fixtures/loose/symbol/exec.js | 10 ++++++++++ .../test/fixtures/loose/symbol/expected.js | 6 ++++++ .../test/fixtures/spec/ignore-symbol/actual.js | 3 --- .../test/fixtures/spec/ignore-symbol/expected.js | 1 - .../test/fixtures/spec/symbol/actual.js | 7 +++++++ .../test/fixtures/spec/symbol/exec.js | 10 ++++++++++ .../test/fixtures/spec/symbol/expected.js | 6 ++++++ 11 files changed, 48 insertions(+), 12 deletions(-) delete mode 100644 packages/babel-plugin-transform-es2015-computed-properties/test/fixtures/loose/ignore-symbol/actual.js delete mode 100644 packages/babel-plugin-transform-es2015-computed-properties/test/fixtures/loose/ignore-symbol/expected.js create mode 100644 packages/babel-plugin-transform-es2015-computed-properties/test/fixtures/loose/symbol/actual.js create mode 100644 packages/babel-plugin-transform-es2015-computed-properties/test/fixtures/loose/symbol/exec.js create mode 100644 packages/babel-plugin-transform-es2015-computed-properties/test/fixtures/loose/symbol/expected.js delete mode 100644 packages/babel-plugin-transform-es2015-computed-properties/test/fixtures/spec/ignore-symbol/actual.js delete mode 100644 packages/babel-plugin-transform-es2015-computed-properties/test/fixtures/spec/ignore-symbol/expected.js create mode 100644 packages/babel-plugin-transform-es2015-computed-properties/test/fixtures/spec/symbol/actual.js create mode 100644 packages/babel-plugin-transform-es2015-computed-properties/test/fixtures/spec/symbol/exec.js create mode 100644 packages/babel-plugin-transform-es2015-computed-properties/test/fixtures/spec/symbol/expected.js diff --git a/packages/babel-helpers/src/helpers.js b/packages/babel-helpers/src/helpers.js index 24e796a48c..69cd1f8179 100644 --- a/packages/babel-helpers/src/helpers.js +++ b/packages/babel-helpers/src/helpers.js @@ -284,8 +284,8 @@ helpers.defineEnumerableProperties = template(` // symbol properties and define them on our target object too. if (Object.getOwnPropertySymbols) { var objectSymbols = Object.getOwnPropertySymbols(descs); - for (var idx in objectSymbols) { - var sym = objectSymbols[idx]; + for (var i = 0; i < objectSymbols.length; i++) { + var sym = objectSymbols[i]; var desc = descs[sym]; desc.configurable = desc.enumerable = true; if ("value" in desc) desc.writable = true; diff --git a/packages/babel-plugin-transform-es2015-computed-properties/test/fixtures/loose/ignore-symbol/actual.js b/packages/babel-plugin-transform-es2015-computed-properties/test/fixtures/loose/ignore-symbol/actual.js deleted file mode 100644 index fce8293ed4..0000000000 --- a/packages/babel-plugin-transform-es2015-computed-properties/test/fixtures/loose/ignore-symbol/actual.js +++ /dev/null @@ -1,3 +0,0 @@ -var foo = { - [Symbol.iterator]: "foobar" -}; diff --git a/packages/babel-plugin-transform-es2015-computed-properties/test/fixtures/loose/ignore-symbol/expected.js b/packages/babel-plugin-transform-es2015-computed-properties/test/fixtures/loose/ignore-symbol/expected.js deleted file mode 100644 index 39b056cf1e..0000000000 --- a/packages/babel-plugin-transform-es2015-computed-properties/test/fixtures/loose/ignore-symbol/expected.js +++ /dev/null @@ -1,3 +0,0 @@ -var _foo; - -var foo = (_foo = {}, _foo[Symbol.iterator] = "foobar", _foo); diff --git a/packages/babel-plugin-transform-es2015-computed-properties/test/fixtures/loose/symbol/actual.js b/packages/babel-plugin-transform-es2015-computed-properties/test/fixtures/loose/symbol/actual.js new file mode 100644 index 0000000000..46ac6ce88b --- /dev/null +++ b/packages/babel-plugin-transform-es2015-computed-properties/test/fixtures/loose/symbol/actual.js @@ -0,0 +1,7 @@ +var k = Symbol(); +var foo = { + [Symbol.iterator]: "foobar", + get [k]() { + return k; + } +}; diff --git a/packages/babel-plugin-transform-es2015-computed-properties/test/fixtures/loose/symbol/exec.js b/packages/babel-plugin-transform-es2015-computed-properties/test/fixtures/loose/symbol/exec.js new file mode 100644 index 0000000000..026f6bc6c6 --- /dev/null +++ b/packages/babel-plugin-transform-es2015-computed-properties/test/fixtures/loose/symbol/exec.js @@ -0,0 +1,10 @@ +var k = Symbol(); +var foo = { + [Symbol.iterator]: "foobar", + get [k]() { + return k; + } +}; + +assert(foo[Symbol.iterator], "foobar") +assert(foo[k], k) diff --git a/packages/babel-plugin-transform-es2015-computed-properties/test/fixtures/loose/symbol/expected.js b/packages/babel-plugin-transform-es2015-computed-properties/test/fixtures/loose/symbol/expected.js new file mode 100644 index 0000000000..49fbdbaf1f --- /dev/null +++ b/packages/babel-plugin-transform-es2015-computed-properties/test/fixtures/loose/symbol/expected.js @@ -0,0 +1,6 @@ +var _foo, _mutatorMap; + +var k = Symbol(); +var foo = (_foo = {}, _foo[Symbol.iterator] = "foobar", _mutatorMap = {}, _mutatorMap[k] = _mutatorMap[k] || {}, _mutatorMap[k].get = function () { + return k; +}, babelHelpers.defineEnumerableProperties(_foo, _mutatorMap), _foo); diff --git a/packages/babel-plugin-transform-es2015-computed-properties/test/fixtures/spec/ignore-symbol/actual.js b/packages/babel-plugin-transform-es2015-computed-properties/test/fixtures/spec/ignore-symbol/actual.js deleted file mode 100644 index fce8293ed4..0000000000 --- a/packages/babel-plugin-transform-es2015-computed-properties/test/fixtures/spec/ignore-symbol/actual.js +++ /dev/null @@ -1,3 +0,0 @@ -var foo = { - [Symbol.iterator]: "foobar" -}; diff --git a/packages/babel-plugin-transform-es2015-computed-properties/test/fixtures/spec/ignore-symbol/expected.js b/packages/babel-plugin-transform-es2015-computed-properties/test/fixtures/spec/ignore-symbol/expected.js deleted file mode 100644 index a2226f929b..0000000000 --- a/packages/babel-plugin-transform-es2015-computed-properties/test/fixtures/spec/ignore-symbol/expected.js +++ /dev/null @@ -1 +0,0 @@ -var foo = babelHelpers.defineProperty({}, Symbol.iterator, "foobar"); diff --git a/packages/babel-plugin-transform-es2015-computed-properties/test/fixtures/spec/symbol/actual.js b/packages/babel-plugin-transform-es2015-computed-properties/test/fixtures/spec/symbol/actual.js new file mode 100644 index 0000000000..46ac6ce88b --- /dev/null +++ b/packages/babel-plugin-transform-es2015-computed-properties/test/fixtures/spec/symbol/actual.js @@ -0,0 +1,7 @@ +var k = Symbol(); +var foo = { + [Symbol.iterator]: "foobar", + get [k]() { + return k; + } +}; diff --git a/packages/babel-plugin-transform-es2015-computed-properties/test/fixtures/spec/symbol/exec.js b/packages/babel-plugin-transform-es2015-computed-properties/test/fixtures/spec/symbol/exec.js new file mode 100644 index 0000000000..026f6bc6c6 --- /dev/null +++ b/packages/babel-plugin-transform-es2015-computed-properties/test/fixtures/spec/symbol/exec.js @@ -0,0 +1,10 @@ +var k = Symbol(); +var foo = { + [Symbol.iterator]: "foobar", + get [k]() { + return k; + } +}; + +assert(foo[Symbol.iterator], "foobar") +assert(foo[k], k) diff --git a/packages/babel-plugin-transform-es2015-computed-properties/test/fixtures/spec/symbol/expected.js b/packages/babel-plugin-transform-es2015-computed-properties/test/fixtures/spec/symbol/expected.js new file mode 100644 index 0000000000..202144553b --- /dev/null +++ b/packages/babel-plugin-transform-es2015-computed-properties/test/fixtures/spec/symbol/expected.js @@ -0,0 +1,6 @@ +var _foo, _mutatorMap; + +var k = Symbol(); +var foo = (_foo = {}, babelHelpers.defineProperty(_foo, Symbol.iterator, "foobar"), _mutatorMap = {}, _mutatorMap[k] = _mutatorMap[k] || {}, _mutatorMap[k].get = function () { + return k; +}, babelHelpers.defineEnumerableProperties(_foo, _mutatorMap), _foo);