diff --git a/experimental/babel-preset-env/src/use-built-ins-entry-plugin.js b/experimental/babel-preset-env/src/use-built-ins-entry-plugin.js index 1e0f951766..a22d7df913 100644 --- a/experimental/babel-preset-env/src/use-built-ins-entry-plugin.js +++ b/experimental/babel-preset-env/src/use-built-ins-entry-plugin.js @@ -64,15 +64,6 @@ export default function({ types: t }) { } }, Program(path, state) { - if (!state.opts.polyfills) { - throw path.buildCodeFrameError( - ` -There was an issue in "babel-preset-env" such that -the "polyfills" option was not correctly passed -to the "transform-polyfill-require" plugin -`, - ); - } path.get("body").forEach(bodyPath => { if (isRequire(bodyPath)) { bodyPath.replaceWithMultiple( 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 42700e6388..3f72ba613c 100644 --- a/experimental/babel-preset-env/src/use-built-ins-plugin.js +++ b/experimental/babel-preset-env/src/use-built-ins-plugin.js @@ -78,16 +78,7 @@ Please remove the "import 'babel-polyfill'" call or use "useBuiltIns: 'entry'" i } }, Program: { - enter(path, state) { - if (!state.opts.polyfills) { - throw path.buildCodeFrameError( - ` -There was an issue in "babel-preset-env" such that -the "polyfills" option was not correctly passed -to the "transform-polyfill-require" plugin -`, - ); - } + enter(path) { path.get("body").forEach(bodyPath => { if (isRequire(bodyPath)) { console.warn( @@ -102,8 +93,8 @@ Please remove the "require('babel-polyfill')" call or use "useBuiltIns: 'entry'" }, }, - // Symbol() -> _core.Symbol(); - // new Promise -> new _core.Promise + // Symbol() + // new Promise ReferencedIdentifier(path, state) { const { node, parent, scope } = path; @@ -115,7 +106,49 @@ Please remove the "require('babel-polyfill')" call or use "useBuiltIns: 'entry'" addUnsupported(path, state.opts.polyfills, builtIn, this.builtIns); }, - // Array.from -> _core.Array.from + // arr[Symbol.iterator]() + CallExpression(path) { + // we can't compile this + if (path.node.arguments.length) return; + + const callee = path.node.callee; + if (!t.isMemberExpression(callee)) return; + if (!callee.computed) return; + if (!path.get("callee.property").matchesPattern("Symbol.iterator")) { + return; + } + + addImport( + path, + "babel-polyfill/lib/core-js/modules/web.dom.iterable", + this.builtIns, + ); + }, + + // Symbol.iterator in arr + BinaryExpression(path) { + if (path.node.operator !== "in") return; + if (!path.get("left").matchesPattern("Symbol.iterator")) return; + + addImport( + path, + "babel-polyfill/lib/core-js/modules/web.dom.iterable", + this.builtIns, + ); + }, + + // yield* + YieldExpression(path) { + if (!path.node.delegate) return; + + addImport( + path, + "babel-polyfill/lib/core-js/modules/web.dom.iterable", + this.builtIns, + ); + }, + + // Array.from MemberExpression: { enter(path, state) { if (!path.isReferenced()) return; @@ -134,6 +167,13 @@ Please remove the "require('babel-polyfill')" call or use "useBuiltIns: 'entry'" if (has(staticMethods, prop.name)) { const builtIn = staticMethods[prop.name]; addUnsupported(path, state.opts.polyfills, builtIn, this.builtIns); + // if (obj.name === "Array" && prop.name === "from") { + // addImport( + // path, + // "babel-polyfill/lib/core-js/modules/web.dom.iterable", + // this.builtIns, + // ); + // } } } diff --git a/experimental/babel-preset-env/test/fixtures/dom-iterable/symbol-iterator-in/actual.js b/experimental/babel-preset-env/test/fixtures/dom-iterable/symbol-iterator-in/actual.js new file mode 100644 index 0000000000..3d72e8e71c --- /dev/null +++ b/experimental/babel-preset-env/test/fixtures/dom-iterable/symbol-iterator-in/actual.js @@ -0,0 +1 @@ +Symbol.iterator in arr diff --git a/experimental/babel-preset-env/test/fixtures/dom-iterable/symbol-iterator-in/expected.js b/experimental/babel-preset-env/test/fixtures/dom-iterable/symbol-iterator-in/expected.js new file mode 100644 index 0000000000..ce74075426 --- /dev/null +++ b/experimental/babel-preset-env/test/fixtures/dom-iterable/symbol-iterator-in/expected.js @@ -0,0 +1,3 @@ +import "babel-polyfill/lib/core-js/modules/es6.symbol"; +import "babel-polyfill/lib/core-js/modules/web.dom.iterable"; +Symbol.iterator in arr; \ No newline at end of file diff --git a/experimental/babel-preset-env/test/fixtures/dom-iterable/symbol-iterator-in/options.json b/experimental/babel-preset-env/test/fixtures/dom-iterable/symbol-iterator-in/options.json new file mode 100644 index 0000000000..b6301eb2a2 --- /dev/null +++ b/experimental/babel-preset-env/test/fixtures/dom-iterable/symbol-iterator-in/options.json @@ -0,0 +1,8 @@ +{ + "presets": [ + ["../../../../lib", { + "useBuiltIns": true, + "modules": false + }] + ] +} diff --git a/experimental/babel-preset-env/test/fixtures/dom-iterable/symbol-iterator/actual.js b/experimental/babel-preset-env/test/fixtures/dom-iterable/symbol-iterator/actual.js new file mode 100644 index 0000000000..c44a50ddfd --- /dev/null +++ b/experimental/babel-preset-env/test/fixtures/dom-iterable/symbol-iterator/actual.js @@ -0,0 +1 @@ +arr[Symbol.iterator]() diff --git a/experimental/babel-preset-env/test/fixtures/dom-iterable/symbol-iterator/expected.js b/experimental/babel-preset-env/test/fixtures/dom-iterable/symbol-iterator/expected.js new file mode 100644 index 0000000000..ef4793ceac --- /dev/null +++ b/experimental/babel-preset-env/test/fixtures/dom-iterable/symbol-iterator/expected.js @@ -0,0 +1,3 @@ +import "babel-polyfill/lib/core-js/modules/es6.symbol"; +import "babel-polyfill/lib/core-js/modules/web.dom.iterable"; +arr[Symbol.iterator](); \ No newline at end of file diff --git a/experimental/babel-preset-env/test/fixtures/dom-iterable/symbol-iterator/options.json b/experimental/babel-preset-env/test/fixtures/dom-iterable/symbol-iterator/options.json new file mode 100644 index 0000000000..b6301eb2a2 --- /dev/null +++ b/experimental/babel-preset-env/test/fixtures/dom-iterable/symbol-iterator/options.json @@ -0,0 +1,8 @@ +{ + "presets": [ + ["../../../../lib", { + "useBuiltIns": true, + "modules": false + }] + ] +} diff --git a/experimental/babel-preset-env/test/fixtures/dom-iterable/yield-non-star/actual.js b/experimental/babel-preset-env/test/fixtures/dom-iterable/yield-non-star/actual.js new file mode 100644 index 0000000000..927d2f2772 --- /dev/null +++ b/experimental/babel-preset-env/test/fixtures/dom-iterable/yield-non-star/actual.js @@ -0,0 +1,3 @@ +function* a() { + yield 1; +} diff --git a/experimental/babel-preset-env/test/fixtures/dom-iterable/yield-non-star/expected.js b/experimental/babel-preset-env/test/fixtures/dom-iterable/yield-non-star/expected.js new file mode 100644 index 0000000000..927d2f2772 --- /dev/null +++ b/experimental/babel-preset-env/test/fixtures/dom-iterable/yield-non-star/expected.js @@ -0,0 +1,3 @@ +function* a() { + yield 1; +} diff --git a/experimental/babel-preset-env/test/fixtures/dom-iterable/yield-non-star/options.json b/experimental/babel-preset-env/test/fixtures/dom-iterable/yield-non-star/options.json new file mode 100644 index 0000000000..6a2de8474b --- /dev/null +++ b/experimental/babel-preset-env/test/fixtures/dom-iterable/yield-non-star/options.json @@ -0,0 +1,11 @@ +{ + "presets": [ + ["../../../../lib", { + "useBuiltIns": true, + "targets": { + "chrome": 55 + }, + "modules": false + }] + ] +} diff --git a/experimental/babel-preset-env/test/fixtures/dom-iterable/yield-star/actual.js b/experimental/babel-preset-env/test/fixtures/dom-iterable/yield-star/actual.js new file mode 100644 index 0000000000..4915d62092 --- /dev/null +++ b/experimental/babel-preset-env/test/fixtures/dom-iterable/yield-star/actual.js @@ -0,0 +1,3 @@ +function* a() { + yield* 1; +} diff --git a/experimental/babel-preset-env/test/fixtures/dom-iterable/yield-star/expected.js b/experimental/babel-preset-env/test/fixtures/dom-iterable/yield-star/expected.js new file mode 100644 index 0000000000..595611ee0a --- /dev/null +++ b/experimental/babel-preset-env/test/fixtures/dom-iterable/yield-star/expected.js @@ -0,0 +1,4 @@ +import "babel-polyfill/lib/core-js/modules/web.dom.iterable"; +function* a() { + yield* 1; +} \ No newline at end of file diff --git a/experimental/babel-preset-env/test/fixtures/dom-iterable/yield-star/options.json b/experimental/babel-preset-env/test/fixtures/dom-iterable/yield-star/options.json new file mode 100644 index 0000000000..6a2de8474b --- /dev/null +++ b/experimental/babel-preset-env/test/fixtures/dom-iterable/yield-star/options.json @@ -0,0 +1,11 @@ +{ + "presets": [ + ["../../../../lib", { + "useBuiltIns": true, + "targets": { + "chrome": 55 + }, + "modules": false + }] + ] +} diff --git a/experimental/babel-preset-env/test/fixtures/preset-options-add-used-built-ins/builtins-used-instance-methods-native-support/expected.js b/experimental/babel-preset-env/test/fixtures/preset-options-add-used-built-ins/builtins-used-instance-methods-native-support/expected.js index 820ba15b94..dfd6871646 100644 --- a/experimental/babel-preset-env/test/fixtures/preset-options-add-used-built-ins/builtins-used-instance-methods-native-support/expected.js +++ b/experimental/babel-preset-env/test/fixtures/preset-options-add-used-built-ins/builtins-used-instance-methods-native-support/expected.js @@ -9,4 +9,4 @@ d.fill.bind(); //.bind e.padStart.apply(); // .apply f.padEnd.call(); // .call String.prototype.startsWith.call; // prototype.call -var { codePointAt, endsWith } = k; // destructuring \ No newline at end of file +var { codePointAt, endsWith } = k; // destructuring diff --git a/experimental/babel-preset-env/test/fixtures/preset-options-add-used-built-ins/builtins-used-instance-methods/expected.js b/experimental/babel-preset-env/test/fixtures/preset-options-add-used-built-ins/builtins-used-instance-methods/expected.js index 4cf1aa740b..7f1190b260 100644 --- a/experimental/babel-preset-env/test/fixtures/preset-options-add-used-built-ins/builtins-used-instance-methods/expected.js +++ b/experimental/babel-preset-env/test/fixtures/preset-options-add-used-built-ins/builtins-used-instance-methods/expected.js @@ -36,4 +36,4 @@ i[asdf]; // computed with identifier j["search"]; // computed with template k[asdf3]; // computed with concat strings var _k2 = k, - _a = _k2[asdf2]; // computed \ No newline at end of file + _a = _k2[asdf2]; // computed diff --git a/experimental/babel-preset-env/test/fixtures/preset-options-add-used-built-ins/builtins-used-native-support/actual.js b/experimental/babel-preset-env/test/fixtures/preset-options-add-used-built-ins/builtins-used-native-support/actual.js index e434437b9e..68285538d3 100644 --- a/experimental/babel-preset-env/test/fixtures/preset-options-add-used-built-ins/builtins-used-native-support/actual.js +++ b/experimental/babel-preset-env/test/fixtures/preset-options-add-used-built-ins/builtins-used-native-support/actual.js @@ -2,7 +2,6 @@ Array.from; // static method Map; // built-in new Promise(); // new builtin Symbol.match; // as member expression -_arr[Symbol.iterator](); // Symbol.iterator // no import Array.asdf; diff --git a/experimental/babel-preset-env/test/fixtures/preset-options-add-used-built-ins/builtins-used-native-support/expected.js b/experimental/babel-preset-env/test/fixtures/preset-options-add-used-built-ins/builtins-used-native-support/expected.js index efb2ae903e..68285538d3 100644 --- a/experimental/babel-preset-env/test/fixtures/preset-options-add-used-built-ins/builtins-used-native-support/expected.js +++ b/experimental/babel-preset-env/test/fixtures/preset-options-add-used-built-ins/builtins-used-native-support/expected.js @@ -2,7 +2,6 @@ Array.from; // static method Map; // built-in new Promise(); // new builtin Symbol.match; // as member expression -_arr[Symbol.iterator](); // Symbol.iterator // no import Array.asdf; @@ -23,4 +22,4 @@ function H(WeakMap) { var asdf = 'copyWithin'; i[asdf]; // computed with identifier j[`copyWithin`]; // computed with template -var { [asdf]: _a } = k; // computed \ No newline at end of file +var { [asdf]: _a } = k; // computed diff --git a/experimental/babel-preset-env/test/fixtures/preset-options-add-used-built-ins/builtins-used/expected.js b/experimental/babel-preset-env/test/fixtures/preset-options-add-used-built-ins/builtins-used/expected.js index 3d30ffad1f..e0f6fffa87 100644 --- a/experimental/babel-preset-env/test/fixtures/preset-options-add-used-built-ins/builtins-used/expected.js +++ b/experimental/babel-preset-env/test/fixtures/preset-options-add-used-built-ins/builtins-used/expected.js @@ -1,3 +1,4 @@ +import "babel-polyfill/lib/core-js/modules/web.dom.iterable"; import "babel-polyfill/lib/core-js/modules/es6.symbol"; import "babel-polyfill/lib/core-js/modules/es6.regexp.match"; import "babel-polyfill/lib/core-js/modules/es6.promise"; @@ -22,4 +23,4 @@ _arr9[Symbol.iterator2](); G.assign; // static method function H(WeakMap) { var blah = new WeakMap(); -} // shadowed \ No newline at end of file +} // shadowed