diff --git a/packages/babel-helpers/src/helpers.js b/packages/babel-helpers/src/helpers.js index b4b8c203a2..69cd1f8179 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 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; + Object.defineProperty(obj, sym, desc); + } + } return obj; }) `); 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);