From 60efc0dd10d14bc4238197b916511f2b780eb545 Mon Sep 17 00:00:00 2001 From: Henry Zhu Date: Fri, 2 Dec 2016 00:03:13 -0500 Subject: [PATCH 01/21] add useBuiltIns option --- .../babel-preset-env/data/builtInFeatures.js | 72 ++++ .../babel-preset-env/data/builtIns.json | 385 ++++++++++++++++++ .../babel-preset-env/scripts/build-data.js | 49 ++- experimental/babel-preset-env/src/index.js | 5 +- .../src/transformPolyfillRequirePlugin.js | 12 + 5 files changed, 508 insertions(+), 15 deletions(-) create mode 100644 experimental/babel-preset-env/data/builtInFeatures.js create mode 100644 experimental/babel-preset-env/data/builtIns.json create mode 100644 experimental/babel-preset-env/src/transformPolyfillRequirePlugin.js diff --git a/experimental/babel-preset-env/data/builtInFeatures.js b/experimental/babel-preset-env/data/builtInFeatures.js new file mode 100644 index 0000000000..8175861462 --- /dev/null +++ b/experimental/babel-preset-env/data/builtInFeatures.js @@ -0,0 +1,72 @@ +// https://github.com/zloirock/core-js + +/* eslint-disable quotes */ +module.exports = { + // es2015 + // core-js/fn/map + + // "typed": "typed arrays", ? + // "typed/array-buffer": "typed arrays / ", ? + "typed/data-view": "typed arrays / DataView", + "typed/int8-array": "typed arrays / Int8Array", + "typed/uint8-array": "typed arrays / Uint8Array", + "typed/uint8-clamped-array": "typed arrays / Uint8ClampedArray", + "typed/int16-array": "typed arrays / Int16Array", + "typed/uint16-array": "typed arrays / Uint16Array", + "typed/int32-array": "typed arrays / Int32Array", + "typed/uint32-array": "typed arrays / Uint32Array", + "typed/float32-array": "typed arrays / Float32Array", + "typed/float64-array": "typed arrays / Float64Array", + + "map": "Map", + "set": "Set", + "weak-map": "WeakMap", + "weak-set": "WeakSet", + + // No polyfill for proxy + + "reflect": "Reflect", + "reflect/apply": "Reflect / ", + "reflect/construct": "Reflect / Reflect.construct", + "reflect/define-property": "Reflect / Reflect.defineProperty", + "reflect/delete-property": "Reflect / Reflect.deleteProperty", + "reflect/get": "Reflect / Reflect.get", + "reflect/get-own-property-descriptor": "Reflect / Reflect.getOwnPropertyDescriptor", + "reflect/get-prototype-of": "Reflect / Reflect.getPrototypeOf", + "reflect/has": "Reflect / Reflect.has", + "reflect/is-extensible": "Reflect / Reflect.isExtensible", + "reflect/own-keys": "Reflect / Reflect.ownKeys", + "reflect/prevent-extensions": "Reflect / Reflect.preventExtensions", + "reflect/set": "Reflect / Reflect.set", + "reflect/set-prototype-of": "Reflect / Reflect.setPrototypeOf", + + "promise": "Promise", + + "symbol": "Symbol", + "symbol/for": "Symbol / global symbol registry", + "symbol/key-for": "Symbol / global symbol registry", + + "symbol/has-instance": "well-known symbols / Symbol.hasInstance", + "symbol/is-concat-spreadable": "well-known symbols / Symbol.isConcatSpreadable", + "symbol/iterator": "well-known symbols / Symbol.iterator", + "symbol/match": "well-known symbols / Symbol.match", + "symbol/replace": "well-known symbols / Symbol.replace", + "symbol/search": "well-known symbols / Symbol.search", + "symbol/species": "well-known symbols / Symbol.species", + "symbol/split": "well-known symbols / Symbol.split", + "symbol/to-primitive": "well-known symbols / Symbol.toPrimitive", + "symbol/to-string-tag": "well-known symbols / Symbol.toStringTag", + "symbol/unscopables": "well-known symbols / Symbol.unscopables", + + "object/assign": "Object static methods / Object.assign", + "object/is": "Object static methods / Object.is", + "object/get-own-property-symbols": "Object static methods / Object.getOwnPropertySymbols", + "object/set-prototype-of": "Object static methods / Object.setPrototypeOf", + + "function/name": 'function "name" property', + + "string/raw": "String static methods / String.raw", + "string/string/from-code-point": "String static methods / String.fromCodePoint", + + // String.prototype methods +}; diff --git a/experimental/babel-preset-env/data/builtIns.json b/experimental/babel-preset-env/data/builtIns.json new file mode 100644 index 0000000000..306d83ee66 --- /dev/null +++ b/experimental/babel-preset-env/data/builtIns.json @@ -0,0 +1,385 @@ +{ + "typed/data-view": {}, + "typed/int8-array": { + "chrome": 5, + "opera": 12, + "firefox": 4, + "safari": 5, + "node": 0.12, + "ie": 10, + "android": 4, + "ios": 6 + }, + "typed/uint8-array": { + "chrome": 5, + "opera": 12, + "firefox": 4, + "safari": 5, + "node": 0.12, + "ie": 10, + "android": 4, + "ios": 6 + }, + "typed/uint8-clamped-array": { + "chrome": 5, + "opera": 12, + "edge": 12, + "firefox": 4, + "safari": 6, + "node": 0.12, + "ios": 10 + }, + "typed/int16-array": { + "chrome": 5, + "opera": 12, + "firefox": 4, + "safari": 5, + "node": 0.12, + "ie": 10, + "android": 4, + "ios": 6 + }, + "typed/uint16-array": { + "chrome": 5, + "opera": 12, + "firefox": 4, + "safari": 5, + "node": 0.12, + "ie": 10, + "android": 4, + "ios": 6 + }, + "typed/int32-array": { + "chrome": 5, + "opera": 12, + "firefox": 4, + "safari": 5, + "node": 0.12, + "ie": 10, + "android": 4, + "ios": 6 + }, + "typed/uint32-array": { + "chrome": 5, + "opera": 12, + "firefox": 4, + "safari": 5, + "node": 0.12, + "ie": 10, + "android": 4, + "ios": 6 + }, + "typed/float32-array": { + "chrome": 5, + "opera": 12, + "firefox": 4, + "safari": 5, + "node": 0.12, + "ie": 10, + "android": 4, + "ios": 6 + }, + "typed/float64-array": { + "chrome": 5, + "opera": 12, + "firefox": 4, + "safari": 5, + "node": 0.12, + "ie": 10, + "android": 4.1, + "ios": 6 + }, + "map": { + "chrome": 51, + "opera": 38, + "safari": 10, + "node": 6.5, + "ios": 10 + }, + "set": { + "chrome": 51, + "opera": 38, + "safari": 10, + "node": 6.5, + "ios": 10 + }, + "weak-map": { + "chrome": 51, + "opera": 38, + "safari": 9, + "ios": 10 + }, + "weak-set": { + "chrome": 51, + "opera": 38, + "safari": 9, + "ios": 9 + }, + "reflect": { + "chrome": 49, + "opera": 36, + "edge": 13, + "firefox": 45, + "safari": 10, + "ios": 10 + }, + "reflect/apply": {}, + "reflect/construct": { + "chrome": 49, + "opera": 36, + "edge": 12, + "firefox": 42, + "safari": 10, + "ios": 10 + }, + "reflect/define-property": { + "chrome": 49, + "opera": 36, + "edge": 13, + "firefox": 42, + "safari": 10, + "ios": 10 + }, + "reflect/delete-property": { + "chrome": 49, + "opera": 36, + "edge": 12, + "firefox": 42, + "safari": 10, + "ios": 10 + }, + "reflect/get": { + "chrome": 49, + "opera": 36, + "edge": 12, + "firefox": 42, + "safari": 10, + "ios": 10 + }, + "reflect/get-own-property-descriptor": { + "chrome": 49, + "opera": 36, + "edge": 12, + "firefox": 42, + "safari": 10, + "ios": 10 + }, + "reflect/get-prototype-of": { + "chrome": 49, + "opera": 36, + "edge": 12, + "firefox": 42, + "safari": 10, + "ios": 10 + }, + "reflect/has": { + "chrome": 49, + "opera": 36, + "edge": 12, + "firefox": 42, + "safari": 10, + "ios": 10 + }, + "reflect/is-extensible": { + "chrome": 49, + "opera": 36, + "edge": 12, + "firefox": 42, + "safari": 10, + "ios": 10 + }, + "reflect/own-keys": {}, + "reflect/prevent-extensions": { + "chrome": 49, + "opera": 36, + "edge": 12, + "firefox": 42, + "safari": 10, + "ios": 10 + }, + "reflect/set": { + "chrome": 49, + "opera": 36, + "edge": 12, + "firefox": 42, + "safari": 10, + "ios": 10 + }, + "reflect/set-prototype-of": { + "chrome": 49, + "opera": 36, + "edge": 12, + "firefox": 42, + "safari": 10, + "ios": 10 + }, + "promise": { + "chrome": 51, + "opera": 38, + "edge": 13, + "firefox": 45, + "safari": 10, + "node": 6.5, + "ios": 10 + }, + "symbol": { + "chrome": 49, + "opera": 36, + "edge": 13, + "firefox": 36, + "safari": 10, + "ios": 10 + }, + "symbol/for": { + "chrome": 38, + "opera": 25, + "edge": 12, + "firefox": 36, + "safari": 9, + "node": 0.12, + "ios": 9 + }, + "symbol/key-for": { + "chrome": 38, + "opera": 25, + "edge": 12, + "firefox": 36, + "safari": 9, + "node": 0.12, + "ios": 9 + }, + "symbol/has-instance": { + "chrome": 51, + "opera": 38, + "firefox": 50, + "safari": 10, + "node": 6.5, + "ios": 10 + }, + "symbol/is-concat-spreadable": { + "chrome": 48, + "opera": 35, + "firefox": 48, + "safari": 10, + "ios": 10 + }, + "symbol/iterator": {}, + "symbol/match": { + "chrome": 50, + "opera": 37, + "firefox": 49, + "safari": 10, + "node": 6, + "ios": 10 + }, + "symbol/replace": { + "chrome": 50, + "opera": 37, + "firefox": 49, + "safari": 10, + "node": 6, + "ios": 10 + }, + "symbol/search": { + "chrome": 50, + "opera": 37, + "firefox": 49, + "safari": 10, + "node": 6, + "ios": 10 + }, + "symbol/species": {}, + "symbol/split": { + "chrome": 50, + "opera": 37, + "firefox": 49, + "safari": 10, + "node": 6, + "ios": 10 + }, + "symbol/to-primitive": { + "chrome": 47, + "opera": 34, + "firefox": 44, + "safari": 10, + "ios": 10 + }, + "symbol/to-string-tag": { + "chrome": 49, + "opera": 36, + "firefox": 51, + "safari": 10, + "ios": 10 + }, + "symbol/unscopables": { + "chrome": 38, + "opera": 25, + "edge": 12, + "firefox": 48, + "safari": 9, + "node": 0.12, + "ios": 9 + }, + "object/assign": { + "chrome": 45, + "opera": 32, + "edge": 12, + "firefox": 34, + "safari": 9, + "node": 4, + "ios": 9 + }, + "object/is": { + "chrome": 19, + "opera": 6, + "edge": 12, + "firefox": 22, + "safari": 9, + "node": 0.12, + "android": 4.1, + "ios": 9 + }, + "object/get-own-property-symbols": { + "chrome": 38, + "opera": 25, + "edge": 12, + "firefox": 36, + "safari": 9, + "node": 0.12, + "ios": 9 + }, + "object/set-prototype-of": { + "chrome": 34, + "opera": 21, + "firefox": 31, + "safari": 9, + "node": 0.12, + "ie": 11, + "ios": 9 + }, + "function/name": { + "chrome": 51, + "opera": 38, + "safari": 10, + "node": 6.5, + "ios": 10 + }, + "string/raw": { + "chrome": 41, + "opera": 28, + "edge": 12, + "firefox": 34, + "safari": 9, + "node": 4, + "ios": 9 + }, + "string/string/from-code-point": { + "chrome": 41, + "opera": 28, + "edge": 12, + "firefox": 29, + "safari": 9, + "node": 4, + "ios": 9 + } +} diff --git a/experimental/babel-preset-env/scripts/build-data.js b/experimental/babel-preset-env/scripts/build-data.js index 1c70a4884f..42ec569995 100644 --- a/experimental/babel-preset-env/scripts/build-data.js +++ b/experimental/babel-preset-env/scripts/build-data.js @@ -4,6 +4,7 @@ const path = require("path"); const flatten = require("lodash/flatten"); const flattenDeep = require("lodash/flattenDeep"); const pluginFeatures = require("../data/pluginFeatures"); +const builtInFeatures = require("../data/builtInFeatures"); const renameTests = (tests, getName) => tests.map((test) => Object.assign({}, test, { name: getName(test.name) })); @@ -98,7 +99,7 @@ const getLowestImplementedVersion = ({ features }, env) => { }); let envFiltered = envTests.filter((t) => t); - if (envTests.length > envFiltered.length) { + if (envTests.length > envFiltered.length || envTests.length === 0) { // envTests.forEach((test, i) => { // if (!test) { // // print unsupported features @@ -115,27 +116,47 @@ const getLowestImplementedVersion = ({ features }, env) => { .reduce((a, b) => { return (a < b) ? b : a; }); }; -const data = {}; -for (const pluginName in pluginFeatures) { - const options = pluginFeatures[pluginName]; - const plugin = {}; - environments.forEach((env) => { - if (Array.isArray(options.features)) { +function generateData(features) { + let ret = {}; + + Object.keys(features).forEach((pluginName) => { + let options = features[pluginName]; + + if (!options.features) { + options = { + features: [options] + }; + } + + const plugin = {}; + environments.forEach((env) => { const version = getLowestImplementedVersion(options, env); if (version !== null) { plugin[env] = version; } - } - // add opera - if (plugin.chrome) { - plugin.opera = plugin.chrome - 13; - } + // add opera + if (plugin.chrome) { + plugin.opera = plugin.chrome - 13; + + if (plugin.chrome === 5) { + plugin.opera = 12; + } + } + }); + + ret[pluginName] = plugin; }); - data[pluginName] = plugin; + + return ret; } fs.writeFileSync( path.join(__dirname, "../data/plugins.json"), - JSON.stringify(data, null, 2) + "\n" + JSON.stringify(generateData(pluginFeatures), null, 2) + "\n" +); + +fs.writeFileSync( + path.join(__dirname, "../data/builtIns.json"), + JSON.stringify(generateData(builtInFeatures), null, 2) + "\n" ); diff --git a/experimental/babel-preset-env/src/index.js b/experimental/babel-preset-env/src/index.js index bbeefdc7af..8221c6ae87 100644 --- a/experimental/babel-preset-env/src/index.js +++ b/experimental/babel-preset-env/src/index.js @@ -1,5 +1,6 @@ import pluginList from "../data/plugins.json"; import browserslist from "browserslist"; +import transformPolyfillRequirePlugin from "./transformPolyfillRequirePlugin"; export const MODULE_TRANSFORMATIONS = { "amd": "transform-es2015-modules-amd", @@ -140,6 +141,7 @@ export default function buildPreset(context, opts = {}) { const whitelist = validateWhitelistOption(opts.whitelist); const targets = getTargets(opts.targets); const debug = opts.debug; + const useBuiltIns = opts.useBuiltIns; let transformations = Object.keys(pluginList) .filter((pluginName) => isPluginRequired(targets, pluginList[pluginName])); @@ -179,7 +181,8 @@ export default function buildPreset(context, opts = {}) { return { plugins: [ ...modules, - ...transformations + ...transformations, + // useBuiltIns && transformPolyfillRequirePlugin ] }; } diff --git a/experimental/babel-preset-env/src/transformPolyfillRequirePlugin.js b/experimental/babel-preset-env/src/transformPolyfillRequirePlugin.js new file mode 100644 index 0000000000..09e99ea150 --- /dev/null +++ b/experimental/babel-preset-env/src/transformPolyfillRequirePlugin.js @@ -0,0 +1,12 @@ +export default function (babel) { + const { types: t } = babel; + + return { + name: "ast-transform", // not required + visitor: { + Identifier(path) { + + } + } + }; +} From 6c58d93602aa0daa02d165dcb071a2d717cca5d4 Mon Sep 17 00:00:00 2001 From: Henry Zhu Date: Fri, 2 Dec 2016 13:04:21 -0500 Subject: [PATCH 02/21] setup the babel plugin to transform the babel-polyfill calls + pass the data option to the plugin from the preset --- experimental/babel-preset-env/src/index.js | 13 +++- .../src/transformPolyfillRequirePlugin.js | 68 +++++++++++++++++-- .../use-builtins-chrome-55/actual.js | 1 + .../use-builtins-chrome-55/expected.js | 1 + .../use-builtins-chrome-55/options.json | 11 +++ 5 files changed, 85 insertions(+), 9 deletions(-) create mode 100644 experimental/babel-preset-env/test/fixtures/preset-options/use-builtins-chrome-55/actual.js create mode 100644 experimental/babel-preset-env/test/fixtures/preset-options/use-builtins-chrome-55/expected.js create mode 100644 experimental/babel-preset-env/test/fixtures/preset-options/use-builtins-chrome-55/options.json diff --git a/experimental/babel-preset-env/src/index.js b/experimental/babel-preset-env/src/index.js index 8221c6ae87..8aa87c0162 100644 --- a/experimental/babel-preset-env/src/index.js +++ b/experimental/babel-preset-env/src/index.js @@ -1,4 +1,5 @@ import pluginList from "../data/plugins.json"; +import builtInsList from "../data/builtIns.json"; import browserslist from "browserslist"; import transformPolyfillRequirePlugin from "./transformPolyfillRequirePlugin"; @@ -146,6 +147,14 @@ export default function buildPreset(context, opts = {}) { let transformations = Object.keys(pluginList) .filter((pluginName) => isPluginRequired(targets, pluginList[pluginName])); + let polyfills; + if (useBuiltIns) { + polyfills = Object.keys(builtInsList) + .filter((builtInName) => isPluginRequired(targets, builtInsList[builtInName])); + console.log(polyfills); + console.log(polyfills.length, Object.keys(builtInsList).length); + } + if (debug && !hasBeenLogged) { hasBeenLogged = true; @@ -182,7 +191,7 @@ export default function buildPreset(context, opts = {}) { plugins: [ ...modules, ...transformations, - // useBuiltIns && transformPolyfillRequirePlugin - ] + useBuiltIns === true && [transformPolyfillRequirePlugin, { polyfills }] + ].filter(Boolean) }; } diff --git a/experimental/babel-preset-env/src/transformPolyfillRequirePlugin.js b/experimental/babel-preset-env/src/transformPolyfillRequirePlugin.js index 09e99ea150..41cf8de476 100644 --- a/experimental/babel-preset-env/src/transformPolyfillRequirePlugin.js +++ b/experimental/babel-preset-env/src/transformPolyfillRequirePlugin.js @@ -1,12 +1,66 @@ -export default function (babel) { - const { types: t } = babel; +// Should throw if no babel-polyfill import is found in all files +// or if more than one is found + +// const builtIns = require('../data/builtIns.json'); +const builtIns = { + "typed/int8-array": { + "chrome": 5, + "opera": 12, + "firefox": 4, + "safari": 5, + "node": 0.12, + "ie": 10, + "android": 4, + "ios": 6 + } +}; + +const polyfillSource = "babel-polyfill"; +let numPolyfillImports = 0; + +export default function ({ types: t }) { + function checkNumPolyfillImports() { + numPolyfillImports++; + if (numPolyfillImports > 1) { + console.log("multiple babel-polyfill imports found"); + //throw new Error("multiple babel-polyfill imports found"); + } + } + + function isRequire(path, source) { + return t.isExpressionStatement(path.node) && + t.isCallExpression(path.node.expression) && + t.isIdentifier(path.node.expression.callee) && + path.node.expression.callee.name === "require" && + path.node.expression.arguments.length === 1 && + t.isStringLiteral(path.node.expression.arguments[0]) && + path.node.expression.arguments[0].value === source; + } + + const isPolyfillImport = { + ImportDeclaration(path, state) { + if (path.node.specifiers.length === 0 && + path.node.source.value === polyfillSource) { + checkNumPolyfillImports(); + + // change + // path.node.source.value = "changed"; + } + }, + Program(path, state) { + path.get("body").forEach((bodyPath) => { + if (isRequire(bodyPath, polyfillSource)) { + checkNumPolyfillImports(); + + // change + // bodyPath.node.expression.arguments[0].value = "changed"; + } + }); + } + }; return { name: "ast-transform", // not required - visitor: { - Identifier(path) { - - } - } + visitor: isPolyfillImport }; } diff --git a/experimental/babel-preset-env/test/fixtures/preset-options/use-builtins-chrome-55/actual.js b/experimental/babel-preset-env/test/fixtures/preset-options/use-builtins-chrome-55/actual.js new file mode 100644 index 0000000000..cb706b1a18 --- /dev/null +++ b/experimental/babel-preset-env/test/fixtures/preset-options/use-builtins-chrome-55/actual.js @@ -0,0 +1 @@ +1 ** 2; diff --git a/experimental/babel-preset-env/test/fixtures/preset-options/use-builtins-chrome-55/expected.js b/experimental/babel-preset-env/test/fixtures/preset-options/use-builtins-chrome-55/expected.js new file mode 100644 index 0000000000..cb706b1a18 --- /dev/null +++ b/experimental/babel-preset-env/test/fixtures/preset-options/use-builtins-chrome-55/expected.js @@ -0,0 +1 @@ +1 ** 2; diff --git a/experimental/babel-preset-env/test/fixtures/preset-options/use-builtins-chrome-55/options.json b/experimental/babel-preset-env/test/fixtures/preset-options/use-builtins-chrome-55/options.json new file mode 100644 index 0000000000..5199920de8 --- /dev/null +++ b/experimental/babel-preset-env/test/fixtures/preset-options/use-builtins-chrome-55/options.json @@ -0,0 +1,11 @@ +{ + "presets": [ + ["../../../../lib", { + "targets": { + "chrome": 54 + }, + "modules": false, + "useBuiltIns": true + }] + ] +} From c09532f0357db01bb9b1f1deba43553428d804e1 Mon Sep 17 00:00:00 2001 From: Henry Zhu Date: Fri, 2 Dec 2016 15:33:27 -0500 Subject: [PATCH 03/21] plugin transforms the imports/requires --- .../src/transformPolyfillRequirePlugin.js | 62 ++++++++++++------- 1 file changed, 38 insertions(+), 24 deletions(-) diff --git a/experimental/babel-preset-env/src/transformPolyfillRequirePlugin.js b/experimental/babel-preset-env/src/transformPolyfillRequirePlugin.js index 41cf8de476..77ba7f86e1 100644 --- a/experimental/babel-preset-env/src/transformPolyfillRequirePlugin.js +++ b/experimental/babel-preset-env/src/transformPolyfillRequirePlugin.js @@ -1,30 +1,30 @@ // Should throw if no babel-polyfill import is found in all files // or if more than one is found -// const builtIns = require('../data/builtIns.json'); -const builtIns = { - "typed/int8-array": { - "chrome": 5, - "opera": 12, - "firefox": 4, - "safari": 5, - "node": 0.12, - "ie": 10, - "android": 4, - "ios": 6 - } -}; - const polyfillSource = "babel-polyfill"; let numPolyfillImports = 0; export default function ({ types: t }) { function checkNumPolyfillImports() { numPolyfillImports++; - if (numPolyfillImports > 1) { - console.log("multiple babel-polyfill imports found"); - //throw new Error("multiple babel-polyfill imports found"); - } + return numPolyfillImports > 1; + } + + function addImport(polyfill) { + let declar = t.importDeclaration([], t.stringLiteral(`core-js/fn/${polyfill}`)); + declar._blockHoist = 3; + return declar; + } + + function addRequire(polyfill) { + return t.expressionStatement( + t.callExpression( + t.identifier("require"), + [ + t.stringLiteral(`core-js/modules/${polyfill}`) + ] + ) + ); } function isRequire(path, source) { @@ -41,19 +41,33 @@ export default function ({ types: t }) { ImportDeclaration(path, state) { if (path.node.specifiers.length === 0 && path.node.source.value === polyfillSource) { - checkNumPolyfillImports(); + if (checkNumPolyfillImports()) { + path.remove(); + return; + } - // change - // path.node.source.value = "changed"; + let imports = state.opts.polyfills.map((p) => addImport(p)); + path.replaceWithMultiple(imports); } }, Program(path, state) { + if (!state.opts.polyfills) { + throw path.buildCodeFrameError(` +"polyfills" option not correctly passed +to the transform-polyfill-require plugin +in babel-preset-env +`); + } path.get("body").forEach((bodyPath) => { if (isRequire(bodyPath, polyfillSource)) { - checkNumPolyfillImports(); + if (checkNumPolyfillImports()) { + path.remove(); + return; + } - // change - // bodyPath.node.expression.arguments[0].value = "changed"; + + let requires = state.opts.polyfills.map((p) => addRequire(p)); + bodyPath.replaceWithMultiple(requires); } }); } From 7afe25bda1b9fd29a30227ba353b79bf7460b227 Mon Sep 17 00:00:00 2001 From: Henry Zhu Date: Fri, 2 Dec 2016 15:33:34 -0500 Subject: [PATCH 04/21] change format --- .../babel-preset-env/data/builtInFeatures.js | 113 ++++++++--------- .../babel-preset-env/data/builtIns.json | 114 ++++++++---------- .../src/transformPolyfillRequirePlugin.js | 4 +- 3 files changed, 99 insertions(+), 132 deletions(-) diff --git a/experimental/babel-preset-env/data/builtInFeatures.js b/experimental/babel-preset-env/data/builtInFeatures.js index 8175861462..c644e817f4 100644 --- a/experimental/babel-preset-env/data/builtInFeatures.js +++ b/experimental/babel-preset-env/data/builtInFeatures.js @@ -5,68 +5,53 @@ module.exports = { // es2015 // core-js/fn/map - // "typed": "typed arrays", ? - // "typed/array-buffer": "typed arrays / ", ? - "typed/data-view": "typed arrays / DataView", - "typed/int8-array": "typed arrays / Int8Array", - "typed/uint8-array": "typed arrays / Uint8Array", - "typed/uint8-clamped-array": "typed arrays / Uint8ClampedArray", - "typed/int16-array": "typed arrays / Int16Array", - "typed/uint16-array": "typed arrays / Uint16Array", - "typed/int32-array": "typed arrays / Int32Array", - "typed/uint32-array": "typed arrays / Uint32Array", - "typed/float32-array": "typed arrays / Float32Array", - "typed/float64-array": "typed arrays / Float64Array", - - "map": "Map", - "set": "Set", - "weak-map": "WeakMap", - "weak-set": "WeakSet", - - // No polyfill for proxy - - "reflect": "Reflect", - "reflect/apply": "Reflect / ", - "reflect/construct": "Reflect / Reflect.construct", - "reflect/define-property": "Reflect / Reflect.defineProperty", - "reflect/delete-property": "Reflect / Reflect.deleteProperty", - "reflect/get": "Reflect / Reflect.get", - "reflect/get-own-property-descriptor": "Reflect / Reflect.getOwnPropertyDescriptor", - "reflect/get-prototype-of": "Reflect / Reflect.getPrototypeOf", - "reflect/has": "Reflect / Reflect.has", - "reflect/is-extensible": "Reflect / Reflect.isExtensible", - "reflect/own-keys": "Reflect / Reflect.ownKeys", - "reflect/prevent-extensions": "Reflect / Reflect.preventExtensions", - "reflect/set": "Reflect / Reflect.set", - "reflect/set-prototype-of": "Reflect / Reflect.setPrototypeOf", - - "promise": "Promise", - - "symbol": "Symbol", - "symbol/for": "Symbol / global symbol registry", - "symbol/key-for": "Symbol / global symbol registry", - - "symbol/has-instance": "well-known symbols / Symbol.hasInstance", - "symbol/is-concat-spreadable": "well-known symbols / Symbol.isConcatSpreadable", - "symbol/iterator": "well-known symbols / Symbol.iterator", - "symbol/match": "well-known symbols / Symbol.match", - "symbol/replace": "well-known symbols / Symbol.replace", - "symbol/search": "well-known symbols / Symbol.search", - "symbol/species": "well-known symbols / Symbol.species", - "symbol/split": "well-known symbols / Symbol.split", - "symbol/to-primitive": "well-known symbols / Symbol.toPrimitive", - "symbol/to-string-tag": "well-known symbols / Symbol.toStringTag", - "symbol/unscopables": "well-known symbols / Symbol.unscopables", - - "object/assign": "Object static methods / Object.assign", - "object/is": "Object static methods / Object.is", - "object/get-own-property-symbols": "Object static methods / Object.getOwnPropertySymbols", - "object/set-prototype-of": "Object static methods / Object.setPrototypeOf", - - "function/name": 'function "name" property', - - "string/raw": "String static methods / String.raw", - "string/string/from-code-point": "String static methods / String.fromCodePoint", - - // String.prototype methods + // "es6.typed/array-buffer": "typed arrays / ", + "es6.typed.data-view": "typed arrays / DataView", + "es6.typed.int8-array": "typed arrays / Int8Array", + "es6.typed.uint8-array": "typed arrays / Uint8Array", + "es6.typed.uint8-clamped-array": "typed arrays / Uint8ClampedArray", + "es6.typed.int16-array": "typed arrays / Int16Array", + "es6.typed.uint16-array": "typed arrays / Uint16Array", + "es6.typed.int32-array": "typed arrays / Int32Array", + "es6.typed.uint32-array": "typed arrays / Uint32Array", + "es6.typed.float32-array": "typed arrays / Float32Array", + "es6.typed.float64-array": "typed arrays / Float64Array", + "es6.map": "Map", + "es6.set": "Set", + "es6.weak-map": "WeakMap", + "es6.weak-set": "WeakSet", + "es6.reflect": "Reflect", + "es6.reflect.apply": "Reflect / ", + "es6.reflect.construct": "Reflect / Reflect.construct", + "es6.reflect.define-property": "Reflect / Reflect.defineProperty", + "es6.reflect.delete-property": "Reflect / Reflect.deleteProperty", + "es6.reflect.get": "Reflect / Reflect.get", + "es6.reflect.get-own-property-descriptor": "Reflect / Reflect.getOwnPropertyDescriptor", + "es6.reflect.get-prototype-of": "Reflect / Reflect.getPrototypeOf", + "es6.reflect.has": "Reflect / Reflect.has", + "es6.reflect.is-extensible": "Reflect / Reflect.isExtensible", + "es6.reflect.own-keys": "Reflect / Reflect.ownKeys", + "es6.reflect.prevent-extensions": "Reflect / Reflect.preventExtensions", + "es6.reflect.set": "Reflect / Reflect.set", + "es6.reflect.set-prototype-of": "Reflect / Reflect.setPrototypeOf", + "es6.promise": "Promise", + "es6.symbol": "Symbol", + "es6.symbol.has-instance": "well-known symbols / Symbol.hasInstance", + "es6.symbol.is-concat-spreadable": "well-known symbols / Symbol.isConcatSpreadable", + "es6.symbol.iterator": "well-known symbols / Symbol.iterator", + "es6.symbol.match": "well-known symbols / Symbol.match", + "es6.symbol.replace": "well-known symbols / Symbol.replace", + "es6.symbol.search": "well-known symbols / Symbol.search", + "es6.symbol.species": "well-known symbols / Symbol.species", + "es6.symbol.split": "well-known symbols / Symbol.split", + "es6.symbol.to-primitive": "well-known symbols / Symbol.toPrimitive", + "es6.symbol.to-string-tag": "well-known symbols / Symbol.toStringTag", + "es6.symbol.unscopables": "well-known symbols / Symbol.unscopables", + "es6.object.assign": "Object static methods / Object.assign", + "es6.object.is": "Object static methods / Object.is", + "es6.object.get-own-property-symbols": "Object static methods / Object.getOwnPropertySymbols", + "es6.object.set-prototype-of": "Object static methods / Object.setPrototypeOf", + "es6.function.name": 'function "name" property', + "es6.string.raw": "String static methods / String.raw", + "es6.string.from-code-point": "String static methods / String.fromCodePoint", }; diff --git a/experimental/babel-preset-env/data/builtIns.json b/experimental/babel-preset-env/data/builtIns.json index 306d83ee66..b3b42bf5d6 100644 --- a/experimental/babel-preset-env/data/builtIns.json +++ b/experimental/babel-preset-env/data/builtIns.json @@ -1,6 +1,6 @@ { - "typed/data-view": {}, - "typed/int8-array": { + "es6.typed.data-view": {}, + "es6.typed.int8-array": { "chrome": 5, "opera": 12, "firefox": 4, @@ -10,7 +10,7 @@ "android": 4, "ios": 6 }, - "typed/uint8-array": { + "es6.typed.uint8-array": { "chrome": 5, "opera": 12, "firefox": 4, @@ -20,7 +20,7 @@ "android": 4, "ios": 6 }, - "typed/uint8-clamped-array": { + "es6.typed.uint8-clamped-array": { "chrome": 5, "opera": 12, "edge": 12, @@ -29,7 +29,7 @@ "node": 0.12, "ios": 10 }, - "typed/int16-array": { + "es6.typed.int16-array": { "chrome": 5, "opera": 12, "firefox": 4, @@ -39,7 +39,7 @@ "android": 4, "ios": 6 }, - "typed/uint16-array": { + "es6.typed.uint16-array": { "chrome": 5, "opera": 12, "firefox": 4, @@ -49,7 +49,7 @@ "android": 4, "ios": 6 }, - "typed/int32-array": { + "es6.typed.int32-array": { "chrome": 5, "opera": 12, "firefox": 4, @@ -59,7 +59,7 @@ "android": 4, "ios": 6 }, - "typed/uint32-array": { + "es6.typed.uint32-array": { "chrome": 5, "opera": 12, "firefox": 4, @@ -69,7 +69,7 @@ "android": 4, "ios": 6 }, - "typed/float32-array": { + "es6.typed.float32-array": { "chrome": 5, "opera": 12, "firefox": 4, @@ -79,7 +79,7 @@ "android": 4, "ios": 6 }, - "typed/float64-array": { + "es6.typed.float64-array": { "chrome": 5, "opera": 12, "firefox": 4, @@ -89,33 +89,33 @@ "android": 4.1, "ios": 6 }, - "map": { + "es6.map": { "chrome": 51, "opera": 38, "safari": 10, "node": 6.5, "ios": 10 }, - "set": { + "es6.set": { "chrome": 51, "opera": 38, "safari": 10, "node": 6.5, "ios": 10 }, - "weak-map": { + "es6.weak-map": { "chrome": 51, "opera": 38, "safari": 9, "ios": 10 }, - "weak-set": { + "es6.weak-set": { "chrome": 51, "opera": 38, "safari": 9, "ios": 9 }, - "reflect": { + "es6.reflect": { "chrome": 49, "opera": 36, "edge": 13, @@ -123,8 +123,8 @@ "safari": 10, "ios": 10 }, - "reflect/apply": {}, - "reflect/construct": { + "es6.reflect.apply": {}, + "es6.reflect.construct": { "chrome": 49, "opera": 36, "edge": 12, @@ -132,7 +132,7 @@ "safari": 10, "ios": 10 }, - "reflect/define-property": { + "es6.reflect.define-property": { "chrome": 49, "opera": 36, "edge": 13, @@ -140,7 +140,7 @@ "safari": 10, "ios": 10 }, - "reflect/delete-property": { + "es6.reflect.delete-property": { "chrome": 49, "opera": 36, "edge": 12, @@ -148,7 +148,7 @@ "safari": 10, "ios": 10 }, - "reflect/get": { + "es6.reflect.get": { "chrome": 49, "opera": 36, "edge": 12, @@ -156,7 +156,7 @@ "safari": 10, "ios": 10 }, - "reflect/get-own-property-descriptor": { + "es6.reflect.get-own-property-descriptor": { "chrome": 49, "opera": 36, "edge": 12, @@ -164,7 +164,7 @@ "safari": 10, "ios": 10 }, - "reflect/get-prototype-of": { + "es6.reflect.get-prototype-of": { "chrome": 49, "opera": 36, "edge": 12, @@ -172,7 +172,7 @@ "safari": 10, "ios": 10 }, - "reflect/has": { + "es6.reflect.has": { "chrome": 49, "opera": 36, "edge": 12, @@ -180,7 +180,7 @@ "safari": 10, "ios": 10 }, - "reflect/is-extensible": { + "es6.reflect.is-extensible": { "chrome": 49, "opera": 36, "edge": 12, @@ -188,8 +188,8 @@ "safari": 10, "ios": 10 }, - "reflect/own-keys": {}, - "reflect/prevent-extensions": { + "es6.reflect.own-keys": {}, + "es6.reflect.prevent-extensions": { "chrome": 49, "opera": 36, "edge": 12, @@ -197,7 +197,7 @@ "safari": 10, "ios": 10 }, - "reflect/set": { + "es6.reflect.set": { "chrome": 49, "opera": 36, "edge": 12, @@ -205,7 +205,7 @@ "safari": 10, "ios": 10 }, - "reflect/set-prototype-of": { + "es6.reflect.set-prototype-of": { "chrome": 49, "opera": 36, "edge": 12, @@ -213,7 +213,7 @@ "safari": 10, "ios": 10 }, - "promise": { + "es6.promise": { "chrome": 51, "opera": 38, "edge": 13, @@ -222,7 +222,7 @@ "node": 6.5, "ios": 10 }, - "symbol": { + "es6.symbol": { "chrome": 49, "opera": 36, "edge": 13, @@ -230,25 +230,7 @@ "safari": 10, "ios": 10 }, - "symbol/for": { - "chrome": 38, - "opera": 25, - "edge": 12, - "firefox": 36, - "safari": 9, - "node": 0.12, - "ios": 9 - }, - "symbol/key-for": { - "chrome": 38, - "opera": 25, - "edge": 12, - "firefox": 36, - "safari": 9, - "node": 0.12, - "ios": 9 - }, - "symbol/has-instance": { + "es6.symbol.has-instance": { "chrome": 51, "opera": 38, "firefox": 50, @@ -256,15 +238,15 @@ "node": 6.5, "ios": 10 }, - "symbol/is-concat-spreadable": { + "es6.symbol.is-concat-spreadable": { "chrome": 48, "opera": 35, "firefox": 48, "safari": 10, "ios": 10 }, - "symbol/iterator": {}, - "symbol/match": { + "es6.symbol.iterator": {}, + "es6.symbol.match": { "chrome": 50, "opera": 37, "firefox": 49, @@ -272,7 +254,7 @@ "node": 6, "ios": 10 }, - "symbol/replace": { + "es6.symbol.replace": { "chrome": 50, "opera": 37, "firefox": 49, @@ -280,7 +262,7 @@ "node": 6, "ios": 10 }, - "symbol/search": { + "es6.symbol.search": { "chrome": 50, "opera": 37, "firefox": 49, @@ -288,8 +270,8 @@ "node": 6, "ios": 10 }, - "symbol/species": {}, - "symbol/split": { + "es6.symbol.species": {}, + "es6.symbol.split": { "chrome": 50, "opera": 37, "firefox": 49, @@ -297,21 +279,21 @@ "node": 6, "ios": 10 }, - "symbol/to-primitive": { + "es6.symbol.to-primitive": { "chrome": 47, "opera": 34, "firefox": 44, "safari": 10, "ios": 10 }, - "symbol/to-string-tag": { + "es6.symbol.to-string-tag": { "chrome": 49, "opera": 36, "firefox": 51, "safari": 10, "ios": 10 }, - "symbol/unscopables": { + "es6.symbol.unscopables": { "chrome": 38, "opera": 25, "edge": 12, @@ -320,7 +302,7 @@ "node": 0.12, "ios": 9 }, - "object/assign": { + "es6.object.assign": { "chrome": 45, "opera": 32, "edge": 12, @@ -329,7 +311,7 @@ "node": 4, "ios": 9 }, - "object/is": { + "es6.object.is": { "chrome": 19, "opera": 6, "edge": 12, @@ -339,7 +321,7 @@ "android": 4.1, "ios": 9 }, - "object/get-own-property-symbols": { + "es6.object.get-own-property-symbols": { "chrome": 38, "opera": 25, "edge": 12, @@ -348,7 +330,7 @@ "node": 0.12, "ios": 9 }, - "object/set-prototype-of": { + "es6.object.set-prototype-of": { "chrome": 34, "opera": 21, "firefox": 31, @@ -357,14 +339,14 @@ "ie": 11, "ios": 9 }, - "function/name": { + "es6.function.name": { "chrome": 51, "opera": 38, "safari": 10, "node": 6.5, "ios": 10 }, - "string/raw": { + "es6.string.raw": { "chrome": 41, "opera": 28, "edge": 12, @@ -373,7 +355,7 @@ "node": 4, "ios": 9 }, - "string/string/from-code-point": { + "es6.string.from-code-point": { "chrome": 41, "opera": 28, "edge": 12, diff --git a/experimental/babel-preset-env/src/transformPolyfillRequirePlugin.js b/experimental/babel-preset-env/src/transformPolyfillRequirePlugin.js index 77ba7f86e1..a95339606c 100644 --- a/experimental/babel-preset-env/src/transformPolyfillRequirePlugin.js +++ b/experimental/babel-preset-env/src/transformPolyfillRequirePlugin.js @@ -11,7 +11,7 @@ export default function ({ types: t }) { } function addImport(polyfill) { - let declar = t.importDeclaration([], t.stringLiteral(`core-js/fn/${polyfill}`)); + let declar = t.importDeclaration([], t.stringLiteral(`core-js/modules/${polyfill}`)); declar._blockHoist = 3; return declar; } @@ -74,7 +74,7 @@ in babel-preset-env }; return { - name: "ast-transform", // not required + name: "transform-polyfill-require", visitor: isPolyfillImport }; } From 36c6fcaf2399f6b4be3d855db251b477d92927fa Mon Sep 17 00:00:00 2001 From: Brian Ng Date: Fri, 2 Dec 2016 14:43:37 -0600 Subject: [PATCH 05/21] Add math builtins --- .../babel-preset-env/data/builtInFeatures.js | 17 ++ .../babel-preset-env/data/builtIns.json | 154 ++++++++++++++++++ 2 files changed, 171 insertions(+) diff --git a/experimental/babel-preset-env/data/builtInFeatures.js b/experimental/babel-preset-env/data/builtInFeatures.js index c644e817f4..8f1cfd000b 100644 --- a/experimental/babel-preset-env/data/builtInFeatures.js +++ b/experimental/babel-preset-env/data/builtInFeatures.js @@ -54,4 +54,21 @@ module.exports = { "es6.function.name": 'function "name" property', "es6.string.raw": "String static methods / String.raw", "es6.string.from-code-point": "String static methods / String.fromCodePoint", + "es6.math.acosh": "Math methods / Math.acosh", + "es6.math.asinh": "Math methods / Math.asinh", + "es6.math.atanh": "Math methods / Math.atanh", + "es6.math.cbrt": "Math methods / Math.cbrt", + "es6.math.clz32": "Math methods / Math.clz32", + "es6.math.cosh": "Math methods / Math.cosh", + "es6.math.expm1": "Math methods / Math.expm1", + "es6.math.fround": "Math methods / Math.fround", + "es6.math.hypot": "Math methods / Math.hypot", + "es6.math.imul": "Math methods / Math.imul", + "es6.math.log1p": "Math methods / Math.log1p", + "es6.math.log10": "Math methods / Math.log10", + "es6.math.log2": "Math methods / Math.log2", + "es6.math.sign": "Math methods / Math.sign", + "es6.math.sinh": "Math methods / Math.sinh", + "es6.math.tanh": "Math methods / Math.tanh", + "es6.math.trunc": "Math methods / Math.trunc" }; diff --git a/experimental/babel-preset-env/data/builtIns.json b/experimental/babel-preset-env/data/builtIns.json index b3b42bf5d6..5cb586cfa9 100644 --- a/experimental/babel-preset-env/data/builtIns.json +++ b/experimental/babel-preset-env/data/builtIns.json @@ -363,5 +363,159 @@ "safari": 9, "node": 4, "ios": 9 + }, + "es6.math.acosh": { + "chrome": 38, + "opera": 25, + "edge": 12, + "firefox": 25, + "safari": 7, + "node": 0.12, + "ios": 10 + }, + "es6.math.asinh": { + "chrome": 38, + "opera": 25, + "edge": 12, + "firefox": 25, + "safari": 7, + "node": 0.12, + "ios": 10 + }, + "es6.math.atanh": { + "chrome": 38, + "opera": 25, + "edge": 12, + "firefox": 25, + "safari": 7, + "node": 0.12, + "ios": 10 + }, + "es6.math.cbrt": { + "chrome": 38, + "opera": 25, + "edge": 12, + "firefox": 25, + "safari": 7, + "node": 0.12, + "ios": 10 + }, + "es6.math.clz32": { + "chrome": 38, + "opera": 25, + "edge": 12, + "firefox": 31, + "safari": 9, + "node": 0.12, + "ios": 9 + }, + "es6.math.cosh": { + "chrome": 38, + "opera": 25, + "edge": 12, + "firefox": 25, + "safari": 7, + "node": 0.12, + "ios": 10 + }, + "es6.math.expm1": { + "chrome": 38, + "opera": 25, + "edge": 12, + "firefox": 25, + "safari": 7, + "node": 0.12, + "ios": 10 + }, + "es6.math.fround": { + "chrome": 38, + "opera": 25, + "edge": 12, + "firefox": 26, + "safari": 7, + "node": 0.12, + "ios": 10 + }, + "es6.math.hypot": { + "chrome": 38, + "opera": 25, + "edge": 12, + "firefox": 27, + "safari": 7, + "node": 0.12, + "ios": 10 + }, + "es6.math.imul": { + "chrome": 30, + "opera": 17, + "edge": 12, + "firefox": 23, + "safari": 7, + "node": 0.12, + "android": 4.4, + "ios": 8 + }, + "es6.math.log1p": { + "chrome": 38, + "opera": 25, + "edge": 12, + "firefox": 25, + "safari": 7, + "node": 0.12, + "ios": 10 + }, + "es6.math.log10": { + "chrome": 38, + "opera": 25, + "edge": 12, + "firefox": 25, + "safari": 7, + "node": 0.12, + "ios": 10 + }, + "es6.math.log2": { + "chrome": 38, + "opera": 25, + "edge": 12, + "firefox": 25, + "safari": 7, + "node": 0.12, + "ios": 10 + }, + "es6.math.sign": { + "chrome": 38, + "opera": 25, + "edge": 12, + "firefox": 25, + "safari": 9, + "node": 0.12, + "ios": 9 + }, + "es6.math.sinh": { + "chrome": 38, + "opera": 25, + "edge": 12, + "firefox": 25, + "safari": 7, + "node": 0.12, + "ios": 10 + }, + "es6.math.tanh": { + "chrome": 38, + "opera": 25, + "edge": 12, + "firefox": 25, + "safari": 7, + "node": 0.12, + "ios": 10 + }, + "es6.math.trunc": { + "chrome": 38, + "opera": 25, + "edge": 12, + "firefox": 25, + "safari": 7, + "node": 0.12, + "ios": 10 } } From 3a7a1b922109b8c983a4480828646a147e3fa0cd Mon Sep 17 00:00:00 2001 From: Henry Zhu Date: Fri, 2 Dec 2016 16:46:55 -0500 Subject: [PATCH 06/21] add more features --- .../babel-preset-env/data/builtInFeatures.js | 46 +++++ .../babel-preset-env/data/builtIns.json | 195 ++++++++++++++++++ experimental/babel-preset-env/src/index.js | 2 - 3 files changed, 241 insertions(+), 2 deletions(-) diff --git a/experimental/babel-preset-env/data/builtInFeatures.js b/experimental/babel-preset-env/data/builtInFeatures.js index 8f1cfd000b..1899f9e8d5 100644 --- a/experimental/babel-preset-env/data/builtInFeatures.js +++ b/experimental/babel-preset-env/data/builtInFeatures.js @@ -16,10 +16,17 @@ module.exports = { "es6.typed.uint32-array": "typed arrays / Uint32Array", "es6.typed.float32-array": "typed arrays / Float32Array", "es6.typed.float64-array": "typed arrays / Float64Array", + "es6.map": "Map", + "es6.set": "Set", + "es6.weak-map": "WeakMap", + "es6.weak-set": "WeakSet", + + // no proxy + "es6.reflect": "Reflect", "es6.reflect.apply": "Reflect / ", "es6.reflect.construct": "Reflect / Reflect.construct", @@ -34,8 +41,11 @@ module.exports = { "es6.reflect.prevent-extensions": "Reflect / Reflect.preventExtensions", "es6.reflect.set": "Reflect / Reflect.set", "es6.reflect.set-prototype-of": "Reflect / Reflect.setPrototypeOf", + "es6.promise": "Promise", + "es6.symbol": "Symbol", + "es6.symbol.has-instance": "well-known symbols / Symbol.hasInstance", "es6.symbol.is-concat-spreadable": "well-known symbols / Symbol.isConcatSpreadable", "es6.symbol.iterator": "well-known symbols / Symbol.iterator", @@ -47,13 +57,49 @@ module.exports = { "es6.symbol.to-primitive": "well-known symbols / Symbol.toPrimitive", "es6.symbol.to-string-tag": "well-known symbols / Symbol.toStringTag", "es6.symbol.unscopables": "well-known symbols / Symbol.unscopables", + "es6.object.assign": "Object static methods / Object.assign", "es6.object.is": "Object static methods / Object.is", "es6.object.get-own-property-symbols": "Object static methods / Object.getOwnPropertySymbols", "es6.object.set-prototype-of": "Object static methods / Object.setPrototypeOf", + "es6.function.name": 'function "name" property', + "es6.string.raw": "String static methods / String.raw", "es6.string.from-code-point": "String static methods / String.fromCodePoint", + + "es6.string.code-point-at": "String.prototype methods / String.prototype.codePointAt", + // "es6.string.normalize": "String.prototype methods / String.prototype.normalize", + "es6.string.repeat": "String.prototype methods / String.prototype.repeat", + "es6.string.starts-with": "String.prototype methods / String.prototype.startsWith", + "es6.string.ends-with": "String.prototype methods / String.prototype.endsWith", + "es6.string.includes": "String.prototype methods / String.prototype.includes", + + "es6.regexp.flags": "RegExp.prototype properties / RegExp.prototype.flags", + "es6.regexp.match": "RegExp.prototype properties / RegExp.prototype[Symbol.match]", + "es6.regexp.replace": "RegExp.prototype properties / RegExp.prototype[Symbol.replace]", + "es6.regexp.split": "RegExp.prototype properties / RegExp.prototype[Symbol.split]", + "es6.regexp.search": "RegExp.prototype properties / RegExp.prototype[Symbol.search]", + + "es6.array.from": "Array static methods / Array.from", + "es6.array.of": "Array static methods / Array.of", + + "es6.array.copy-within": "Array.prototype methods / Array.prototype.copyWithin", + "es6.array.find": "Array.prototype methods / Array.prototype.find", + "es6.array.find-index": "Array.prototype methods / Array.prototype.findIndex", + "es6.array.fill": "Array.prototype methods / Array.prototype.fill", + // "es6.array.keys": "Array.prototype methods / Array.prototype.keys", + // "es6.array.values": "Array.prototype methods / Array.prototype.values", + // "es6.array.entries": "Array.prototype methods / Array.prototype.entries", + + "es6.number.is-finite": "Number properties / Number.isFinite", + "es6.number.is-integer": "Number properties / Number.isInteger", + "es6.number.is-safe-integer": "Number properties / Number.isSafeInteger", + "es6.number.is-nan": "Number properties / Number.isNaN", + "es6.number.epsilon": "Number properties / Number.EPSILON", + "es6.number.min-safe-integer": "Number properties / Number.MIN_SAFE_INTEGER", + "es6.number.max-safe-integer": "Number properties / Number.MAX_SAFE_INTEGER", + "es6.math.acosh": "Math methods / Math.acosh", "es6.math.asinh": "Math methods / Math.asinh", "es6.math.atanh": "Math methods / Math.atanh", diff --git a/experimental/babel-preset-env/data/builtIns.json b/experimental/babel-preset-env/data/builtIns.json index 5cb586cfa9..cfefc72437 100644 --- a/experimental/babel-preset-env/data/builtIns.json +++ b/experimental/babel-preset-env/data/builtIns.json @@ -364,6 +364,201 @@ "node": 4, "ios": 9 }, + "es6.string.code-point-at": { + "chrome": 41, + "opera": 28, + "edge": 12, + "firefox": 29, + "safari": 9, + "node": 4, + "ios": 9 + }, + "es6.string.repeat": { + "chrome": 41, + "opera": 28, + "edge": 12, + "firefox": 24, + "safari": 9, + "node": 4, + "ios": 9 + }, + "es6.string.starts-with": { + "chrome": 41, + "opera": 28, + "edge": 12, + "firefox": 17, + "safari": 9, + "node": 4, + "ios": 9 + }, + "es6.string.ends-with": { + "chrome": 41, + "opera": 28, + "edge": 12, + "firefox": 17, + "safari": 9, + "node": 4, + "ios": 9 + }, + "es6.string.includes": { + "chrome": 41, + "opera": 28, + "edge": 12, + "firefox": 40, + "safari": 9, + "node": 4, + "ios": 9 + }, + "es6.regexp.flags": { + "chrome": 49, + "opera": 36, + "firefox": 37, + "safari": 9, + "ios": 9 + }, + "es6.regexp.match": { + "chrome": 50, + "opera": 37, + "firefox": 49, + "safari": 10, + "node": 6, + "ios": 10 + }, + "es6.regexp.replace": { + "chrome": 50, + "opera": 37, + "firefox": 49, + "safari": 10, + "node": 6, + "ios": 10 + }, + "es6.regexp.split": { + "chrome": 50, + "opera": 37, + "firefox": 49, + "safari": 10, + "node": 6, + "ios": 10 + }, + "es6.regexp.search": { + "chrome": 50, + "opera": 37, + "firefox": 49, + "safari": 10, + "node": 6, + "ios": 10 + }, + "es6.array.from": {}, + "es6.array.of": { + "chrome": 45, + "opera": 32, + "edge": 12, + "firefox": 25, + "safari": 9, + "node": 4, + "ios": 9 + }, + "es6.array.copy-within": { + "chrome": 45, + "opera": 32, + "edge": 12, + "firefox": 32, + "safari": 9, + "node": 4, + "ios": 9 + }, + "es6.array.find": { + "chrome": 45, + "opera": 32, + "edge": 12, + "firefox": 25, + "safari": 7, + "node": 4, + "ios": 10 + }, + "es6.array.find-index": { + "chrome": 45, + "opera": 32, + "edge": 12, + "firefox": 25, + "safari": 7, + "node": 4, + "ios": 10 + }, + "es6.array.fill": { + "chrome": 45, + "opera": 32, + "edge": 12, + "firefox": 31, + "safari": 7, + "node": 4, + "ios": 10 + }, + "es6.number.is-finite": { + "chrome": 19, + "opera": 6, + "edge": 12, + "firefox": 16, + "safari": 9, + "node": 0.12, + "android": 4.1, + "ios": 9 + }, + "es6.number.is-integer": { + "chrome": 34, + "opera": 21, + "edge": 12, + "firefox": 16, + "safari": 9, + "node": 0.12, + "ios": 9 + }, + "es6.number.is-safe-integer": { + "chrome": 34, + "opera": 21, + "edge": 12, + "firefox": 32, + "safari": 9, + "node": 0.12, + "ios": 9 + }, + "es6.number.is-nan": { + "chrome": 19, + "opera": 6, + "edge": 12, + "firefox": 15, + "safari": 9, + "node": 0.12, + "android": 4.1, + "ios": 9 + }, + "es6.number.epsilon": { + "chrome": 34, + "opera": 21, + "edge": 12, + "firefox": 25, + "safari": 9, + "node": 0.12, + "ios": 9 + }, + "es6.number.min-safe-integer": { + "chrome": 34, + "opera": 21, + "edge": 12, + "firefox": 31, + "safari": 9, + "node": 0.12, + "ios": 9 + }, + "es6.number.max-safe-integer": { + "chrome": 34, + "opera": 21, + "edge": 12, + "firefox": 31, + "safari": 9, + "node": 0.12, + "ios": 9 + }, "es6.math.acosh": { "chrome": 38, "opera": 25, diff --git a/experimental/babel-preset-env/src/index.js b/experimental/babel-preset-env/src/index.js index 8aa87c0162..6fabddd712 100644 --- a/experimental/babel-preset-env/src/index.js +++ b/experimental/babel-preset-env/src/index.js @@ -151,8 +151,6 @@ export default function buildPreset(context, opts = {}) { if (useBuiltIns) { polyfills = Object.keys(builtInsList) .filter((builtInName) => isPluginRequired(targets, builtInsList[builtInName])); - console.log(polyfills); - console.log(polyfills.length, Object.keys(builtInsList).length); } if (debug && !hasBeenLogged) { From d06270498bed713665970b242e40568676ccf7de Mon Sep 17 00:00:00 2001 From: Henry Zhu Date: Fri, 2 Dec 2016 17:58:31 -0500 Subject: [PATCH 07/21] add some tests --- .../src/transformPolyfillRequirePlugin.js | 24 +++++++++---------- .../use-builtins-chrome-55/actual.js | 1 - .../use-builtins-chrome-55/expected.js | 1 - .../use-builtins-import/actual.js | 2 ++ .../use-builtins-import/expected.js | 8 +++++++ .../options.json | 2 +- .../use-builtins-multiple-imports/actual.js | 3 +++ .../use-builtins-multiple-imports/expected.js | 8 +++++++ .../options.json | 11 +++++++++ .../use-builtins-require/actual.js | 3 +++ .../use-builtins-require/expected.js | 13 ++++++++++ .../use-builtins-require/options.json | 11 +++++++++ 12 files changed, 71 insertions(+), 16 deletions(-) delete mode 100644 experimental/babel-preset-env/test/fixtures/preset-options/use-builtins-chrome-55/actual.js delete mode 100644 experimental/babel-preset-env/test/fixtures/preset-options/use-builtins-chrome-55/expected.js create mode 100644 experimental/babel-preset-env/test/fixtures/preset-options/use-builtins-import/actual.js create mode 100644 experimental/babel-preset-env/test/fixtures/preset-options/use-builtins-import/expected.js rename experimental/babel-preset-env/test/fixtures/preset-options/{use-builtins-chrome-55 => use-builtins-import}/options.json (86%) create mode 100644 experimental/babel-preset-env/test/fixtures/preset-options/use-builtins-multiple-imports/actual.js create mode 100644 experimental/babel-preset-env/test/fixtures/preset-options/use-builtins-multiple-imports/expected.js create mode 100644 experimental/babel-preset-env/test/fixtures/preset-options/use-builtins-multiple-imports/options.json create mode 100644 experimental/babel-preset-env/test/fixtures/preset-options/use-builtins-require/actual.js create mode 100644 experimental/babel-preset-env/test/fixtures/preset-options/use-builtins-require/expected.js create mode 100644 experimental/babel-preset-env/test/fixtures/preset-options/use-builtins-require/options.json diff --git a/experimental/babel-preset-env/src/transformPolyfillRequirePlugin.js b/experimental/babel-preset-env/src/transformPolyfillRequirePlugin.js index a95339606c..674bdf8112 100644 --- a/experimental/babel-preset-env/src/transformPolyfillRequirePlugin.js +++ b/experimental/babel-preset-env/src/transformPolyfillRequirePlugin.js @@ -2,14 +2,8 @@ // or if more than one is found const polyfillSource = "babel-polyfill"; -let numPolyfillImports = 0; export default function ({ types: t }) { - function checkNumPolyfillImports() { - numPolyfillImports++; - return numPolyfillImports > 1; - } - function addImport(polyfill) { let declar = t.importDeclaration([], t.stringLiteral(`core-js/modules/${polyfill}`)); declar._blockHoist = 3; @@ -41,7 +35,8 @@ export default function ({ types: t }) { ImportDeclaration(path, state) { if (path.node.specifiers.length === 0 && path.node.source.value === polyfillSource) { - if (checkNumPolyfillImports()) { + this.numPolyfillImports++; + if (this.numPolyfillImports > 1) { path.remove(); return; } @@ -53,19 +48,19 @@ export default function ({ types: t }) { Program(path, state) { if (!state.opts.polyfills) { throw path.buildCodeFrameError(` -"polyfills" option not correctly passed -to the transform-polyfill-require plugin -in babel-preset-env +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, polyfillSource)) { - if (checkNumPolyfillImports()) { + this.numPolyfillImports++; + if (this.numPolyfillImports > 1) { path.remove(); return; } - let requires = state.opts.polyfills.map((p) => addRequire(p)); bodyPath.replaceWithMultiple(requires); } @@ -75,6 +70,9 @@ in babel-preset-env return { name: "transform-polyfill-require", - visitor: isPolyfillImport + visitor: isPolyfillImport, + pre() { + this.numPolyfillImports = 0; + } }; } diff --git a/experimental/babel-preset-env/test/fixtures/preset-options/use-builtins-chrome-55/actual.js b/experimental/babel-preset-env/test/fixtures/preset-options/use-builtins-chrome-55/actual.js deleted file mode 100644 index cb706b1a18..0000000000 --- a/experimental/babel-preset-env/test/fixtures/preset-options/use-builtins-chrome-55/actual.js +++ /dev/null @@ -1 +0,0 @@ -1 ** 2; diff --git a/experimental/babel-preset-env/test/fixtures/preset-options/use-builtins-chrome-55/expected.js b/experimental/babel-preset-env/test/fixtures/preset-options/use-builtins-chrome-55/expected.js deleted file mode 100644 index cb706b1a18..0000000000 --- a/experimental/babel-preset-env/test/fixtures/preset-options/use-builtins-chrome-55/expected.js +++ /dev/null @@ -1 +0,0 @@ -1 ** 2; diff --git a/experimental/babel-preset-env/test/fixtures/preset-options/use-builtins-import/actual.js b/experimental/babel-preset-env/test/fixtures/preset-options/use-builtins-import/actual.js new file mode 100644 index 0000000000..7d70ec7d7b --- /dev/null +++ b/experimental/babel-preset-env/test/fixtures/preset-options/use-builtins-import/actual.js @@ -0,0 +1,2 @@ +import "babel-polyfill"; +1 ** 2; diff --git a/experimental/babel-preset-env/test/fixtures/preset-options/use-builtins-import/expected.js b/experimental/babel-preset-env/test/fixtures/preset-options/use-builtins-import/expected.js new file mode 100644 index 0000000000..2a549c9084 --- /dev/null +++ b/experimental/babel-preset-env/test/fixtures/preset-options/use-builtins-import/expected.js @@ -0,0 +1,8 @@ +import "core-js/modules/es6.typed.data-view"; +import "core-js/modules/es6.reflect.apply"; +import "core-js/modules/es6.reflect.own-keys"; +import "core-js/modules/es6.symbol.iterator"; +import "core-js/modules/es6.symbol.species"; +import "core-js/modules/es6.array.from"; + +1 ** 2; diff --git a/experimental/babel-preset-env/test/fixtures/preset-options/use-builtins-chrome-55/options.json b/experimental/babel-preset-env/test/fixtures/preset-options/use-builtins-import/options.json similarity index 86% rename from experimental/babel-preset-env/test/fixtures/preset-options/use-builtins-chrome-55/options.json rename to experimental/babel-preset-env/test/fixtures/preset-options/use-builtins-import/options.json index 5199920de8..de09fa3f05 100644 --- a/experimental/babel-preset-env/test/fixtures/preset-options/use-builtins-chrome-55/options.json +++ b/experimental/babel-preset-env/test/fixtures/preset-options/use-builtins-import/options.json @@ -2,7 +2,7 @@ "presets": [ ["../../../../lib", { "targets": { - "chrome": 54 + "chrome": 55 }, "modules": false, "useBuiltIns": true diff --git a/experimental/babel-preset-env/test/fixtures/preset-options/use-builtins-multiple-imports/actual.js b/experimental/babel-preset-env/test/fixtures/preset-options/use-builtins-multiple-imports/actual.js new file mode 100644 index 0000000000..0ceedeffbd --- /dev/null +++ b/experimental/babel-preset-env/test/fixtures/preset-options/use-builtins-multiple-imports/actual.js @@ -0,0 +1,3 @@ +import "babel-polyfill"; +import "babel-polyfill"; +1 ** 2; diff --git a/experimental/babel-preset-env/test/fixtures/preset-options/use-builtins-multiple-imports/expected.js b/experimental/babel-preset-env/test/fixtures/preset-options/use-builtins-multiple-imports/expected.js new file mode 100644 index 0000000000..63154103bd --- /dev/null +++ b/experimental/babel-preset-env/test/fixtures/preset-options/use-builtins-multiple-imports/expected.js @@ -0,0 +1,8 @@ +import "core-js/modules/es6.typed.data-view"; +import "core-js/modules/es6.reflect.apply"; +import "core-js/modules/es6.reflect.own-keys"; +import "core-js/modules/es6.symbol.iterator"; +import "core-js/modules/es6.symbol.species"; +import "core-js/modules/es6.array.from"; + +1 ** 2; \ No newline at end of file diff --git a/experimental/babel-preset-env/test/fixtures/preset-options/use-builtins-multiple-imports/options.json b/experimental/babel-preset-env/test/fixtures/preset-options/use-builtins-multiple-imports/options.json new file mode 100644 index 0000000000..de09fa3f05 --- /dev/null +++ b/experimental/babel-preset-env/test/fixtures/preset-options/use-builtins-multiple-imports/options.json @@ -0,0 +1,11 @@ +{ + "presets": [ + ["../../../../lib", { + "targets": { + "chrome": 55 + }, + "modules": false, + "useBuiltIns": true + }] + ] +} diff --git a/experimental/babel-preset-env/test/fixtures/preset-options/use-builtins-require/actual.js b/experimental/babel-preset-env/test/fixtures/preset-options/use-builtins-require/actual.js new file mode 100644 index 0000000000..e17e21f341 --- /dev/null +++ b/experimental/babel-preset-env/test/fixtures/preset-options/use-builtins-require/actual.js @@ -0,0 +1,3 @@ +require("babel-polyfill"); + +1 ** 2; diff --git a/experimental/babel-preset-env/test/fixtures/preset-options/use-builtins-require/expected.js b/experimental/babel-preset-env/test/fixtures/preset-options/use-builtins-require/expected.js new file mode 100644 index 0000000000..68b7a9e2db --- /dev/null +++ b/experimental/babel-preset-env/test/fixtures/preset-options/use-builtins-require/expected.js @@ -0,0 +1,13 @@ +require("core-js/modules/es6.typed.data-view"); + +require("core-js/modules/es6.reflect.apply"); + +require("core-js/modules/es6.reflect.own-keys"); + +require("core-js/modules/es6.symbol.iterator"); + +require("core-js/modules/es6.symbol.species"); + +require("core-js/modules/es6.array.from"); + +1 ** 2; diff --git a/experimental/babel-preset-env/test/fixtures/preset-options/use-builtins-require/options.json b/experimental/babel-preset-env/test/fixtures/preset-options/use-builtins-require/options.json new file mode 100644 index 0000000000..de09fa3f05 --- /dev/null +++ b/experimental/babel-preset-env/test/fixtures/preset-options/use-builtins-require/options.json @@ -0,0 +1,11 @@ +{ + "presets": [ + ["../../../../lib", { + "targets": { + "chrome": 55 + }, + "modules": false, + "useBuiltIns": true + }] + ] +} From a238bf368aa9f059c1f09276fe5db10f9fd1a1b5 Mon Sep 17 00:00:00 2001 From: Henry Zhu Date: Fri, 2 Dec 2016 18:03:05 -0500 Subject: [PATCH 08/21] update readme --- experimental/babel-preset-env/README.md | 33 +++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/experimental/babel-preset-env/README.md b/experimental/babel-preset-env/README.md index 603cedc78d..a7799a840c 100644 --- a/experimental/babel-preset-env/README.md +++ b/experimental/babel-preset-env/README.md @@ -120,6 +120,39 @@ Useful if there is a bug in a native implementation, or a combination of a non-s Ex: Node 4 supports native classes but not spread. +### `useBuiltIns`: `boolean` + +Defaults to `false`. + +A way to apply `babel-preset-env` for polyfills (via "babel-polyfill"). + +``` +npm install babel-polyfill --save +``` + +This option will apply a new plugin that replaces the statement `import "babel-polyfill"` or `require("babel-polyfill")` with individual requires for `babel-polyfill` based on environment. + +> NOTE: This means you should only use `require("babel-polyfill");` once in your whole app. I would recommend just creating a single file that only does the require. + +In + +```js +import "babel-polyfill"; +``` + +Out (Different based on environment) + +```js +import "core-js/modules/es6.typed.data-view"; +import "core-js/modules/es6.reflect.apply"; +import "core-js/modules/es6.reflect.own-keys"; +import "core-js/modules/es6.symbol.iterator"; +import "core-js/modules/es6.symbol.species"; +import "core-js/modules/es6.array.from"; +``` + +--- + ## Examples ```js From 6ffd13af85bd5b53eb4d72b093d5daa028726e57 Mon Sep 17 00:00:00 2001 From: Henry Zhu Date: Mon, 5 Dec 2016 12:36:47 -0500 Subject: [PATCH 09/21] fixes --- experimental/babel-preset-env/README.md | 4 +- .../babel-preset-env/data/builtInFeatures.js | 42 ++++++++----------- .../babel-preset-env/data/pluginFeatures.js | 1 - experimental/babel-preset-env/package.json | 3 +- .../babel-preset-env/scripts/build-data.js | 6 +-- .../src/transformPolyfillRequirePlugin.js | 3 -- 6 files changed, 25 insertions(+), 34 deletions(-) diff --git a/experimental/babel-preset-env/README.md b/experimental/babel-preset-env/README.md index a7799a840c..6a2f4ee669 100644 --- a/experimental/babel-preset-env/README.md +++ b/experimental/babel-preset-env/README.md @@ -132,7 +132,7 @@ npm install babel-polyfill --save This option will apply a new plugin that replaces the statement `import "babel-polyfill"` or `require("babel-polyfill")` with individual requires for `babel-polyfill` based on environment. -> NOTE: This means you should only use `require("babel-polyfill");` once in your whole app. I would recommend just creating a single file that only does the require. +> NOTE: Only use `require("babel-polyfill");` once in your whole app. One option is to create single entry file that only contains the require statement. In @@ -140,7 +140,7 @@ In import "babel-polyfill"; ``` -Out (Different based on environment) +Out (different based on environment) ```js import "core-js/modules/es6.typed.data-view"; diff --git a/experimental/babel-preset-env/data/builtInFeatures.js b/experimental/babel-preset-env/data/builtInFeatures.js index 1899f9e8d5..be3614d92b 100644 --- a/experimental/babel-preset-env/data/builtInFeatures.js +++ b/experimental/babel-preset-env/data/builtInFeatures.js @@ -1,6 +1,5 @@ // https://github.com/zloirock/core-js -/* eslint-disable quotes */ module.exports = { // es2015 // core-js/fn/map @@ -18,17 +17,12 @@ module.exports = { "es6.typed.float64-array": "typed arrays / Float64Array", "es6.map": "Map", - "es6.set": "Set", - "es6.weak-map": "WeakMap", - "es6.weak-set": "WeakSet", + // proxy not implemented - // no proxy - - "es6.reflect": "Reflect", - "es6.reflect.apply": "Reflect / ", + "es6.reflect.apply": "Reflect / Reflect.apply", "es6.reflect.construct": "Reflect / Reflect.construct", "es6.reflect.define-property": "Reflect / Reflect.defineProperty", "es6.reflect.delete-property": "Reflect / Reflect.deleteProperty", @@ -43,20 +37,19 @@ module.exports = { "es6.reflect.set-prototype-of": "Reflect / Reflect.setPrototypeOf", "es6.promise": "Promise", - "es6.symbol": "Symbol", - "es6.symbol.has-instance": "well-known symbols / Symbol.hasInstance", - "es6.symbol.is-concat-spreadable": "well-known symbols / Symbol.isConcatSpreadable", - "es6.symbol.iterator": "well-known symbols / Symbol.iterator", - "es6.symbol.match": "well-known symbols / Symbol.match", - "es6.symbol.replace": "well-known symbols / Symbol.replace", - "es6.symbol.search": "well-known symbols / Symbol.search", - "es6.symbol.species": "well-known symbols / Symbol.species", - "es6.symbol.split": "well-known symbols / Symbol.split", - "es6.symbol.to-primitive": "well-known symbols / Symbol.toPrimitive", - "es6.symbol.to-string-tag": "well-known symbols / Symbol.toStringTag", - "es6.symbol.unscopables": "well-known symbols / Symbol.unscopables", + "es6.symbol": "well-known symbols / Symbol.hasInstance", + "es6.symbol": "well-known symbols / Symbol.isConcatSpreadable", + "es6.symbol": "well-known symbols / Symbol.iterator", + "es6.symbol": "well-known symbols / Symbol.match", + "es6.symbol": "well-known symbols / Symbol.replace", + "es6.symbol": "well-known symbols / Symbol.search", + "es6.symbol": "well-known symbols / Symbol.species", + "es6.symbol": "well-known symbols / Symbol.split", + "es6.symbol": "well-known symbols / Symbol.toPrimitive", + "es6.symbol": "well-known symbols / Symbol.toStringTag", + "es6.symbol": "well-known symbols / Symbol.unscopables", "es6.object.assign": "Object static methods / Object.assign", "es6.object.is": "Object static methods / Object.is", @@ -69,7 +62,7 @@ module.exports = { "es6.string.from-code-point": "String static methods / String.fromCodePoint", "es6.string.code-point-at": "String.prototype methods / String.prototype.codePointAt", - // "es6.string.normalize": "String.prototype methods / String.prototype.normalize", + // "String.prototype methods / String.prototype.normalize" not implemented "es6.string.repeat": "String.prototype methods / String.prototype.repeat", "es6.string.starts-with": "String.prototype methods / String.prototype.startsWith", "es6.string.ends-with": "String.prototype methods / String.prototype.endsWith", @@ -88,9 +81,10 @@ module.exports = { "es6.array.find": "Array.prototype methods / Array.prototype.find", "es6.array.find-index": "Array.prototype methods / Array.prototype.findIndex", "es6.array.fill": "Array.prototype methods / Array.prototype.fill", - // "es6.array.keys": "Array.prototype methods / Array.prototype.keys", - // "es6.array.values": "Array.prototype methods / Array.prototype.values", - // "es6.array.entries": "Array.prototype methods / Array.prototype.entries", + "es6.array.iterator": "Array.prototype methods / Array.prototype.keys", + // can use Symbol.iterator, not implemented in many environments + // "es6.array.iterator": "Array.prototype methods / Array.prototype.values", + "es6.array.iterator": "Array.prototype methods / Array.prototype.entries", "es6.number.is-finite": "Number properties / Number.isFinite", "es6.number.is-integer": "Number properties / Number.isInteger", diff --git a/experimental/babel-preset-env/data/pluginFeatures.js b/experimental/babel-preset-env/data/pluginFeatures.js index b5037d9888..c084be5a72 100644 --- a/experimental/babel-preset-env/data/pluginFeatures.js +++ b/experimental/babel-preset-env/data/pluginFeatures.js @@ -1,4 +1,3 @@ -/* eslint-disable quotes */ module.exports = { // es2015 "transform-es2015-arrow-functions": { diff --git a/experimental/babel-preset-env/package.json b/experimental/babel-preset-env/package.json index 7a97cfb44e..bafa0df101 100644 --- a/experimental/babel-preset-env/package.json +++ b/experimental/babel-preset-env/package.json @@ -82,7 +82,8 @@ "sourceType": "module" }, "rules": { - "max-len": 0 + "max-len": 0, + "quotes": ["error", "double", { "avoidEscape": true }] }, "env": { "mocha": true diff --git a/experimental/babel-preset-env/scripts/build-data.js b/experimental/babel-preset-env/scripts/build-data.js index 42ec569995..73ea71323b 100644 --- a/experimental/babel-preset-env/scripts/build-data.js +++ b/experimental/babel-preset-env/scripts/build-data.js @@ -137,9 +137,9 @@ function generateData(features) { // add opera if (plugin.chrome) { - plugin.opera = plugin.chrome - 13; - - if (plugin.chrome === 5) { + if (plugin.chrome >= 28) { + plugin.opera = plugin.chrome - 13; + } else if (plugin.chrome === 5) { plugin.opera = 12; } } diff --git a/experimental/babel-preset-env/src/transformPolyfillRequirePlugin.js b/experimental/babel-preset-env/src/transformPolyfillRequirePlugin.js index 674bdf8112..5fa0a21dba 100644 --- a/experimental/babel-preset-env/src/transformPolyfillRequirePlugin.js +++ b/experimental/babel-preset-env/src/transformPolyfillRequirePlugin.js @@ -1,6 +1,3 @@ -// Should throw if no babel-polyfill import is found in all files -// or if more than one is found - const polyfillSource = "babel-polyfill"; export default function ({ types: t }) { From 99c078e92a3f4f22024395aa84ab106cdd80ea1a Mon Sep 17 00:00:00 2001 From: Artem Yavorsky Date: Mon, 5 Dec 2016 23:24:36 +0200 Subject: [PATCH 10/21] Add logs for polyfills. (#59) --- experimental/babel-preset-env/src/index.js | 30 ++++++++++++++-------- 1 file changed, 20 insertions(+), 10 deletions(-) diff --git a/experimental/babel-preset-env/src/index.js b/experimental/babel-preset-env/src/index.js index 6fabddd712..e2eeb6a7c3 100644 --- a/experimental/babel-preset-env/src/index.js +++ b/experimental/babel-preset-env/src/index.js @@ -136,6 +136,17 @@ export const validateWhitelistOption = (whitelistOpt = []) => { let hasBeenLogged = false; +const logPlugin = (plugin, targets, list) => { + const envList = list[plugin]; + const filteredList = Object.keys(targets) + .reduce((a, b) => { + a[b] = envList[b]; + return a; + }, {}); + const logStr = `\n ${plugin} ${JSON.stringify(filteredList)}`; + console.log(logStr); +}; + export default function buildPreset(context, opts = {}) { const loose = validateLooseOption(opts.loose); const moduleType = validateModulesOption(opts.modules); @@ -155,23 +166,22 @@ export default function buildPreset(context, opts = {}) { if (debug && !hasBeenLogged) { hasBeenLogged = true; - console.log("babel-preset-env: `DEBUG` option"); console.log(""); console.log(`Using targets: ${JSON.stringify(targets, null, 2)}`); console.log(""); - console.log("Using plugins:"); - console.log(""); console.log(`module: ${moduleType}`); + console.log(""); + console.log("Using plugins:"); transformations.forEach((transform) => { - let envList = pluginList[transform]; - let filteredList = Object.keys(targets) - .reduce((a, b) => { - a[b] = envList[b]; - return a; - }, {}); - console.log(transform, JSON.stringify(filteredList, null, 2)); + logPlugin(transform, targets, pluginList); }); + console.log("\nUsing polyfills:"); + if (useBuiltIns && polyfills.length) { + polyfills.forEach((polyfill) => { + logPlugin(polyfill, targets, builtInsList); + }); + } } transformations = [...transformations, ...whitelist].map((pluginName) => { From 4d40b6ab5b316bcf42d2f48212dc6d8a57983617 Mon Sep 17 00:00:00 2001 From: Brian Ng Date: Fri, 2 Dec 2016 15:55:02 -0600 Subject: [PATCH 11/21] Add builtins for object and es7 string --- experimental/babel-preset-env/data/builtInFeatures.js | 5 ++++- experimental/babel-preset-env/data/builtIns.json | 10 ++++++++++ 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/experimental/babel-preset-env/data/builtInFeatures.js b/experimental/babel-preset-env/data/builtInFeatures.js index be3614d92b..f1153e268c 100644 --- a/experimental/babel-preset-env/data/builtInFeatures.js +++ b/experimental/babel-preset-env/data/builtInFeatures.js @@ -110,5 +110,8 @@ module.exports = { "es6.math.sign": "Math methods / Math.sign", "es6.math.sinh": "Math methods / Math.sinh", "es6.math.tanh": "Math methods / Math.tanh", - "es6.math.trunc": "Math methods / Math.trunc" + "es6.math.trunc": "Math methods / Math.trunc", + + "es7.string.pad-start": "String padding / String.prototype.padStart", + "es7.string.pad-end": "String padding / String.prototype.padEnd" }; diff --git a/experimental/babel-preset-env/data/builtIns.json b/experimental/babel-preset-env/data/builtIns.json index cfefc72437..977e365bd1 100644 --- a/experimental/babel-preset-env/data/builtIns.json +++ b/experimental/babel-preset-env/data/builtIns.json @@ -712,5 +712,15 @@ "safari": 7, "node": 0.12, "ios": 10 + }, + "es7.string.pad-start": { + "firefox": 48, + "safari": 10, + "ios": 10 + }, + "es7.string.pad-end": { + "firefox": 48, + "safari": 10, + "ios": 10 } } From bd1ed28242d6eb38dd8de2a87f054bfc0aeac161 Mon Sep 17 00:00:00 2001 From: Henry Zhu Date: Mon, 5 Dec 2016 16:34:07 -0500 Subject: [PATCH 12/21] separate years, add es2016, es2017 --- .../babel-preset-env/data/builtInFeatures.js | 22 +++++++++++++------ .../use-builtins-import/expected.js | 2 ++ .../use-builtins-multiple-imports/expected.js | 4 +++- .../use-builtins-require/expected.js | 4 ++++ 4 files changed, 24 insertions(+), 8 deletions(-) diff --git a/experimental/babel-preset-env/data/builtInFeatures.js b/experimental/babel-preset-env/data/builtInFeatures.js index f1153e268c..9d794954ea 100644 --- a/experimental/babel-preset-env/data/builtInFeatures.js +++ b/experimental/babel-preset-env/data/builtInFeatures.js @@ -1,9 +1,6 @@ // https://github.com/zloirock/core-js -module.exports = { - // es2015 - // core-js/fn/map - +const es2015 = { // "es6.typed/array-buffer": "typed arrays / ", "es6.typed.data-view": "typed arrays / DataView", "es6.typed.int8-array": "typed arrays / Int8Array", @@ -111,7 +108,18 @@ module.exports = { "es6.math.sinh": "Math methods / Math.sinh", "es6.math.tanh": "Math methods / Math.tanh", "es6.math.trunc": "Math methods / Math.trunc", - - "es7.string.pad-start": "String padding / String.prototype.padStart", - "es7.string.pad-end": "String padding / String.prototype.padEnd" }; + +const es2016 = { + "es7.array.includes.js": "Array.prototype.includes", +}; + +const es2017 = { + "es7.object.values": "Object.values", + "es7.object.entries": "Object.entries", + "es7.object.get-own-property-descriptors": "Object.getOwnPropertyDescriptors", + "es7.string.pad-start": "String padding / String.prototype.padStart", + "es7.string.pad-end": "String padding / String.prototype.padEnd", +}; + +module.exports = Object.assign({}, es2015, es2016, es2017); diff --git a/experimental/babel-preset-env/test/fixtures/preset-options/use-builtins-import/expected.js b/experimental/babel-preset-env/test/fixtures/preset-options/use-builtins-import/expected.js index 2a549c9084..9204db70e8 100644 --- a/experimental/babel-preset-env/test/fixtures/preset-options/use-builtins-import/expected.js +++ b/experimental/babel-preset-env/test/fixtures/preset-options/use-builtins-import/expected.js @@ -4,5 +4,7 @@ import "core-js/modules/es6.reflect.own-keys"; import "core-js/modules/es6.symbol.iterator"; import "core-js/modules/es6.symbol.species"; import "core-js/modules/es6.array.from"; +import "core-js/modules/es7.string.pad-start"; +import "core-js/modules/es7.string.pad-end"; 1 ** 2; diff --git a/experimental/babel-preset-env/test/fixtures/preset-options/use-builtins-multiple-imports/expected.js b/experimental/babel-preset-env/test/fixtures/preset-options/use-builtins-multiple-imports/expected.js index 63154103bd..9204db70e8 100644 --- a/experimental/babel-preset-env/test/fixtures/preset-options/use-builtins-multiple-imports/expected.js +++ b/experimental/babel-preset-env/test/fixtures/preset-options/use-builtins-multiple-imports/expected.js @@ -4,5 +4,7 @@ import "core-js/modules/es6.reflect.own-keys"; import "core-js/modules/es6.symbol.iterator"; import "core-js/modules/es6.symbol.species"; import "core-js/modules/es6.array.from"; +import "core-js/modules/es7.string.pad-start"; +import "core-js/modules/es7.string.pad-end"; -1 ** 2; \ No newline at end of file +1 ** 2; diff --git a/experimental/babel-preset-env/test/fixtures/preset-options/use-builtins-require/expected.js b/experimental/babel-preset-env/test/fixtures/preset-options/use-builtins-require/expected.js index 68b7a9e2db..a55b23b8b6 100644 --- a/experimental/babel-preset-env/test/fixtures/preset-options/use-builtins-require/expected.js +++ b/experimental/babel-preset-env/test/fixtures/preset-options/use-builtins-require/expected.js @@ -10,4 +10,8 @@ require("core-js/modules/es6.symbol.species"); require("core-js/modules/es6.array.from"); +require("core-js/modules/es7.string.pad-start"); + +require("core-js/modules/es7.string.pad-end"); + 1 ** 2; From 771e5d2cd619878d9a304a9198b8082e799f52bd Mon Sep 17 00:00:00 2001 From: Henry Zhu Date: Tue, 6 Dec 2016 10:30:34 -0500 Subject: [PATCH 13/21] account for multiple features (#62) --- .../babel-preset-env/data/builtIns.json | 162 ++++++++---------- .../babel-preset-env/scripts/build-data.js | 7 +- .../use-builtins-import/expected.js | 6 - .../use-builtins-multiple-imports/expected.js | 6 - .../use-builtins-require/expected.js | 12 -- 5 files changed, 79 insertions(+), 114 deletions(-) diff --git a/experimental/babel-preset-env/data/builtIns.json b/experimental/babel-preset-env/data/builtIns.json index 977e365bd1..cf93685f23 100644 --- a/experimental/babel-preset-env/data/builtIns.json +++ b/experimental/babel-preset-env/data/builtIns.json @@ -1,5 +1,14 @@ { - "es6.typed.data-view": {}, + "es6.typed.data-view": { + "chrome": 5, + "opera": 12, + "firefox": 15, + "safari": 5, + "node": 0.12, + "ie": 10, + "android": 4, + "ios": 6 + }, "es6.typed.int8-array": { "chrome": 5, "opera": 12, @@ -115,16 +124,7 @@ "safari": 9, "ios": 9 }, - "es6.reflect": { - "chrome": 49, - "opera": 36, - "edge": 13, - "firefox": 45, - "safari": 10, - "ios": 10 - }, - "es6.reflect.apply": {}, - "es6.reflect.construct": { + "es6.reflect.apply": { "chrome": 49, "opera": 36, "edge": 12, @@ -132,6 +132,14 @@ "safari": 10, "ios": 10 }, + "es6.reflect.construct": { + "chrome": 49, + "opera": 36, + "edge": 13, + "firefox": 45, + "safari": 10, + "ios": 10 + }, "es6.reflect.define-property": { "chrome": 49, "opera": 36, @@ -188,7 +196,14 @@ "safari": 10, "ios": 10 }, - "es6.reflect.own-keys": {}, + "es6.reflect.own-keys": { + "chrome": 49, + "opera": 36, + "edge": 12, + "firefox": 42, + "safari": 10, + "ios": 10 + }, "es6.reflect.prevent-extensions": { "chrome": 49, "opera": 36, @@ -223,77 +238,6 @@ "ios": 10 }, "es6.symbol": { - "chrome": 49, - "opera": 36, - "edge": 13, - "firefox": 36, - "safari": 10, - "ios": 10 - }, - "es6.symbol.has-instance": { - "chrome": 51, - "opera": 38, - "firefox": 50, - "safari": 10, - "node": 6.5, - "ios": 10 - }, - "es6.symbol.is-concat-spreadable": { - "chrome": 48, - "opera": 35, - "firefox": 48, - "safari": 10, - "ios": 10 - }, - "es6.symbol.iterator": {}, - "es6.symbol.match": { - "chrome": 50, - "opera": 37, - "firefox": 49, - "safari": 10, - "node": 6, - "ios": 10 - }, - "es6.symbol.replace": { - "chrome": 50, - "opera": 37, - "firefox": 49, - "safari": 10, - "node": 6, - "ios": 10 - }, - "es6.symbol.search": { - "chrome": 50, - "opera": 37, - "firefox": 49, - "safari": 10, - "node": 6, - "ios": 10 - }, - "es6.symbol.species": {}, - "es6.symbol.split": { - "chrome": 50, - "opera": 37, - "firefox": 49, - "safari": 10, - "node": 6, - "ios": 10 - }, - "es6.symbol.to-primitive": { - "chrome": 47, - "opera": 34, - "firefox": 44, - "safari": 10, - "ios": 10 - }, - "es6.symbol.to-string-tag": { - "chrome": 49, - "opera": 36, - "firefox": 51, - "safari": 10, - "ios": 10 - }, - "es6.symbol.unscopables": { "chrome": 38, "opera": 25, "edge": 12, @@ -313,7 +257,6 @@ }, "es6.object.is": { "chrome": 19, - "opera": 6, "edge": 12, "firefox": 22, "safari": 9, @@ -386,7 +329,7 @@ "chrome": 41, "opera": 28, "edge": 12, - "firefox": 17, + "firefox": 29, "safari": 9, "node": 4, "ios": 9 @@ -395,7 +338,7 @@ "chrome": 41, "opera": 28, "edge": 12, - "firefox": 17, + "firefox": 29, "safari": 9, "node": 4, "ios": 9 @@ -448,7 +391,13 @@ "node": 6, "ios": 10 }, - "es6.array.from": {}, + "es6.array.from": { + "chrome": 51, + "opera": 38, + "safari": 10, + "node": 6.5, + "ios": 10 + }, "es6.array.of": { "chrome": 45, "opera": 32, @@ -494,9 +443,17 @@ "node": 4, "ios": 10 }, + "es6.array.iterator": { + "chrome": 38, + "opera": 25, + "edge": 12, + "firefox": 28, + "safari": 7, + "node": 0.12, + "ios": 10 + }, "es6.number.is-finite": { "chrome": 19, - "opera": 6, "edge": 12, "firefox": 16, "safari": 9, @@ -524,7 +481,6 @@ }, "es6.number.is-nan": { "chrome": 19, - "opera": 6, "edge": 12, "firefox": 15, "safari": 9, @@ -713,6 +669,34 @@ "node": 0.12, "ios": 10 }, + "es7.array.includes.js": { + "chrome": 47, + "opera": 34, + "edge": 14, + "firefox": 43, + "safari": 10, + "ios": 10 + }, + "es7.object.values": { + "chrome": 54, + "opera": 41, + "edge": 14, + "firefox": 47, + "node": 7 + }, + "es7.object.entries": { + "chrome": 54, + "opera": 41, + "edge": 14, + "firefox": 47, + "node": 7 + }, + "es7.object.get-own-property-descriptors": { + "chrome": 54, + "opera": 41, + "firefox": 50, + "node": 7 + }, "es7.string.pad-start": { "firefox": 48, "safari": 10, diff --git a/experimental/babel-preset-env/scripts/build-data.js b/experimental/babel-preset-env/scripts/build-data.js index 73ea71323b..fbf8badc2f 100644 --- a/experimental/babel-preset-env/scripts/build-data.js +++ b/experimental/babel-preset-env/scripts/build-data.js @@ -66,7 +66,12 @@ const envMap = { const getLowestImplementedVersion = ({ features }, env) => { let tests = flatten(compatibilityTests - .filter((test) => features.indexOf(test.name) >= 0) + .filter((test) => { + return features.indexOf(test.name) >= 0 || + // for features === ["DataView"] + // it covers "DataView (Int8)" and "DataView (UInt8)" + features.length === 1 && test.name.indexOf(features[0]) === 0; + }) .map((test) => { return test.subtests ? test.subtests.map((subtest) => ({ diff --git a/experimental/babel-preset-env/test/fixtures/preset-options/use-builtins-import/expected.js b/experimental/babel-preset-env/test/fixtures/preset-options/use-builtins-import/expected.js index 9204db70e8..5fe99c52a3 100644 --- a/experimental/babel-preset-env/test/fixtures/preset-options/use-builtins-import/expected.js +++ b/experimental/babel-preset-env/test/fixtures/preset-options/use-builtins-import/expected.js @@ -1,9 +1,3 @@ -import "core-js/modules/es6.typed.data-view"; -import "core-js/modules/es6.reflect.apply"; -import "core-js/modules/es6.reflect.own-keys"; -import "core-js/modules/es6.symbol.iterator"; -import "core-js/modules/es6.symbol.species"; -import "core-js/modules/es6.array.from"; import "core-js/modules/es7.string.pad-start"; import "core-js/modules/es7.string.pad-end"; diff --git a/experimental/babel-preset-env/test/fixtures/preset-options/use-builtins-multiple-imports/expected.js b/experimental/babel-preset-env/test/fixtures/preset-options/use-builtins-multiple-imports/expected.js index 9204db70e8..5fe99c52a3 100644 --- a/experimental/babel-preset-env/test/fixtures/preset-options/use-builtins-multiple-imports/expected.js +++ b/experimental/babel-preset-env/test/fixtures/preset-options/use-builtins-multiple-imports/expected.js @@ -1,9 +1,3 @@ -import "core-js/modules/es6.typed.data-view"; -import "core-js/modules/es6.reflect.apply"; -import "core-js/modules/es6.reflect.own-keys"; -import "core-js/modules/es6.symbol.iterator"; -import "core-js/modules/es6.symbol.species"; -import "core-js/modules/es6.array.from"; import "core-js/modules/es7.string.pad-start"; import "core-js/modules/es7.string.pad-end"; diff --git a/experimental/babel-preset-env/test/fixtures/preset-options/use-builtins-require/expected.js b/experimental/babel-preset-env/test/fixtures/preset-options/use-builtins-require/expected.js index a55b23b8b6..8b669141c2 100644 --- a/experimental/babel-preset-env/test/fixtures/preset-options/use-builtins-require/expected.js +++ b/experimental/babel-preset-env/test/fixtures/preset-options/use-builtins-require/expected.js @@ -1,15 +1,3 @@ -require("core-js/modules/es6.typed.data-view"); - -require("core-js/modules/es6.reflect.apply"); - -require("core-js/modules/es6.reflect.own-keys"); - -require("core-js/modules/es6.symbol.iterator"); - -require("core-js/modules/es6.symbol.species"); - -require("core-js/modules/es6.array.from"); - require("core-js/modules/es7.string.pad-start"); require("core-js/modules/es7.string.pad-end"); From 69e9138637308e782a44806d4271a368bfb022e1 Mon Sep 17 00:00:00 2001 From: Henry Zhu Date: Tue, 6 Dec 2016 10:31:30 -0500 Subject: [PATCH 14/21] extra tests --- .../use-builtins-chrome-48/actual.js | 2 ++ .../use-builtins-chrome-48/expected.js | 32 +++++++++++++++++++ .../use-builtins-chrome-48/options.json | 11 +++++++ .../use-builtins-chrome-49/actual.js | 2 ++ .../use-builtins-chrome-49/expected.js | 18 +++++++++++ .../use-builtins-chrome-49/options.json | 11 +++++++ 6 files changed, 76 insertions(+) create mode 100644 experimental/babel-preset-env/test/fixtures/preset-options/use-builtins-chrome-48/actual.js create mode 100644 experimental/babel-preset-env/test/fixtures/preset-options/use-builtins-chrome-48/expected.js create mode 100644 experimental/babel-preset-env/test/fixtures/preset-options/use-builtins-chrome-48/options.json create mode 100644 experimental/babel-preset-env/test/fixtures/preset-options/use-builtins-chrome-49/actual.js create mode 100644 experimental/babel-preset-env/test/fixtures/preset-options/use-builtins-chrome-49/expected.js create mode 100644 experimental/babel-preset-env/test/fixtures/preset-options/use-builtins-chrome-49/options.json diff --git a/experimental/babel-preset-env/test/fixtures/preset-options/use-builtins-chrome-48/actual.js b/experimental/babel-preset-env/test/fixtures/preset-options/use-builtins-chrome-48/actual.js new file mode 100644 index 0000000000..7d70ec7d7b --- /dev/null +++ b/experimental/babel-preset-env/test/fixtures/preset-options/use-builtins-chrome-48/actual.js @@ -0,0 +1,2 @@ +import "babel-polyfill"; +1 ** 2; diff --git a/experimental/babel-preset-env/test/fixtures/preset-options/use-builtins-chrome-48/expected.js b/experimental/babel-preset-env/test/fixtures/preset-options/use-builtins-chrome-48/expected.js new file mode 100644 index 0000000000..dd800cdd78 --- /dev/null +++ b/experimental/babel-preset-env/test/fixtures/preset-options/use-builtins-chrome-48/expected.js @@ -0,0 +1,32 @@ +import "core-js/modules/es6.map"; +import "core-js/modules/es6.set"; +import "core-js/modules/es6.weak-map"; +import "core-js/modules/es6.weak-set"; +import "core-js/modules/es6.reflect.apply"; +import "core-js/modules/es6.reflect.construct"; +import "core-js/modules/es6.reflect.define-property"; +import "core-js/modules/es6.reflect.delete-property"; +import "core-js/modules/es6.reflect.get"; +import "core-js/modules/es6.reflect.get-own-property-descriptor"; +import "core-js/modules/es6.reflect.get-prototype-of"; +import "core-js/modules/es6.reflect.has"; +import "core-js/modules/es6.reflect.is-extensible"; +import "core-js/modules/es6.reflect.own-keys"; +import "core-js/modules/es6.reflect.prevent-extensions"; +import "core-js/modules/es6.reflect.set"; +import "core-js/modules/es6.reflect.set-prototype-of"; +import "core-js/modules/es6.promise"; +import "core-js/modules/es6.function.name"; +import "core-js/modules/es6.regexp.flags"; +import "core-js/modules/es6.regexp.match"; +import "core-js/modules/es6.regexp.replace"; +import "core-js/modules/es6.regexp.split"; +import "core-js/modules/es6.regexp.search"; +import "core-js/modules/es6.array.from"; +import "core-js/modules/es7.object.values"; +import "core-js/modules/es7.object.entries"; +import "core-js/modules/es7.object.get-own-property-descriptors"; +import "core-js/modules/es7.string.pad-start"; +import "core-js/modules/es7.string.pad-end"; + +Math.pow(1, 2); \ No newline at end of file diff --git a/experimental/babel-preset-env/test/fixtures/preset-options/use-builtins-chrome-48/options.json b/experimental/babel-preset-env/test/fixtures/preset-options/use-builtins-chrome-48/options.json new file mode 100644 index 0000000000..4ada141379 --- /dev/null +++ b/experimental/babel-preset-env/test/fixtures/preset-options/use-builtins-chrome-48/options.json @@ -0,0 +1,11 @@ +{ + "presets": [ + ["../../../../lib", { + "targets": { + "chrome": 48 + }, + "modules": false, + "useBuiltIns": true + }] + ] +} diff --git a/experimental/babel-preset-env/test/fixtures/preset-options/use-builtins-chrome-49/actual.js b/experimental/babel-preset-env/test/fixtures/preset-options/use-builtins-chrome-49/actual.js new file mode 100644 index 0000000000..7d70ec7d7b --- /dev/null +++ b/experimental/babel-preset-env/test/fixtures/preset-options/use-builtins-chrome-49/actual.js @@ -0,0 +1,2 @@ +import "babel-polyfill"; +1 ** 2; diff --git a/experimental/babel-preset-env/test/fixtures/preset-options/use-builtins-chrome-49/expected.js b/experimental/babel-preset-env/test/fixtures/preset-options/use-builtins-chrome-49/expected.js new file mode 100644 index 0000000000..72de16631b --- /dev/null +++ b/experimental/babel-preset-env/test/fixtures/preset-options/use-builtins-chrome-49/expected.js @@ -0,0 +1,18 @@ +import "core-js/modules/es6.map"; +import "core-js/modules/es6.set"; +import "core-js/modules/es6.weak-map"; +import "core-js/modules/es6.weak-set"; +import "core-js/modules/es6.promise"; +import "core-js/modules/es6.function.name"; +import "core-js/modules/es6.regexp.match"; +import "core-js/modules/es6.regexp.replace"; +import "core-js/modules/es6.regexp.split"; +import "core-js/modules/es6.regexp.search"; +import "core-js/modules/es6.array.from"; +import "core-js/modules/es7.object.values"; +import "core-js/modules/es7.object.entries"; +import "core-js/modules/es7.object.get-own-property-descriptors"; +import "core-js/modules/es7.string.pad-start"; +import "core-js/modules/es7.string.pad-end"; + +Math.pow(1, 2); diff --git a/experimental/babel-preset-env/test/fixtures/preset-options/use-builtins-chrome-49/options.json b/experimental/babel-preset-env/test/fixtures/preset-options/use-builtins-chrome-49/options.json new file mode 100644 index 0000000000..66930156ff --- /dev/null +++ b/experimental/babel-preset-env/test/fixtures/preset-options/use-builtins-chrome-49/options.json @@ -0,0 +1,11 @@ +{ + "presets": [ + ["../../../../lib", { + "targets": { + "chrome": 49 + }, + "modules": false, + "useBuiltIns": true + }] + ] +} From 5d32ca6bb38b6c15525913bce5d84378e35dcc4a Mon Sep 17 00:00:00 2001 From: Henry Zhu Date: Tue, 6 Dec 2016 12:01:47 -0500 Subject: [PATCH 15/21] prevent duplicate imports --- .../src/transformPolyfillRequirePlugin.js | 12 ++++++++---- .../plugin-options/filters-duplicates/actual.js | 1 + .../plugin-options/filters-duplicates/expected.js | 2 ++ .../plugin-options/filters-duplicates/options.json | 11 +++++++++++ 4 files changed, 22 insertions(+), 4 deletions(-) create mode 100644 experimental/babel-preset-env/test/fixtures/plugin-options/filters-duplicates/actual.js create mode 100644 experimental/babel-preset-env/test/fixtures/plugin-options/filters-duplicates/expected.js create mode 100644 experimental/babel-preset-env/test/fixtures/plugin-options/filters-duplicates/options.json diff --git a/experimental/babel-preset-env/src/transformPolyfillRequirePlugin.js b/experimental/babel-preset-env/src/transformPolyfillRequirePlugin.js index 5fa0a21dba..6412dbe5af 100644 --- a/experimental/babel-preset-env/src/transformPolyfillRequirePlugin.js +++ b/experimental/babel-preset-env/src/transformPolyfillRequirePlugin.js @@ -1,13 +1,13 @@ const polyfillSource = "babel-polyfill"; export default function ({ types: t }) { - function addImport(polyfill) { + function createImportDeclaration(polyfill) { let declar = t.importDeclaration([], t.stringLiteral(`core-js/modules/${polyfill}`)); declar._blockHoist = 3; return declar; } - function addRequire(polyfill) { + function createRequireStatement(polyfill) { return t.expressionStatement( t.callExpression( t.identifier("require"), @@ -38,7 +38,9 @@ export default function ({ types: t }) { return; } - let imports = state.opts.polyfills.map((p) => addImport(p)); + let imports = state.opts.polyfills + .filter((el, i, arr) => arr.indexOf(el) === i) + .map((p) => createImportDeclaration(p)); path.replaceWithMultiple(imports); } }, @@ -58,7 +60,9 @@ to the "transform-polyfill-require" plugin return; } - let requires = state.opts.polyfills.map((p) => addRequire(p)); + let requires = state.opts.polyfills + .filter((el, i, arr) => arr.indexOf(el) === i) + .map((p) => createRequireStatement(p)); bodyPath.replaceWithMultiple(requires); } }); diff --git a/experimental/babel-preset-env/test/fixtures/plugin-options/filters-duplicates/actual.js b/experimental/babel-preset-env/test/fixtures/plugin-options/filters-duplicates/actual.js new file mode 100644 index 0000000000..d3984c50aa --- /dev/null +++ b/experimental/babel-preset-env/test/fixtures/plugin-options/filters-duplicates/actual.js @@ -0,0 +1 @@ +import "babel-polyfill"; diff --git a/experimental/babel-preset-env/test/fixtures/plugin-options/filters-duplicates/expected.js b/experimental/babel-preset-env/test/fixtures/plugin-options/filters-duplicates/expected.js new file mode 100644 index 0000000000..6a01cbb4c3 --- /dev/null +++ b/experimental/babel-preset-env/test/fixtures/plugin-options/filters-duplicates/expected.js @@ -0,0 +1,2 @@ +import "core-js/modules/es6.typed.data-view"; +import "core-js/modules/es6.reflect.apply"; diff --git a/experimental/babel-preset-env/test/fixtures/plugin-options/filters-duplicates/options.json b/experimental/babel-preset-env/test/fixtures/plugin-options/filters-duplicates/options.json new file mode 100644 index 0000000000..66aa332f3b --- /dev/null +++ b/experimental/babel-preset-env/test/fixtures/plugin-options/filters-duplicates/options.json @@ -0,0 +1,11 @@ +{ + "plugins": [ + ["../../../../lib/transformPolyfillRequirePlugin", { + "polyfills": [ + "es6.typed.data-view", + "es6.typed.data-view", + "es6.reflect.apply" + ] + }] + ] +} From 8e2aa8299197afffa441c48c441c7842bbce7e43 Mon Sep 17 00:00:00 2001 From: Henry Zhu Date: Tue, 6 Dec 2016 14:31:16 -0500 Subject: [PATCH 16/21] also transform 'core-js' --- experimental/babel-preset-env/README.md | 9 +++++++++ .../src/transformPolyfillRequirePlugin.js | 12 +++++++----- .../test/fixtures/preset-options/core-js/actual.js | 1 + .../test/fixtures/preset-options/core-js/expected.js | 2 ++ .../fixtures/preset-options/core-js/options.json | 11 +++++++++++ .../fixtures/preset-options/no-transform/actual.js | 2 ++ .../fixtures/preset-options/no-transform/expected.js | 2 ++ .../preset-options/no-transform/options.json | 11 +++++++++++ 8 files changed, 45 insertions(+), 5 deletions(-) create mode 100644 experimental/babel-preset-env/test/fixtures/preset-options/core-js/actual.js create mode 100644 experimental/babel-preset-env/test/fixtures/preset-options/core-js/expected.js create mode 100644 experimental/babel-preset-env/test/fixtures/preset-options/core-js/options.json create mode 100644 experimental/babel-preset-env/test/fixtures/preset-options/no-transform/actual.js create mode 100644 experimental/babel-preset-env/test/fixtures/preset-options/no-transform/expected.js create mode 100644 experimental/babel-preset-env/test/fixtures/preset-options/no-transform/options.json diff --git a/experimental/babel-preset-env/README.md b/experimental/babel-preset-env/README.md index 6a2f4ee669..704bb2f964 100644 --- a/experimental/babel-preset-env/README.md +++ b/experimental/babel-preset-env/README.md @@ -126,6 +126,9 @@ Defaults to `false`. A way to apply `babel-preset-env` for polyfills (via "babel-polyfill"). +> NOTE: This does not currently polyfill experimental/stage-x built-ins like the regular "babel-polyfill" does. +> This will only work with npm >= 3 (which should be used with Babel 6 anyway) + ``` npm install babel-polyfill --save ``` @@ -151,6 +154,12 @@ import "core-js/modules/es6.symbol.species"; import "core-js/modules/es6.array.from"; ``` +> This will also work for "core-js" directly (`import "core-js";`) + +``` +npm install core-js --save +``` + --- ## Examples diff --git a/experimental/babel-preset-env/src/transformPolyfillRequirePlugin.js b/experimental/babel-preset-env/src/transformPolyfillRequirePlugin.js index 6412dbe5af..16af0c7be1 100644 --- a/experimental/babel-preset-env/src/transformPolyfillRequirePlugin.js +++ b/experimental/babel-preset-env/src/transformPolyfillRequirePlugin.js @@ -1,4 +1,6 @@ -const polyfillSource = "babel-polyfill"; +function isPolyfillSource(value) { + return value === "babel-polyfill" || value === "core-js"; +} export default function ({ types: t }) { function createImportDeclaration(polyfill) { @@ -18,20 +20,20 @@ export default function ({ types: t }) { ); } - function isRequire(path, source) { + function isRequire(path) { return t.isExpressionStatement(path.node) && t.isCallExpression(path.node.expression) && t.isIdentifier(path.node.expression.callee) && path.node.expression.callee.name === "require" && path.node.expression.arguments.length === 1 && t.isStringLiteral(path.node.expression.arguments[0]) && - path.node.expression.arguments[0].value === source; + isPolyfillSource(path.node.expression.arguments[0].value); } const isPolyfillImport = { ImportDeclaration(path, state) { if (path.node.specifiers.length === 0 && - path.node.source.value === polyfillSource) { + isPolyfillSource(path.node.source.value)) { this.numPolyfillImports++; if (this.numPolyfillImports > 1) { path.remove(); @@ -53,7 +55,7 @@ to the "transform-polyfill-require" plugin `); } path.get("body").forEach((bodyPath) => { - if (isRequire(bodyPath, polyfillSource)) { + if (isRequire(bodyPath)) { this.numPolyfillImports++; if (this.numPolyfillImports > 1) { path.remove(); diff --git a/experimental/babel-preset-env/test/fixtures/preset-options/core-js/actual.js b/experimental/babel-preset-env/test/fixtures/preset-options/core-js/actual.js new file mode 100644 index 0000000000..c3fee8a175 --- /dev/null +++ b/experimental/babel-preset-env/test/fixtures/preset-options/core-js/actual.js @@ -0,0 +1 @@ +import "core-js"; diff --git a/experimental/babel-preset-env/test/fixtures/preset-options/core-js/expected.js b/experimental/babel-preset-env/test/fixtures/preset-options/core-js/expected.js new file mode 100644 index 0000000000..531f909e8e --- /dev/null +++ b/experimental/babel-preset-env/test/fixtures/preset-options/core-js/expected.js @@ -0,0 +1,2 @@ +import "core-js/modules/es7.string.pad-start"; +import "core-js/modules/es7.string.pad-end"; \ No newline at end of file diff --git a/experimental/babel-preset-env/test/fixtures/preset-options/core-js/options.json b/experimental/babel-preset-env/test/fixtures/preset-options/core-js/options.json new file mode 100644 index 0000000000..de09fa3f05 --- /dev/null +++ b/experimental/babel-preset-env/test/fixtures/preset-options/core-js/options.json @@ -0,0 +1,11 @@ +{ + "presets": [ + ["../../../../lib", { + "targets": { + "chrome": 55 + }, + "modules": false, + "useBuiltIns": true + }] + ] +} diff --git a/experimental/babel-preset-env/test/fixtures/preset-options/no-transform/actual.js b/experimental/babel-preset-env/test/fixtures/preset-options/no-transform/actual.js new file mode 100644 index 0000000000..31f2d79f9a --- /dev/null +++ b/experimental/babel-preset-env/test/fixtures/preset-options/no-transform/actual.js @@ -0,0 +1,2 @@ +import "not-core-js"; +import "not-babel-polyfill"; diff --git a/experimental/babel-preset-env/test/fixtures/preset-options/no-transform/expected.js b/experimental/babel-preset-env/test/fixtures/preset-options/no-transform/expected.js new file mode 100644 index 0000000000..e6e20a7905 --- /dev/null +++ b/experimental/babel-preset-env/test/fixtures/preset-options/no-transform/expected.js @@ -0,0 +1,2 @@ +import "not-core-js"; +import "not-babel-polyfill"; \ No newline at end of file diff --git a/experimental/babel-preset-env/test/fixtures/preset-options/no-transform/options.json b/experimental/babel-preset-env/test/fixtures/preset-options/no-transform/options.json new file mode 100644 index 0000000000..de09fa3f05 --- /dev/null +++ b/experimental/babel-preset-env/test/fixtures/preset-options/no-transform/options.json @@ -0,0 +1,11 @@ +{ + "presets": [ + ["../../../../lib", { + "targets": { + "chrome": 55 + }, + "modules": false, + "useBuiltIns": true + }] + ] +} From 541ebb5e5f48a3405ed6a17ccbe7cc590a1845bc Mon Sep 17 00:00:00 2001 From: Henry Zhu Date: Tue, 6 Dec 2016 16:01:21 -0500 Subject: [PATCH 17/21] also import regenerator when the transform is required --- experimental/babel-preset-env/src/index.js | 11 ++- .../src/transformPolyfillRequirePlugin.js | 33 +++++-- .../regenerator-false/actual.js | 1 + .../regenerator-false/expected.js | 0 .../regenerator-false/options.json | 8 ++ .../plugin-options/regenerator-true/actual.js | 1 + .../regenerator-true/expected.js | 1 + .../regenerator-true/options.json | 8 ++ .../use-builtins-chrome-48/expected.js | 3 +- .../use-builtins-chrome-49/expected.js | 1 + .../use-builtins-regenerator-true/actual.js | 2 + .../use-builtins-regenerator-true/expected.js | 86 +++++++++++++++++++ .../options.json | 8 ++ 13 files changed, 151 insertions(+), 12 deletions(-) create mode 100644 experimental/babel-preset-env/test/fixtures/plugin-options/regenerator-false/actual.js create mode 100644 experimental/babel-preset-env/test/fixtures/plugin-options/regenerator-false/expected.js create mode 100644 experimental/babel-preset-env/test/fixtures/plugin-options/regenerator-false/options.json create mode 100644 experimental/babel-preset-env/test/fixtures/plugin-options/regenerator-true/actual.js create mode 100644 experimental/babel-preset-env/test/fixtures/plugin-options/regenerator-true/expected.js create mode 100644 experimental/babel-preset-env/test/fixtures/plugin-options/regenerator-true/options.json create mode 100644 experimental/babel-preset-env/test/fixtures/preset-options/use-builtins-regenerator-true/actual.js create mode 100644 experimental/babel-preset-env/test/fixtures/preset-options/use-builtins-regenerator-true/expected.js create mode 100644 experimental/babel-preset-env/test/fixtures/preset-options/use-builtins-regenerator-true/options.json diff --git a/experimental/babel-preset-env/src/index.js b/experimental/babel-preset-env/src/index.js index e2eeb6a7c3..80fced5d62 100644 --- a/experimental/babel-preset-env/src/index.js +++ b/experimental/babel-preset-env/src/index.js @@ -184,7 +184,12 @@ export default function buildPreset(context, opts = {}) { } } - transformations = [...transformations, ...whitelist].map((pluginName) => { + let allTransformations = [...transformations, ...whitelist]; + let regenerator = allTransformations.indexOf("transform-regenerator") >= 0; + + console.log(allTransformations, regenerator); + + let plugins = allTransformations.map((pluginName) => { return [require(`babel-plugin-${pluginName}`), { loose }]; }); @@ -198,8 +203,8 @@ export default function buildPreset(context, opts = {}) { return { plugins: [ ...modules, - ...transformations, - useBuiltIns === true && [transformPolyfillRequirePlugin, { polyfills }] + ...plugins, + useBuiltIns === true && [transformPolyfillRequirePlugin, { polyfills, regenerator }] ].filter(Boolean) }; } diff --git a/experimental/babel-preset-env/src/transformPolyfillRequirePlugin.js b/experimental/babel-preset-env/src/transformPolyfillRequirePlugin.js index 16af0c7be1..e82fb2009d 100644 --- a/experimental/babel-preset-env/src/transformPolyfillRequirePlugin.js +++ b/experimental/babel-preset-env/src/transformPolyfillRequirePlugin.js @@ -30,6 +30,25 @@ export default function ({ types: t }) { isPolyfillSource(path.node.expression.arguments[0].value); } + function createImport(polyfill, requireType) { + if (requireType === "import") { + return createImportDeclaration(polyfill); + } else { + return createRequireStatement(polyfill); + } + } + + function createImports(polyfills, requireType, regenerator) { + let imports = polyfills + .filter((el, i, arr) => arr.indexOf(el) === i) + .map((polyfill) => createImport(polyfill, requireType)); + + return [ + ...imports, + regenerator && createImport("regenerator-runtime/runtime", requireType) + ].filter(Boolean); + } + const isPolyfillImport = { ImportDeclaration(path, state) { if (path.node.specifiers.length === 0 && @@ -40,10 +59,9 @@ export default function ({ types: t }) { return; } - let imports = state.opts.polyfills - .filter((el, i, arr) => arr.indexOf(el) === i) - .map((p) => createImportDeclaration(p)); - path.replaceWithMultiple(imports); + path.replaceWithMultiple( + createImports(state.opts.polyfills, "import", state.opts.regenerator) + ); } }, Program(path, state) { @@ -62,10 +80,9 @@ to the "transform-polyfill-require" plugin return; } - let requires = state.opts.polyfills - .filter((el, i, arr) => arr.indexOf(el) === i) - .map((p) => createRequireStatement(p)); - bodyPath.replaceWithMultiple(requires); + bodyPath.replaceWithMultiple( + createImports(state.opts.polyfills, "require", state.opts.regenerator) + ); } }); } diff --git a/experimental/babel-preset-env/test/fixtures/plugin-options/regenerator-false/actual.js b/experimental/babel-preset-env/test/fixtures/plugin-options/regenerator-false/actual.js new file mode 100644 index 0000000000..d3984c50aa --- /dev/null +++ b/experimental/babel-preset-env/test/fixtures/plugin-options/regenerator-false/actual.js @@ -0,0 +1 @@ +import "babel-polyfill"; diff --git a/experimental/babel-preset-env/test/fixtures/plugin-options/regenerator-false/expected.js b/experimental/babel-preset-env/test/fixtures/plugin-options/regenerator-false/expected.js new file mode 100644 index 0000000000..e69de29bb2 diff --git a/experimental/babel-preset-env/test/fixtures/plugin-options/regenerator-false/options.json b/experimental/babel-preset-env/test/fixtures/plugin-options/regenerator-false/options.json new file mode 100644 index 0000000000..8c6abc7140 --- /dev/null +++ b/experimental/babel-preset-env/test/fixtures/plugin-options/regenerator-false/options.json @@ -0,0 +1,8 @@ +{ + "plugins": [ + ["../../../../lib/transformPolyfillRequirePlugin", { + "regenerator": false, + "polyfills": [] + }] + ] +} diff --git a/experimental/babel-preset-env/test/fixtures/plugin-options/regenerator-true/actual.js b/experimental/babel-preset-env/test/fixtures/plugin-options/regenerator-true/actual.js new file mode 100644 index 0000000000..d3984c50aa --- /dev/null +++ b/experimental/babel-preset-env/test/fixtures/plugin-options/regenerator-true/actual.js @@ -0,0 +1 @@ +import "babel-polyfill"; diff --git a/experimental/babel-preset-env/test/fixtures/plugin-options/regenerator-true/expected.js b/experimental/babel-preset-env/test/fixtures/plugin-options/regenerator-true/expected.js new file mode 100644 index 0000000000..1cedc1eb21 --- /dev/null +++ b/experimental/babel-preset-env/test/fixtures/plugin-options/regenerator-true/expected.js @@ -0,0 +1 @@ +import "core-js/modules/regenerator-runtime/runtime"; \ No newline at end of file diff --git a/experimental/babel-preset-env/test/fixtures/plugin-options/regenerator-true/options.json b/experimental/babel-preset-env/test/fixtures/plugin-options/regenerator-true/options.json new file mode 100644 index 0000000000..c053fa1f51 --- /dev/null +++ b/experimental/babel-preset-env/test/fixtures/plugin-options/regenerator-true/options.json @@ -0,0 +1,8 @@ +{ + "plugins": [ + ["../../../../lib/transformPolyfillRequirePlugin", { + "regenerator": true, + "polyfills": [] + }] + ] +} diff --git a/experimental/babel-preset-env/test/fixtures/preset-options/use-builtins-chrome-48/expected.js b/experimental/babel-preset-env/test/fixtures/preset-options/use-builtins-chrome-48/expected.js index dd800cdd78..6ae268fccb 100644 --- a/experimental/babel-preset-env/test/fixtures/preset-options/use-builtins-chrome-48/expected.js +++ b/experimental/babel-preset-env/test/fixtures/preset-options/use-builtins-chrome-48/expected.js @@ -28,5 +28,6 @@ import "core-js/modules/es7.object.entries"; import "core-js/modules/es7.object.get-own-property-descriptors"; import "core-js/modules/es7.string.pad-start"; import "core-js/modules/es7.string.pad-end"; +import "core-js/modules/regenerator-runtime/runtime"; -Math.pow(1, 2); \ No newline at end of file +Math.pow(1, 2); diff --git a/experimental/babel-preset-env/test/fixtures/preset-options/use-builtins-chrome-49/expected.js b/experimental/babel-preset-env/test/fixtures/preset-options/use-builtins-chrome-49/expected.js index 72de16631b..975004c6a6 100644 --- a/experimental/babel-preset-env/test/fixtures/preset-options/use-builtins-chrome-49/expected.js +++ b/experimental/babel-preset-env/test/fixtures/preset-options/use-builtins-chrome-49/expected.js @@ -14,5 +14,6 @@ import "core-js/modules/es7.object.entries"; import "core-js/modules/es7.object.get-own-property-descriptors"; import "core-js/modules/es7.string.pad-start"; import "core-js/modules/es7.string.pad-end"; +import "core-js/modules/regenerator-runtime/runtime"; Math.pow(1, 2); diff --git a/experimental/babel-preset-env/test/fixtures/preset-options/use-builtins-regenerator-true/actual.js b/experimental/babel-preset-env/test/fixtures/preset-options/use-builtins-regenerator-true/actual.js new file mode 100644 index 0000000000..7d70ec7d7b --- /dev/null +++ b/experimental/babel-preset-env/test/fixtures/preset-options/use-builtins-regenerator-true/actual.js @@ -0,0 +1,2 @@ +import "babel-polyfill"; +1 ** 2; diff --git a/experimental/babel-preset-env/test/fixtures/preset-options/use-builtins-regenerator-true/expected.js b/experimental/babel-preset-env/test/fixtures/preset-options/use-builtins-regenerator-true/expected.js new file mode 100644 index 0000000000..80bd6e9561 --- /dev/null +++ b/experimental/babel-preset-env/test/fixtures/preset-options/use-builtins-regenerator-true/expected.js @@ -0,0 +1,86 @@ +import "core-js/modules/es6.typed.data-view"; +import "core-js/modules/es6.typed.int8-array"; +import "core-js/modules/es6.typed.uint8-array"; +import "core-js/modules/es6.typed.uint8-clamped-array"; +import "core-js/modules/es6.typed.int16-array"; +import "core-js/modules/es6.typed.uint16-array"; +import "core-js/modules/es6.typed.int32-array"; +import "core-js/modules/es6.typed.uint32-array"; +import "core-js/modules/es6.typed.float32-array"; +import "core-js/modules/es6.typed.float64-array"; +import "core-js/modules/es6.map"; +import "core-js/modules/es6.set"; +import "core-js/modules/es6.weak-map"; +import "core-js/modules/es6.weak-set"; +import "core-js/modules/es6.reflect.apply"; +import "core-js/modules/es6.reflect.construct"; +import "core-js/modules/es6.reflect.define-property"; +import "core-js/modules/es6.reflect.delete-property"; +import "core-js/modules/es6.reflect.get"; +import "core-js/modules/es6.reflect.get-own-property-descriptor"; +import "core-js/modules/es6.reflect.get-prototype-of"; +import "core-js/modules/es6.reflect.has"; +import "core-js/modules/es6.reflect.is-extensible"; +import "core-js/modules/es6.reflect.own-keys"; +import "core-js/modules/es6.reflect.prevent-extensions"; +import "core-js/modules/es6.reflect.set"; +import "core-js/modules/es6.reflect.set-prototype-of"; +import "core-js/modules/es6.promise"; +import "core-js/modules/es6.symbol"; +import "core-js/modules/es6.object.assign"; +import "core-js/modules/es6.object.is"; +import "core-js/modules/es6.object.get-own-property-symbols"; +import "core-js/modules/es6.object.set-prototype-of"; +import "core-js/modules/es6.function.name"; +import "core-js/modules/es6.string.raw"; +import "core-js/modules/es6.string.from-code-point"; +import "core-js/modules/es6.string.code-point-at"; +import "core-js/modules/es6.string.repeat"; +import "core-js/modules/es6.string.starts-with"; +import "core-js/modules/es6.string.ends-with"; +import "core-js/modules/es6.string.includes"; +import "core-js/modules/es6.regexp.flags"; +import "core-js/modules/es6.regexp.match"; +import "core-js/modules/es6.regexp.replace"; +import "core-js/modules/es6.regexp.split"; +import "core-js/modules/es6.regexp.search"; +import "core-js/modules/es6.array.from"; +import "core-js/modules/es6.array.of"; +import "core-js/modules/es6.array.copy-within"; +import "core-js/modules/es6.array.find"; +import "core-js/modules/es6.array.find-index"; +import "core-js/modules/es6.array.fill"; +import "core-js/modules/es6.array.iterator"; +import "core-js/modules/es6.number.is-finite"; +import "core-js/modules/es6.number.is-integer"; +import "core-js/modules/es6.number.is-safe-integer"; +import "core-js/modules/es6.number.is-nan"; +import "core-js/modules/es6.number.epsilon"; +import "core-js/modules/es6.number.min-safe-integer"; +import "core-js/modules/es6.number.max-safe-integer"; +import "core-js/modules/es6.math.acosh"; +import "core-js/modules/es6.math.asinh"; +import "core-js/modules/es6.math.atanh"; +import "core-js/modules/es6.math.cbrt"; +import "core-js/modules/es6.math.clz32"; +import "core-js/modules/es6.math.cosh"; +import "core-js/modules/es6.math.expm1"; +import "core-js/modules/es6.math.fround"; +import "core-js/modules/es6.math.hypot"; +import "core-js/modules/es6.math.imul"; +import "core-js/modules/es6.math.log1p"; +import "core-js/modules/es6.math.log10"; +import "core-js/modules/es6.math.log2"; +import "core-js/modules/es6.math.sign"; +import "core-js/modules/es6.math.sinh"; +import "core-js/modules/es6.math.tanh"; +import "core-js/modules/es6.math.trunc"; +import "core-js/modules/es7.array.includes.js"; +import "core-js/modules/es7.object.values"; +import "core-js/modules/es7.object.entries"; +import "core-js/modules/es7.object.get-own-property-descriptors"; +import "core-js/modules/es7.string.pad-start"; +import "core-js/modules/es7.string.pad-end"; +import "core-js/modules/regenerator-runtime/runtime"; + +Math.pow(1, 2); diff --git a/experimental/babel-preset-env/test/fixtures/preset-options/use-builtins-regenerator-true/options.json b/experimental/babel-preset-env/test/fixtures/preset-options/use-builtins-regenerator-true/options.json new file mode 100644 index 0000000000..717506a540 --- /dev/null +++ b/experimental/babel-preset-env/test/fixtures/preset-options/use-builtins-regenerator-true/options.json @@ -0,0 +1,8 @@ +{ + "presets": [ + ["../../../../lib", { + "modules": false, + "useBuiltIns": true + }] + ] +} From d3189164160b308f01ff2d133b641c0b91c35838 Mon Sep 17 00:00:00 2001 From: Henry Zhu Date: Thu, 8 Dec 2016 11:50:07 -0500 Subject: [PATCH 18/21] do not count against if core-js does not implement --- .../babel-preset-env/scripts/build-data.js | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/experimental/babel-preset-env/scripts/build-data.js b/experimental/babel-preset-env/scripts/build-data.js index fbf8badc2f..4f680e1765 100644 --- a/experimental/babel-preset-env/scripts/build-data.js +++ b/experimental/babel-preset-env/scripts/build-data.js @@ -73,20 +73,31 @@ const getLowestImplementedVersion = ({ features }, env) => { features.length === 1 && test.name.indexOf(features[0]) === 0; }) .map((test) => { + const isBuiltIn = test.category === "built-ins" || test.category === "built-in extensions"; + return test.subtests ? test.subtests.map((subtest) => ({ name: `${test.name}/${subtest.name}`, - res: subtest.res + res: subtest.res, + isBuiltIn })) : { name: test.name, - res: test.res + res: test.res, + isBuiltIn }; }) ); let envTests = tests - .map(({ res: test, name }, i) => { + .map(({ res: test, name, isBuiltIn }, i) => { + // Babel itself doesn't implement the feature correctly, + // don't count against it + // only doing this for built-ins atm + if (!test.babel && isBuiltIn) { + console.log(name); + return "-1"; + } // `equals` in compat-table Object.keys(test).forEach((t) => { From 66ab523dd66e2baf8d2467944c697796bb7e871c Mon Sep 17 00:00:00 2001 From: Brian Ng Date: Thu, 8 Dec 2016 10:50:17 -0600 Subject: [PATCH 19/21] Use array features for symbol and array.iterator (#64) --- .../babel-preset-env/data/builtInFeatures.js | 41 +++++++++++-------- .../babel-preset-env/data/builtIns.json | 12 +++--- 2 files changed, 30 insertions(+), 23 deletions(-) diff --git a/experimental/babel-preset-env/data/builtInFeatures.js b/experimental/babel-preset-env/data/builtInFeatures.js index 9d794954ea..7761222d24 100644 --- a/experimental/babel-preset-env/data/builtInFeatures.js +++ b/experimental/babel-preset-env/data/builtInFeatures.js @@ -34,19 +34,23 @@ const es2015 = { "es6.reflect.set-prototype-of": "Reflect / Reflect.setPrototypeOf", "es6.promise": "Promise", - "es6.symbol": "Symbol", - "es6.symbol": "well-known symbols / Symbol.hasInstance", - "es6.symbol": "well-known symbols / Symbol.isConcatSpreadable", - "es6.symbol": "well-known symbols / Symbol.iterator", - "es6.symbol": "well-known symbols / Symbol.match", - "es6.symbol": "well-known symbols / Symbol.replace", - "es6.symbol": "well-known symbols / Symbol.search", - "es6.symbol": "well-known symbols / Symbol.species", - "es6.symbol": "well-known symbols / Symbol.split", - "es6.symbol": "well-known symbols / Symbol.toPrimitive", - "es6.symbol": "well-known symbols / Symbol.toStringTag", - "es6.symbol": "well-known symbols / Symbol.unscopables", + "es6.symbol": { + features: [ + "Symbol", + "well-known symbols / Symbol.hasInstance", + "well-known symbols / Symbol.isConcatSpreadable", + "well-known symbols / Symbol.iterator", + "well-known symbols / Symbol.match", + "well-known symbols / Symbol.replace", + "well-known symbols / Symbol.search", + "well-known symbols / Symbol.species", + "well-known symbols / Symbol.split", + "well-known symbols / Symbol.toPrimitive", + "well-known symbols / Symbol.toStringTag", + "well-known symbols / Symbol.unscopables", + ] + }, "es6.object.assign": "Object static methods / Object.assign", "es6.object.is": "Object static methods / Object.is", @@ -78,10 +82,15 @@ const es2015 = { "es6.array.find": "Array.prototype methods / Array.prototype.find", "es6.array.find-index": "Array.prototype methods / Array.prototype.findIndex", "es6.array.fill": "Array.prototype methods / Array.prototype.fill", - "es6.array.iterator": "Array.prototype methods / Array.prototype.keys", - // can use Symbol.iterator, not implemented in many environments - // "es6.array.iterator": "Array.prototype methods / Array.prototype.values", - "es6.array.iterator": "Array.prototype methods / Array.prototype.entries", + + "es6.array.iterator": { + features: [ + "Array.prototype methods / Array.prototype.keys", + // can use Symbol.iterator, not implemented in many environments + // "Array.prototype methods / Array.prototype.values", + "Array.prototype methods / Array.prototype.entries", + ] + }, "es6.number.is-finite": "Number properties / Number.isFinite", "es6.number.is-integer": "Number properties / Number.isInteger", diff --git a/experimental/babel-preset-env/data/builtIns.json b/experimental/babel-preset-env/data/builtIns.json index cf93685f23..6eaa2cc59b 100644 --- a/experimental/babel-preset-env/data/builtIns.json +++ b/experimental/babel-preset-env/data/builtIns.json @@ -238,13 +238,11 @@ "ios": 10 }, "es6.symbol": { - "chrome": 38, - "opera": 25, - "edge": 12, - "firefox": 48, - "safari": 9, - "node": 0.12, - "ios": 9 + "chrome": 51, + "opera": 38, + "firefox": 51, + "safari": 10, + "ios": 10 }, "es6.object.assign": { "chrome": 45, From d2976bed1383be287d09237ec10016e5382f48b0 Mon Sep 17 00:00:00 2001 From: Henry Zhu Date: Thu, 8 Dec 2016 11:51:38 -0500 Subject: [PATCH 20/21] remove console.log, fix tests --- experimental/babel-preset-env/README.md | 11 +++++------ experimental/babel-preset-env/data/builtInFeatures.js | 4 ++-- experimental/babel-preset-env/scripts/build-data.js | 1 - experimental/babel-preset-env/src/index.js | 4 +--- .../preset-options/use-builtins-chrome-48/expected.js | 1 + .../preset-options/use-builtins-chrome-49/expected.js | 1 + 6 files changed, 10 insertions(+), 12 deletions(-) diff --git a/experimental/babel-preset-env/README.md b/experimental/babel-preset-env/README.md index 704bb2f964..0a460c87fd 100644 --- a/experimental/babel-preset-env/README.md +++ b/experimental/babel-preset-env/README.md @@ -146,12 +146,11 @@ import "babel-polyfill"; Out (different based on environment) ```js -import "core-js/modules/es6.typed.data-view"; -import "core-js/modules/es6.reflect.apply"; -import "core-js/modules/es6.reflect.own-keys"; -import "core-js/modules/es6.symbol.iterator"; -import "core-js/modules/es6.symbol.species"; -import "core-js/modules/es6.array.from"; +import "core-js/modules/es7.string.pad-start"; +import "core-js/modules/es7.string.pad-end"; +import "core-js/modules/web.timers"; +import "core-js/modules/web.immediate"; +import "core-js/modules/web.dom.iterable"; ``` > This will also work for "core-js" directly (`import "core-js";`) diff --git a/experimental/babel-preset-env/data/builtInFeatures.js b/experimental/babel-preset-env/data/builtInFeatures.js index 7761222d24..09d3924618 100644 --- a/experimental/babel-preset-env/data/builtInFeatures.js +++ b/experimental/babel-preset-env/data/builtInFeatures.js @@ -17,7 +17,7 @@ const es2015 = { "es6.set": "Set", "es6.weak-map": "WeakMap", "es6.weak-set": "WeakSet", - // proxy not implemented + // Proxy not implementable "es6.reflect.apply": "Reflect / Reflect.apply", "es6.reflect.construct": "Reflect / Reflect.construct", @@ -82,7 +82,7 @@ const es2015 = { "es6.array.find": "Array.prototype methods / Array.prototype.find", "es6.array.find-index": "Array.prototype methods / Array.prototype.findIndex", "es6.array.fill": "Array.prototype methods / Array.prototype.fill", - + "es6.array.iterator": { features: [ "Array.prototype methods / Array.prototype.keys", diff --git a/experimental/babel-preset-env/scripts/build-data.js b/experimental/babel-preset-env/scripts/build-data.js index 4f680e1765..0f027795b6 100644 --- a/experimental/babel-preset-env/scripts/build-data.js +++ b/experimental/babel-preset-env/scripts/build-data.js @@ -95,7 +95,6 @@ const getLowestImplementedVersion = ({ features }, env) => { // don't count against it // only doing this for built-ins atm if (!test.babel && isBuiltIn) { - console.log(name); return "-1"; } diff --git a/experimental/babel-preset-env/src/index.js b/experimental/babel-preset-env/src/index.js index 80fced5d62..476a92e536 100644 --- a/experimental/babel-preset-env/src/index.js +++ b/experimental/babel-preset-env/src/index.js @@ -170,7 +170,7 @@ export default function buildPreset(context, opts = {}) { console.log(""); console.log(`Using targets: ${JSON.stringify(targets, null, 2)}`); console.log(""); - console.log(`module: ${moduleType}`); + console.log(`modules transform: ${moduleType}`); console.log(""); console.log("Using plugins:"); transformations.forEach((transform) => { @@ -187,8 +187,6 @@ export default function buildPreset(context, opts = {}) { let allTransformations = [...transformations, ...whitelist]; let regenerator = allTransformations.indexOf("transform-regenerator") >= 0; - console.log(allTransformations, regenerator); - let plugins = allTransformations.map((pluginName) => { return [require(`babel-plugin-${pluginName}`), { loose }]; }); diff --git a/experimental/babel-preset-env/test/fixtures/preset-options/use-builtins-chrome-48/expected.js b/experimental/babel-preset-env/test/fixtures/preset-options/use-builtins-chrome-48/expected.js index 6ae268fccb..ff0cef88f6 100644 --- a/experimental/babel-preset-env/test/fixtures/preset-options/use-builtins-chrome-48/expected.js +++ b/experimental/babel-preset-env/test/fixtures/preset-options/use-builtins-chrome-48/expected.js @@ -16,6 +16,7 @@ import "core-js/modules/es6.reflect.prevent-extensions"; import "core-js/modules/es6.reflect.set"; import "core-js/modules/es6.reflect.set-prototype-of"; import "core-js/modules/es6.promise"; +import "core-js/modules/es6.symbol"; import "core-js/modules/es6.function.name"; import "core-js/modules/es6.regexp.flags"; import "core-js/modules/es6.regexp.match"; diff --git a/experimental/babel-preset-env/test/fixtures/preset-options/use-builtins-chrome-49/expected.js b/experimental/babel-preset-env/test/fixtures/preset-options/use-builtins-chrome-49/expected.js index 975004c6a6..234cb96ac1 100644 --- a/experimental/babel-preset-env/test/fixtures/preset-options/use-builtins-chrome-49/expected.js +++ b/experimental/babel-preset-env/test/fixtures/preset-options/use-builtins-chrome-49/expected.js @@ -3,6 +3,7 @@ import "core-js/modules/es6.set"; import "core-js/modules/es6.weak-map"; import "core-js/modules/es6.weak-set"; import "core-js/modules/es6.promise"; +import "core-js/modules/es6.symbol"; import "core-js/modules/es6.function.name"; import "core-js/modules/es6.regexp.match"; import "core-js/modules/es6.regexp.replace"; From 08cd975eb45bb0cc43d9a0035109ec0258e936aa Mon Sep 17 00:00:00 2001 From: Henry Zhu Date: Thu, 8 Dec 2016 14:54:06 -0500 Subject: [PATCH 21/21] always include web polyfills for now --- .../src/transformPolyfillRequirePlugin.js | 10 ++++++++-- .../plugin-options/filters-duplicates/expected.js | 3 +++ .../plugin-options/regenerator-false/expected.js | 3 +++ .../plugin-options/regenerator-true/expected.js | 5 ++++- .../test/fixtures/preset-options/core-js/expected.js | 5 ++++- .../fixtures/preset-options/empty-options/expected.js | 2 +- .../fixtures/preset-options/modules-false/expected.js | 2 +- .../fixtures/preset-options/no-options/expected.js | 2 +- .../preset-options/use-builtins-chrome-48/expected.js | 5 ++++- .../preset-options/use-builtins-chrome-49/expected.js | 5 ++++- .../preset-options/use-builtins-import/expected.js | 5 ++++- .../use-builtins-multiple-imports/expected.js | 5 ++++- .../use-builtins-regenerator-true/expected.js | 5 ++++- .../preset-options/use-builtins-require/expected.js | 8 +++++++- .../test/fixtures/preset-options/whitelist/expected.js | 2 +- 15 files changed, 53 insertions(+), 14 deletions(-) diff --git a/experimental/babel-preset-env/src/transformPolyfillRequirePlugin.js b/experimental/babel-preset-env/src/transformPolyfillRequirePlugin.js index e82fb2009d..11782b1dd7 100644 --- a/experimental/babel-preset-env/src/transformPolyfillRequirePlugin.js +++ b/experimental/babel-preset-env/src/transformPolyfillRequirePlugin.js @@ -2,6 +2,12 @@ function isPolyfillSource(value) { return value === "babel-polyfill" || value === "core-js"; } +const whitelist = [ + "web.timers", + "web.immediate", + "web.dom.iterable" +]; + export default function ({ types: t }) { function createImportDeclaration(polyfill) { let declar = t.importDeclaration([], t.stringLiteral(`core-js/modules/${polyfill}`)); @@ -60,7 +66,7 @@ export default function ({ types: t }) { } path.replaceWithMultiple( - createImports(state.opts.polyfills, "import", state.opts.regenerator) + createImports([...state.opts.polyfills, ...whitelist], "import", state.opts.regenerator) ); } }, @@ -81,7 +87,7 @@ to the "transform-polyfill-require" plugin } bodyPath.replaceWithMultiple( - createImports(state.opts.polyfills, "require", state.opts.regenerator) + createImports([...state.opts.polyfills, ...whitelist], "require", state.opts.regenerator) ); } }); diff --git a/experimental/babel-preset-env/test/fixtures/plugin-options/filters-duplicates/expected.js b/experimental/babel-preset-env/test/fixtures/plugin-options/filters-duplicates/expected.js index 6a01cbb4c3..81d166d7ff 100644 --- a/experimental/babel-preset-env/test/fixtures/plugin-options/filters-duplicates/expected.js +++ b/experimental/babel-preset-env/test/fixtures/plugin-options/filters-duplicates/expected.js @@ -1,2 +1,5 @@ import "core-js/modules/es6.typed.data-view"; import "core-js/modules/es6.reflect.apply"; +import "core-js/modules/web.timers"; +import "core-js/modules/web.immediate"; +import "core-js/modules/web.dom.iterable"; diff --git a/experimental/babel-preset-env/test/fixtures/plugin-options/regenerator-false/expected.js b/experimental/babel-preset-env/test/fixtures/plugin-options/regenerator-false/expected.js index e69de29bb2..949a0f6afe 100644 --- a/experimental/babel-preset-env/test/fixtures/plugin-options/regenerator-false/expected.js +++ b/experimental/babel-preset-env/test/fixtures/plugin-options/regenerator-false/expected.js @@ -0,0 +1,3 @@ +import "core-js/modules/web.timers"; +import "core-js/modules/web.immediate"; +import "core-js/modules/web.dom.iterable"; \ No newline at end of file diff --git a/experimental/babel-preset-env/test/fixtures/plugin-options/regenerator-true/expected.js b/experimental/babel-preset-env/test/fixtures/plugin-options/regenerator-true/expected.js index 1cedc1eb21..80b0d61e35 100644 --- a/experimental/babel-preset-env/test/fixtures/plugin-options/regenerator-true/expected.js +++ b/experimental/babel-preset-env/test/fixtures/plugin-options/regenerator-true/expected.js @@ -1 +1,4 @@ -import "core-js/modules/regenerator-runtime/runtime"; \ No newline at end of file +import "core-js/modules/web.timers"; +import "core-js/modules/web.immediate"; +import "core-js/modules/web.dom.iterable"; +import "core-js/modules/regenerator-runtime/runtime"; diff --git a/experimental/babel-preset-env/test/fixtures/preset-options/core-js/expected.js b/experimental/babel-preset-env/test/fixtures/preset-options/core-js/expected.js index 531f909e8e..2f3d87c876 100644 --- a/experimental/babel-preset-env/test/fixtures/preset-options/core-js/expected.js +++ b/experimental/babel-preset-env/test/fixtures/preset-options/core-js/expected.js @@ -1,2 +1,5 @@ import "core-js/modules/es7.string.pad-start"; -import "core-js/modules/es7.string.pad-end"; \ No newline at end of file +import "core-js/modules/es7.string.pad-end"; +import "core-js/modules/web.timers"; +import "core-js/modules/web.immediate"; +import "core-js/modules/web.dom.iterable"; \ No newline at end of file diff --git a/experimental/babel-preset-env/test/fixtures/preset-options/empty-options/expected.js b/experimental/babel-preset-env/test/fixtures/preset-options/empty-options/expected.js index b298c5e19d..e5daec6125 100644 --- a/experimental/babel-preset-env/test/fixtures/preset-options/empty-options/expected.js +++ b/experimental/babel-preset-env/test/fixtures/preset-options/empty-options/expected.js @@ -1,3 +1,3 @@ "use strict"; -var a = "1"; +var a = "1"; \ No newline at end of file diff --git a/experimental/babel-preset-env/test/fixtures/preset-options/modules-false/expected.js b/experimental/babel-preset-env/test/fixtures/preset-options/modules-false/expected.js index 4b992e32e1..6705308072 100644 --- a/experimental/babel-preset-env/test/fixtures/preset-options/modules-false/expected.js +++ b/experimental/babel-preset-env/test/fixtures/preset-options/modules-false/expected.js @@ -1 +1 @@ -import a from "a"; +import a from "a"; \ No newline at end of file diff --git a/experimental/babel-preset-env/test/fixtures/preset-options/no-options/expected.js b/experimental/babel-preset-env/test/fixtures/preset-options/no-options/expected.js index b298c5e19d..e5daec6125 100644 --- a/experimental/babel-preset-env/test/fixtures/preset-options/no-options/expected.js +++ b/experimental/babel-preset-env/test/fixtures/preset-options/no-options/expected.js @@ -1,3 +1,3 @@ "use strict"; -var a = "1"; +var a = "1"; \ No newline at end of file diff --git a/experimental/babel-preset-env/test/fixtures/preset-options/use-builtins-chrome-48/expected.js b/experimental/babel-preset-env/test/fixtures/preset-options/use-builtins-chrome-48/expected.js index ff0cef88f6..a5aab0e153 100644 --- a/experimental/babel-preset-env/test/fixtures/preset-options/use-builtins-chrome-48/expected.js +++ b/experimental/babel-preset-env/test/fixtures/preset-options/use-builtins-chrome-48/expected.js @@ -29,6 +29,9 @@ import "core-js/modules/es7.object.entries"; import "core-js/modules/es7.object.get-own-property-descriptors"; import "core-js/modules/es7.string.pad-start"; import "core-js/modules/es7.string.pad-end"; +import "core-js/modules/web.timers"; +import "core-js/modules/web.immediate"; +import "core-js/modules/web.dom.iterable"; import "core-js/modules/regenerator-runtime/runtime"; -Math.pow(1, 2); +Math.pow(1, 2); \ No newline at end of file diff --git a/experimental/babel-preset-env/test/fixtures/preset-options/use-builtins-chrome-49/expected.js b/experimental/babel-preset-env/test/fixtures/preset-options/use-builtins-chrome-49/expected.js index 234cb96ac1..a9683cfbd6 100644 --- a/experimental/babel-preset-env/test/fixtures/preset-options/use-builtins-chrome-49/expected.js +++ b/experimental/babel-preset-env/test/fixtures/preset-options/use-builtins-chrome-49/expected.js @@ -15,6 +15,9 @@ import "core-js/modules/es7.object.entries"; import "core-js/modules/es7.object.get-own-property-descriptors"; import "core-js/modules/es7.string.pad-start"; import "core-js/modules/es7.string.pad-end"; +import "core-js/modules/web.timers"; +import "core-js/modules/web.immediate"; +import "core-js/modules/web.dom.iterable"; import "core-js/modules/regenerator-runtime/runtime"; -Math.pow(1, 2); +Math.pow(1, 2); \ No newline at end of file diff --git a/experimental/babel-preset-env/test/fixtures/preset-options/use-builtins-import/expected.js b/experimental/babel-preset-env/test/fixtures/preset-options/use-builtins-import/expected.js index 5fe99c52a3..9e8a5ca09d 100644 --- a/experimental/babel-preset-env/test/fixtures/preset-options/use-builtins-import/expected.js +++ b/experimental/babel-preset-env/test/fixtures/preset-options/use-builtins-import/expected.js @@ -1,4 +1,7 @@ import "core-js/modules/es7.string.pad-start"; import "core-js/modules/es7.string.pad-end"; +import "core-js/modules/web.timers"; +import "core-js/modules/web.immediate"; +import "core-js/modules/web.dom.iterable"; -1 ** 2; +1 ** 2; \ No newline at end of file diff --git a/experimental/babel-preset-env/test/fixtures/preset-options/use-builtins-multiple-imports/expected.js b/experimental/babel-preset-env/test/fixtures/preset-options/use-builtins-multiple-imports/expected.js index 5fe99c52a3..9e8a5ca09d 100644 --- a/experimental/babel-preset-env/test/fixtures/preset-options/use-builtins-multiple-imports/expected.js +++ b/experimental/babel-preset-env/test/fixtures/preset-options/use-builtins-multiple-imports/expected.js @@ -1,4 +1,7 @@ import "core-js/modules/es7.string.pad-start"; import "core-js/modules/es7.string.pad-end"; +import "core-js/modules/web.timers"; +import "core-js/modules/web.immediate"; +import "core-js/modules/web.dom.iterable"; -1 ** 2; +1 ** 2; \ No newline at end of file diff --git a/experimental/babel-preset-env/test/fixtures/preset-options/use-builtins-regenerator-true/expected.js b/experimental/babel-preset-env/test/fixtures/preset-options/use-builtins-regenerator-true/expected.js index 80bd6e9561..90382f6a1a 100644 --- a/experimental/babel-preset-env/test/fixtures/preset-options/use-builtins-regenerator-true/expected.js +++ b/experimental/babel-preset-env/test/fixtures/preset-options/use-builtins-regenerator-true/expected.js @@ -81,6 +81,9 @@ import "core-js/modules/es7.object.entries"; import "core-js/modules/es7.object.get-own-property-descriptors"; import "core-js/modules/es7.string.pad-start"; import "core-js/modules/es7.string.pad-end"; +import "core-js/modules/web.timers"; +import "core-js/modules/web.immediate"; +import "core-js/modules/web.dom.iterable"; import "core-js/modules/regenerator-runtime/runtime"; -Math.pow(1, 2); +Math.pow(1, 2); \ No newline at end of file diff --git a/experimental/babel-preset-env/test/fixtures/preset-options/use-builtins-require/expected.js b/experimental/babel-preset-env/test/fixtures/preset-options/use-builtins-require/expected.js index 8b669141c2..5b1e24da7e 100644 --- a/experimental/babel-preset-env/test/fixtures/preset-options/use-builtins-require/expected.js +++ b/experimental/babel-preset-env/test/fixtures/preset-options/use-builtins-require/expected.js @@ -2,4 +2,10 @@ require("core-js/modules/es7.string.pad-start"); require("core-js/modules/es7.string.pad-end"); -1 ** 2; +require("core-js/modules/web.timers"); + +require("core-js/modules/web.immediate"); + +require("core-js/modules/web.dom.iterable"); + +1 ** 2; \ No newline at end of file diff --git a/experimental/babel-preset-env/test/fixtures/preset-options/whitelist/expected.js b/experimental/babel-preset-env/test/fixtures/preset-options/whitelist/expected.js index 30b4a43e11..431d61e441 100644 --- a/experimental/babel-preset-env/test/fixtures/preset-options/whitelist/expected.js +++ b/experimental/babel-preset-env/test/fixtures/preset-options/whitelist/expected.js @@ -4,4 +4,4 @@ var _a = require("a"); var _a2 = _interopRequireDefault(_a); -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } \ No newline at end of file