Merge pull request #56 from babel/builtins-option

add useBuiltIns option
This commit is contained in:
Henry Zhu 2016-12-09 11:57:46 -05:00 committed by GitHub
commit b44949025a
45 changed files with 1408 additions and 37 deletions

View File

@ -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

View File

@ -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);

View File

@ -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
}
}

View File

@ -1,4 +1,3 @@
/* eslint-disable quotes */
module.exports = {
// es2015
"transform-es2015-arrow-functions": {

View File

@ -82,7 +82,8 @@
"sourceType": "module"
},
"rules": {
"max-len": 0
"max-len": 0,
"quotes": ["error", "double", { "avoidEscape": true }]
},
"env": {
"mocha": true

View File

@ -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"
);

View File

@ -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)
};
}

View File

@ -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;
}
};
}

View File

@ -0,0 +1 @@
import "babel-polyfill";

View File

@ -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";

View File

@ -0,0 +1,11 @@
{
"plugins": [
["../../../../lib/transformPolyfillRequirePlugin", {
"polyfills": [
"es6.typed.data-view",
"es6.typed.data-view",
"es6.reflect.apply"
]
}]
]
}

View File

@ -0,0 +1 @@
import "babel-polyfill";

View File

@ -0,0 +1,3 @@
import "core-js/modules/web.timers";
import "core-js/modules/web.immediate";
import "core-js/modules/web.dom.iterable";

View File

@ -0,0 +1,8 @@
{
"plugins": [
["../../../../lib/transformPolyfillRequirePlugin", {
"regenerator": false,
"polyfills": []
}]
]
}

View File

@ -0,0 +1 @@
import "babel-polyfill";

View File

@ -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";

View File

@ -0,0 +1,8 @@
{
"plugins": [
["../../../../lib/transformPolyfillRequirePlugin", {
"regenerator": true,
"polyfills": []
}]
]
}

View File

@ -0,0 +1 @@
import "core-js";

View File

@ -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";

View File

@ -0,0 +1,11 @@
{
"presets": [
["../../../../lib", {
"targets": {
"chrome": 55
},
"modules": false,
"useBuiltIns": true
}]
]
}

View File

@ -1,3 +1,3 @@
"use strict";
var a = "1";
var a = "1";

View File

@ -1 +1 @@
import a from "a";
import a from "a";

View File

@ -1,3 +1,3 @@
"use strict";
var a = "1";
var a = "1";

View File

@ -0,0 +1,2 @@
import "not-core-js";
import "not-babel-polyfill";

View File

@ -0,0 +1,2 @@
import "not-core-js";
import "not-babel-polyfill";

View File

@ -0,0 +1,11 @@
{
"presets": [
["../../../../lib", {
"targets": {
"chrome": 55
},
"modules": false,
"useBuiltIns": true
}]
]
}

View File

@ -0,0 +1,2 @@
import "babel-polyfill";
1 ** 2;

View File

@ -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);

View File

@ -0,0 +1,11 @@
{
"presets": [
["../../../../lib", {
"targets": {
"chrome": 48
},
"modules": false,
"useBuiltIns": true
}]
]
}

View File

@ -0,0 +1,2 @@
import "babel-polyfill";
1 ** 2;

View File

@ -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);

View File

@ -0,0 +1,11 @@
{
"presets": [
["../../../../lib", {
"targets": {
"chrome": 49
},
"modules": false,
"useBuiltIns": true
}]
]
}

View File

@ -0,0 +1,2 @@
import "babel-polyfill";
1 ** 2;

View File

@ -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;

View File

@ -0,0 +1,11 @@
{
"presets": [
["../../../../lib", {
"targets": {
"chrome": 55
},
"modules": false,
"useBuiltIns": true
}]
]
}

View File

@ -0,0 +1,3 @@
import "babel-polyfill";
import "babel-polyfill";
1 ** 2;

View File

@ -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;

View File

@ -0,0 +1,11 @@
{
"presets": [
["../../../../lib", {
"targets": {
"chrome": 55
},
"modules": false,
"useBuiltIns": true
}]
]
}

View File

@ -0,0 +1,2 @@
import "babel-polyfill";
1 ** 2;

View File

@ -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);

View File

@ -0,0 +1,8 @@
{
"presets": [
["../../../../lib", {
"modules": false,
"useBuiltIns": true
}]
]
}

View File

@ -0,0 +1,3 @@
require("babel-polyfill");
1 ** 2;

View File

@ -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;

View File

@ -0,0 +1,11 @@
{
"presets": [
["../../../../lib", {
"targets": {
"chrome": 55
},
"modules": false,
"useBuiltIns": true
}]
]
}

View File

@ -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 }; }