From 287b485d0e7e9df1b53bd83e5a11d9353fe72610 Mon Sep 17 00:00:00 2001 From: Brian Ng Date: Wed, 15 Nov 2017 09:45:54 -0600 Subject: [PATCH] Fix bug in preset-env usage plugin with destructure in for-of (#6662) --- .../babel-preset-env/src/use-built-ins-plugin.js | 6 ++---- .../for-of-destructure-with/actual.js | 3 +++ .../for-of-destructure-with/expected.js | 8 ++++++++ .../for-of-destructure-with/options.json | 11 +++++++++++ .../for-of-destructure-without/actual.js | 3 +++ .../for-of-destructure-without/expected.js | 5 +++++ .../for-of-destructure-without/options.json | 11 +++++++++++ 7 files changed, 43 insertions(+), 4 deletions(-) create mode 100644 experimental/babel-preset-env/test/fixtures/preset-options-add-used-built-ins/for-of-destructure-with/actual.js create mode 100644 experimental/babel-preset-env/test/fixtures/preset-options-add-used-built-ins/for-of-destructure-with/expected.js create mode 100644 experimental/babel-preset-env/test/fixtures/preset-options-add-used-built-ins/for-of-destructure-with/options.json create mode 100644 experimental/babel-preset-env/test/fixtures/preset-options-add-used-built-ins/for-of-destructure-without/actual.js create mode 100644 experimental/babel-preset-env/test/fixtures/preset-options-add-used-built-ins/for-of-destructure-without/expected.js create mode 100644 experimental/babel-preset-env/test/fixtures/preset-options-add-used-built-ins/for-of-destructure-without/options.json diff --git a/experimental/babel-preset-env/src/use-built-ins-plugin.js b/experimental/babel-preset-env/src/use-built-ins-plugin.js index 92438db1be..25ebd661a8 100644 --- a/experimental/babel-preset-env/src/use-built-ins-plugin.js +++ b/experimental/babel-preset-env/src/use-built-ins-plugin.js @@ -217,14 +217,12 @@ export default function({ types: t }: { types: Object }): Plugin { const obj = node.init; if (!t.isObjectPattern(node.id)) return; - const props = node.id.properties; - if (!t.isReferenced(obj, node)) return; // doesn't reference the global - if (path.scope.getBindingIdentifier(obj.name)) return; + if (obj && path.scope.getBindingIdentifier(obj.name)) return; - for (let prop of props) { + for (let prop of node.id.properties) { prop = prop.key; if ( !node.computed && diff --git a/experimental/babel-preset-env/test/fixtures/preset-options-add-used-built-ins/for-of-destructure-with/actual.js b/experimental/babel-preset-env/test/fixtures/preset-options-add-used-built-ins/for-of-destructure-with/actual.js new file mode 100644 index 0000000000..c9f54a8e47 --- /dev/null +++ b/experimental/babel-preset-env/test/fixtures/preset-options-add-used-built-ins/for-of-destructure-with/actual.js @@ -0,0 +1,3 @@ +for (const { padStart } of foo) { + console.log('b'.padEnd(5)); +} diff --git a/experimental/babel-preset-env/test/fixtures/preset-options-add-used-built-ins/for-of-destructure-with/expected.js b/experimental/babel-preset-env/test/fixtures/preset-options-add-used-built-ins/for-of-destructure-with/expected.js new file mode 100644 index 0000000000..a5ed2f8582 --- /dev/null +++ b/experimental/babel-preset-env/test/fixtures/preset-options-add-used-built-ins/for-of-destructure-with/expected.js @@ -0,0 +1,8 @@ +import "@babel/polyfill/lib/core-js/modules/es7.string.pad-end"; +import "@babel/polyfill/lib/core-js/modules/es7.string.pad-start"; + +for (const { + padStart +} of foo) { + console.log('b'.padEnd(5)); +} diff --git a/experimental/babel-preset-env/test/fixtures/preset-options-add-used-built-ins/for-of-destructure-with/options.json b/experimental/babel-preset-env/test/fixtures/preset-options-add-used-built-ins/for-of-destructure-with/options.json new file mode 100644 index 0000000000..e73fe7b3bb --- /dev/null +++ b/experimental/babel-preset-env/test/fixtures/preset-options-add-used-built-ins/for-of-destructure-with/options.json @@ -0,0 +1,11 @@ +{ + "presets": [ + ["../../../../lib", { + "targets": { + "node": "7" + }, + "useBuiltIns": "usage", + "modules": false + }] + ] +} diff --git a/experimental/babel-preset-env/test/fixtures/preset-options-add-used-built-ins/for-of-destructure-without/actual.js b/experimental/babel-preset-env/test/fixtures/preset-options-add-used-built-ins/for-of-destructure-without/actual.js new file mode 100644 index 0000000000..4228bde23c --- /dev/null +++ b/experimental/babel-preset-env/test/fixtures/preset-options-add-used-built-ins/for-of-destructure-without/actual.js @@ -0,0 +1,3 @@ +for (const { a } of foo) { + console.log(a); +} diff --git a/experimental/babel-preset-env/test/fixtures/preset-options-add-used-built-ins/for-of-destructure-without/expected.js b/experimental/babel-preset-env/test/fixtures/preset-options-add-used-built-ins/for-of-destructure-without/expected.js new file mode 100644 index 0000000000..9b8c02b13b --- /dev/null +++ b/experimental/babel-preset-env/test/fixtures/preset-options-add-used-built-ins/for-of-destructure-without/expected.js @@ -0,0 +1,5 @@ +for (const { + a +} of foo) { + console.log(a); +} diff --git a/experimental/babel-preset-env/test/fixtures/preset-options-add-used-built-ins/for-of-destructure-without/options.json b/experimental/babel-preset-env/test/fixtures/preset-options-add-used-built-ins/for-of-destructure-without/options.json new file mode 100644 index 0000000000..5fa73d0603 --- /dev/null +++ b/experimental/babel-preset-env/test/fixtures/preset-options-add-used-built-ins/for-of-destructure-without/options.json @@ -0,0 +1,11 @@ +{ + "presets": [ + ["../../../../lib", { + "targets": { + "node": "8" + }, + "useBuiltIns": "usage", + "modules": false + }] + ] +}