diff --git a/experimental/babel-preset-env/README.md b/experimental/babel-preset-env/README.md index 4351d20626..0e4879b96a 100644 --- a/experimental/babel-preset-env/README.md +++ b/experimental/babel-preset-env/README.md @@ -120,6 +120,47 @@ 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"). + +> 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 +``` + +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: 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 + +```js +import "babel-polyfill"; +``` + +Out (different based on environment) + +```js +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";`) + +``` +npm install core-js --save +``` + +--- + ## Examples ```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..09d3924618 --- /dev/null +++ b/experimental/babel-preset-env/data/builtInFeatures.js @@ -0,0 +1,134 @@ +// https://github.com/zloirock/core-js + +const es2015 = { + // "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", + // Proxy not implementable + + "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", + "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": { + 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", + "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", + // "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", + "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.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", + "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", + "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", +}; + +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/data/builtIns.json b/experimental/babel-preset-env/data/builtIns.json new file mode 100644 index 0000000000..6eaa2cc59b --- /dev/null +++ b/experimental/babel-preset-env/data/builtIns.json @@ -0,0 +1,708 @@ +{ + "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, + "firefox": 4, + "safari": 5, + "node": 0.12, + "ie": 10, + "android": 4, + "ios": 6 + }, + "es6.typed.uint8-array": { + "chrome": 5, + "opera": 12, + "firefox": 4, + "safari": 5, + "node": 0.12, + "ie": 10, + "android": 4, + "ios": 6 + }, + "es6.typed.uint8-clamped-array": { + "chrome": 5, + "opera": 12, + "edge": 12, + "firefox": 4, + "safari": 6, + "node": 0.12, + "ios": 10 + }, + "es6.typed.int16-array": { + "chrome": 5, + "opera": 12, + "firefox": 4, + "safari": 5, + "node": 0.12, + "ie": 10, + "android": 4, + "ios": 6 + }, + "es6.typed.uint16-array": { + "chrome": 5, + "opera": 12, + "firefox": 4, + "safari": 5, + "node": 0.12, + "ie": 10, + "android": 4, + "ios": 6 + }, + "es6.typed.int32-array": { + "chrome": 5, + "opera": 12, + "firefox": 4, + "safari": 5, + "node": 0.12, + "ie": 10, + "android": 4, + "ios": 6 + }, + "es6.typed.uint32-array": { + "chrome": 5, + "opera": 12, + "firefox": 4, + "safari": 5, + "node": 0.12, + "ie": 10, + "android": 4, + "ios": 6 + }, + "es6.typed.float32-array": { + "chrome": 5, + "opera": 12, + "firefox": 4, + "safari": 5, + "node": 0.12, + "ie": 10, + "android": 4, + "ios": 6 + }, + "es6.typed.float64-array": { + "chrome": 5, + "opera": 12, + "firefox": 4, + "safari": 5, + "node": 0.12, + "ie": 10, + "android": 4.1, + "ios": 6 + }, + "es6.map": { + "chrome": 51, + "opera": 38, + "safari": 10, + "node": 6.5, + "ios": 10 + }, + "es6.set": { + "chrome": 51, + "opera": 38, + "safari": 10, + "node": 6.5, + "ios": 10 + }, + "es6.weak-map": { + "chrome": 51, + "opera": 38, + "safari": 9, + "ios": 10 + }, + "es6.weak-set": { + "chrome": 51, + "opera": 38, + "safari": 9, + "ios": 9 + }, + "es6.reflect.apply": { + "chrome": 49, + "opera": 36, + "edge": 12, + "firefox": 42, + "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, + "edge": 13, + "firefox": 42, + "safari": 10, + "ios": 10 + }, + "es6.reflect.delete-property": { + "chrome": 49, + "opera": 36, + "edge": 12, + "firefox": 42, + "safari": 10, + "ios": 10 + }, + "es6.reflect.get": { + "chrome": 49, + "opera": 36, + "edge": 12, + "firefox": 42, + "safari": 10, + "ios": 10 + }, + "es6.reflect.get-own-property-descriptor": { + "chrome": 49, + "opera": 36, + "edge": 12, + "firefox": 42, + "safari": 10, + "ios": 10 + }, + "es6.reflect.get-prototype-of": { + "chrome": 49, + "opera": 36, + "edge": 12, + "firefox": 42, + "safari": 10, + "ios": 10 + }, + "es6.reflect.has": { + "chrome": 49, + "opera": 36, + "edge": 12, + "firefox": 42, + "safari": 10, + "ios": 10 + }, + "es6.reflect.is-extensible": { + "chrome": 49, + "opera": 36, + "edge": 12, + "firefox": 42, + "safari": 10, + "ios": 10 + }, + "es6.reflect.own-keys": { + "chrome": 49, + "opera": 36, + "edge": 12, + "firefox": 42, + "safari": 10, + "ios": 10 + }, + "es6.reflect.prevent-extensions": { + "chrome": 49, + "opera": 36, + "edge": 12, + "firefox": 42, + "safari": 10, + "ios": 10 + }, + "es6.reflect.set": { + "chrome": 49, + "opera": 36, + "edge": 12, + "firefox": 42, + "safari": 10, + "ios": 10 + }, + "es6.reflect.set-prototype-of": { + "chrome": 49, + "opera": 36, + "edge": 12, + "firefox": 42, + "safari": 10, + "ios": 10 + }, + "es6.promise": { + "chrome": 51, + "opera": 38, + "edge": 13, + "firefox": 45, + "safari": 10, + "node": 6.5, + "ios": 10 + }, + "es6.symbol": { + "chrome": 51, + "opera": 38, + "firefox": 51, + "safari": 10, + "ios": 10 + }, + "es6.object.assign": { + "chrome": 45, + "opera": 32, + "edge": 12, + "firefox": 34, + "safari": 9, + "node": 4, + "ios": 9 + }, + "es6.object.is": { + "chrome": 19, + "edge": 12, + "firefox": 22, + "safari": 9, + "node": 0.12, + "android": 4.1, + "ios": 9 + }, + "es6.object.get-own-property-symbols": { + "chrome": 38, + "opera": 25, + "edge": 12, + "firefox": 36, + "safari": 9, + "node": 0.12, + "ios": 9 + }, + "es6.object.set-prototype-of": { + "chrome": 34, + "opera": 21, + "firefox": 31, + "safari": 9, + "node": 0.12, + "ie": 11, + "ios": 9 + }, + "es6.function.name": { + "chrome": 51, + "opera": 38, + "safari": 10, + "node": 6.5, + "ios": 10 + }, + "es6.string.raw": { + "chrome": 41, + "opera": 28, + "edge": 12, + "firefox": 34, + "safari": 9, + "node": 4, + "ios": 9 + }, + "es6.string.from-code-point": { + "chrome": 41, + "opera": 28, + "edge": 12, + "firefox": 29, + "safari": 9, + "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": 29, + "safari": 9, + "node": 4, + "ios": 9 + }, + "es6.string.ends-with": { + "chrome": 41, + "opera": 28, + "edge": 12, + "firefox": 29, + "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": { + "chrome": 51, + "opera": 38, + "safari": 10, + "node": 6.5, + "ios": 10 + }, + "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.array.iterator": { + "chrome": 38, + "opera": 25, + "edge": 12, + "firefox": 28, + "safari": 7, + "node": 0.12, + "ios": 10 + }, + "es6.number.is-finite": { + "chrome": 19, + "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, + "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, + "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 + }, + "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, + "ios": 10 + }, + "es7.string.pad-end": { + "firefox": 48, + "safari": 10, + "ios": 10 + } +} 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 1c70a4884f..0f027795b6 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) })); @@ -65,22 +66,37 @@ 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) => { + 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) { + return "-1"; + } // `equals` in compat-table Object.keys(test).forEach((t) => { @@ -98,7 +114,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 +131,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) { + if (plugin.chrome >= 28) { + plugin.opera = plugin.chrome - 13; + } else 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..476a92e536 100644 --- a/experimental/babel-preset-env/src/index.js +++ b/experimental/babel-preset-env/src/index.js @@ -1,5 +1,7 @@ import pluginList from "../data/plugins.json"; +import builtInsList from "../data/builtIns.json"; import browserslist from "browserslist"; +import transformPolyfillRequirePlugin from "./transformPolyfillRequirePlugin"; export const MODULE_TRANSFORMATIONS = { "amd": "transform-es2015-modules-amd", @@ -134,38 +136,58 @@ 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); 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])); + let polyfills; + if (useBuiltIns) { + polyfills = Object.keys(builtInsList) + .filter((builtInName) => isPluginRequired(targets, builtInsList[builtInName])); + } + 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(`modules transform: ${moduleType}`); console.log(""); - console.log(`module: ${moduleType}`); + 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) => { + let allTransformations = [...transformations, ...whitelist]; + let regenerator = allTransformations.indexOf("transform-regenerator") >= 0; + + let plugins = allTransformations.map((pluginName) => { return [require(`babel-plugin-${pluginName}`), { loose }]; }); @@ -179,7 +201,8 @@ export default function buildPreset(context, opts = {}) { return { plugins: [ ...modules, - ...transformations - ] + ...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 new file mode 100644 index 0000000000..11782b1dd7 --- /dev/null +++ b/experimental/babel-preset-env/src/transformPolyfillRequirePlugin.js @@ -0,0 +1,104 @@ +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}`)); + declar._blockHoist = 3; + return declar; + } + + function createRequireStatement(polyfill) { + return t.expressionStatement( + t.callExpression( + t.identifier("require"), + [ + t.stringLiteral(`core-js/modules/${polyfill}`) + ] + ) + ); + } + + 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]) && + 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 && + isPolyfillSource(path.node.source.value)) { + this.numPolyfillImports++; + if (this.numPolyfillImports > 1) { + path.remove(); + return; + } + + path.replaceWithMultiple( + createImports([...state.opts.polyfills, ...whitelist], "import", state.opts.regenerator) + ); + } + }, + Program(path, state) { + if (!state.opts.polyfills) { + throw path.buildCodeFrameError(` +There was an issue in "babel-preset-env" such that +the "polyfills" option was not correctly passed +to the "transform-polyfill-require" plugin +`); + } + path.get("body").forEach((bodyPath) => { + if (isRequire(bodyPath)) { + this.numPolyfillImports++; + if (this.numPolyfillImports > 1) { + path.remove(); + return; + } + + bodyPath.replaceWithMultiple( + createImports([...state.opts.polyfills, ...whitelist], "require", state.opts.regenerator) + ); + } + }); + } + }; + + return { + name: "transform-polyfill-require", + visitor: isPolyfillImport, + pre() { + this.numPolyfillImports = 0; + } + }; +} 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..81d166d7ff --- /dev/null +++ b/experimental/babel-preset-env/test/fixtures/plugin-options/filters-duplicates/expected.js @@ -0,0 +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/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" + ] + }] + ] +} 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..949a0f6afe --- /dev/null +++ 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-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..80b0d61e35 --- /dev/null +++ b/experimental/babel-preset-env/test/fixtures/plugin-options/regenerator-true/expected.js @@ -0,0 +1,4 @@ +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/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/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..2f3d87c876 --- /dev/null +++ b/experimental/babel-preset-env/test/fixtures/preset-options/core-js/expected.js @@ -0,0 +1,5 @@ +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"; \ 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/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/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 + }] + ] +} 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..a5aab0e153 --- /dev/null +++ b/experimental/babel-preset-env/test/fixtures/preset-options/use-builtins-chrome-48/expected.js @@ -0,0 +1,37 @@ +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.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"; +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); \ 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..a9683cfbd6 --- /dev/null +++ b/experimental/babel-preset-env/test/fixtures/preset-options/use-builtins-chrome-49/expected.js @@ -0,0 +1,23 @@ +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.symbol"; +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"; +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); \ No newline at end of file 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 + }] + ] +} 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..9e8a5ca09d --- /dev/null +++ b/experimental/babel-preset-env/test/fixtures/preset-options/use-builtins-import/expected.js @@ -0,0 +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; \ No newline at end of file diff --git a/experimental/babel-preset-env/test/fixtures/preset-options/use-builtins-import/options.json b/experimental/babel-preset-env/test/fixtures/preset-options/use-builtins-import/options.json new file mode 100644 index 0000000000..de09fa3f05 --- /dev/null +++ b/experimental/babel-preset-env/test/fixtures/preset-options/use-builtins-import/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-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..9e8a5ca09d --- /dev/null +++ b/experimental/babel-preset-env/test/fixtures/preset-options/use-builtins-multiple-imports/expected.js @@ -0,0 +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; \ 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-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..90382f6a1a --- /dev/null +++ b/experimental/babel-preset-env/test/fixtures/preset-options/use-builtins-regenerator-true/expected.js @@ -0,0 +1,89 @@ +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/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); \ No newline at end of file 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 + }] + ] +} 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..5b1e24da7e --- /dev/null +++ b/experimental/babel-preset-env/test/fixtures/preset-options/use-builtins-require/expected.js @@ -0,0 +1,11 @@ +require("core-js/modules/es7.string.pad-start"); + +require("core-js/modules/es7.string.pad-end"); + +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/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 + }] + ] +} 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