diff --git a/.eslintignore b/.eslintignore index 8af3c044..932967f9 100644 --- a/.eslintignore +++ b/.eslintignore @@ -1,4 +1,5 @@ /lib +debug-fixtures fixtures /data /flow-typed diff --git a/src/debug.js b/src/debug.js new file mode 100644 index 00000000..f6369b35 --- /dev/null +++ b/src/debug.js @@ -0,0 +1,20 @@ +import semver from "semver"; +import { prettifyVersion, semverify } from "./utils"; + +export const logMessage = (message, context) => { + const pre = context ? `[${context}] ` : ""; + const logStr = ` ${pre}${message}`; + console.log(logStr); +}; + +export const logPlugin = (plugin, targets, list, context) => { + const envList = list[plugin] || {}; + const filteredList = Object.keys(targets).reduce((a, b) => { + if (!envList[b] || semver.lt(targets[b], semverify(envList[b]))) { + a[b] = prettifyVersion(targets[b]); + } + return a; + }, {}); + + logMessage(`${plugin} ${JSON.stringify(filteredList)}`, context); +}; diff --git a/src/index.js b/src/index.js index a171f6d4..f399c284 100644 --- a/src/index.js +++ b/src/index.js @@ -1,5 +1,6 @@ import semver from "semver"; import builtInsList from "../data/built-ins.json"; +import { logPlugin } from "./debug"; import { defaultWebIncludes } from "./default-includes"; import moduleTransformations from "./module-transformations"; import normalizeOptions from "./normalize-options.js"; @@ -7,7 +8,7 @@ import pluginList from "../data/plugins.json"; import useBuiltInsEntryPlugin from "./use-built-ins-entry-plugin"; import addUsedBuiltInsPlugin from "./use-built-ins-plugin"; import getTargets from "./targets-parser"; -import { prettifyTargets, prettifyVersion, semverify } from "./utils"; +import { prettifyTargets, semverify } from "./utils"; /** * Determine if a transformation is required @@ -54,21 +55,6 @@ export const isPluginRequired = (supportedEnvironments, plugin) => { let hasBeenLogged = false; -const logPlugin = (plugin, targets, list) => { - const envList = list[plugin] || {}; - const filteredList = Object.keys(targets).reduce( - (a, b) => { - if (!envList[b] || semver.lt(targets[b], semverify(envList[b]))) { - a[b] = prettifyVersion(targets[b]); - } - return a; - }, - {}, - ); - const logStr = ` ${plugin} ${JSON.stringify(filteredList)}`; - console.log(logStr); -}; - const getBuiltInTargets = targets => { const builtInTargets = Object.assign({}, targets); if (builtInTargets.uglify != null) { @@ -150,18 +136,6 @@ export default function buildPreset(context, opts = {}) { ); } - if (debug && !hasBeenLogged) { - hasBeenLogged = true; - console.log("babel-preset-env: `DEBUG` option"); - console.log("\nUsing targets:"); - console.log(JSON.stringify(prettifyTargets(targets), null, 2)); - console.log(`\nModules transform: ${moduleType}`); - console.log("\nUsing plugins:"); - transformations.forEach(transform => { - logPlugin(transform, targets, pluginList); - }); - } - const plugins = []; if (moduleType !== false && moduleTransformations[moduleType]) { @@ -172,38 +146,49 @@ export default function buildPreset(context, opts = {}) { } transformations.forEach(pluginName => - plugins.push([require(`babel-plugin-${pluginName}`), { loose }])); + plugins.push([require(`babel-plugin-${pluginName}`), { loose }]), + ); const regenerator = transformations.has("transform-regenerator"); - if (debug) { + if (debug && !hasBeenLogged) { + hasBeenLogged = true; + console.log("babel-preset-env: `DEBUG` option"); + console.log("\nUsing targets:"); + console.log(JSON.stringify(prettifyTargets(targets), null, 2)); + console.log(`\nModules transform: ${moduleType}`); + console.log("\nUsing plugins:"); + transformations.forEach(transform => { + logPlugin(transform, targets, pluginList); + }); console.log(""); console.log("Polyfills"); console.log("========="); console.log(""); + + if (!useBuiltIns) { + console.log( + "None were added, since the `useBuiltIns` option was not set.", + ); + } } - if (useBuiltIns === "usage") { - plugins.push([ - addUsedBuiltInsPlugin, - { - debug, - polyfills, - regenerator, + if (useBuiltIns === "usage" || useBuiltIns === "entry") { + const pluginOptions = { + debug, + polyfills, + regenerator, + onDebug: (polyfills, context) => { + polyfills.forEach(polyfill => + logPlugin(polyfill, polyfillTargets, builtInsList, context), + ); }, - ]); - } else if (useBuiltIns === "entry") { + }; + plugins.push([ - useBuiltInsEntryPlugin, - { - debug, - polyfills, - regenerator, - onDebug: polyfill => logPlugin(polyfill, polyfillTargets, builtInsList), - }, + useBuiltIns === "usage" ? addUsedBuiltInsPlugin : useBuiltInsEntryPlugin, + pluginOptions, ]); - } else if (debug) { - console.log("None were added, since the `useBuiltIns` option was not set."); } return { diff --git a/src/use-built-ins-entry-plugin.js b/src/use-built-ins-entry-plugin.js index ea98503a..6734abc4 100644 --- a/src/use-built-ins-entry-plugin.js +++ b/src/use-built-ins-entry-plugin.js @@ -16,13 +16,15 @@ export default function({ types: t }) { } function isRequire(path) { - return t.isExpressionStatement(path.node) && + 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); + isPolyfillSource(path.node.expression.arguments[0].value) + ); } function createImport(polyfill, requireType, core) { @@ -97,7 +99,7 @@ export default function({ types: t }) { } console.log("Replaced `babel-polyfill` with the following polyfills:"); - polyfills.forEach(polyfill => onDebug(polyfill)); + onDebug(polyfills); } }, }; diff --git a/src/use-built-ins-plugin.js b/src/use-built-ins-plugin.js index 3f72ba61..41f26600 100644 --- a/src/use-built-ins-plugin.js +++ b/src/use-built-ins-plugin.js @@ -23,11 +23,26 @@ function getObjectString(node) { } } +const modulePathMap = { + "regenerator-runtime": "babel-polyfill/lib/regenerator-runtime/runtime", +}; + +const getModulePath = module => { + return ( + modulePathMap[module] || `babel-polyfill/lib/core-js/modules/${module}` + ); +}; + export default function({ types: t }) { function addImport(path, builtIn, builtIns) { if (builtIn && !builtIns.has(builtIn)) { builtIns.add(builtIn); - const importDec = t.importDeclaration([], t.stringLiteral(builtIn)); + + const importDec = t.importDeclaration( + [], + t.stringLiteral(getModulePath(builtIn)), + ); + importDec._blockHoist = 3; const programPath = path.find(path => path.isProgram()); programPath.unshiftContainer("body", importDec); @@ -38,28 +53,26 @@ export default function({ types: t }) { if (Array.isArray(builtIn)) { for (const i of builtIn) { if (polyfills.has(i)) { - addImport(path, `babel-polyfill/lib/core-js/modules/${i}`, builtIns); + addImport(path, i, builtIns); } } } else { if (polyfills.has(builtIn)) { - addImport( - path, - `babel-polyfill/lib/core-js/modules/${builtIn}`, - builtIns, - ); + addImport(path, builtIn, builtIns); } } } function isRequire(path) { - return t.isExpressionStatement(path.node) && + 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); + isPolyfillSource(path.node.expression.arguments[0].value) + ); } const addAndRemovePolyfillImports = { @@ -118,11 +131,7 @@ Please remove the "require('babel-polyfill')" call or use "useBuiltIns: 'entry'" return; } - addImport( - path, - "babel-polyfill/lib/core-js/modules/web.dom.iterable", - this.builtIns, - ); + addImport(path, "web.dom.iterable", this.builtIns); }, // Symbol.iterator in arr @@ -130,22 +139,14 @@ Please remove the "require('babel-polyfill')" call or use "useBuiltIns: 'entry'" if (path.node.operator !== "in") return; if (!path.get("left").matchesPattern("Symbol.iterator")) return; - addImport( - path, - "babel-polyfill/lib/core-js/modules/web.dom.iterable", - this.builtIns, - ); + addImport(path, "web.dom.iterable", this.builtIns); }, // yield* YieldExpression(path) { if (!path.node.delegate) return; - addImport( - path, - "babel-polyfill/lib/core-js/modules/web.dom.iterable", - this.builtIns, - ); + addImport(path, "web.dom.iterable", this.builtIns); }, // Array.from @@ -261,11 +262,7 @@ Please remove the "require('babel-polyfill')" call or use "useBuiltIns: 'entry'" if (!this.usesRegenerator && (path.node.generator || path.node.async)) { this.usesRegenerator = true; if (state.opts.regenerator) { - addImport( - path, - "babel-polyfill/lib/regenerator-runtime/runtime", - this.builtIns, - ); + addImport(path, "regenerator-runtime", this.builtIns); } } }, @@ -277,6 +274,13 @@ Please remove the "require('babel-polyfill')" call or use "useBuiltIns: 'entry'" this.builtIns = new Set(); this.usesRegenerator = false; }, + post() { + const { debug, onDebug } = this.opts; + + if (debug) { + onDebug(this.builtIns, this.file.opts.filename); + } + }, visitor: addAndRemovePolyfillImports, }; } diff --git a/test/debug-fixtures.js b/test/debug-fixtures.js index 6208f8e3..0d820ff5 100644 --- a/test/debug-fixtures.js +++ b/test/debug-fixtures.js @@ -96,11 +96,21 @@ describe("debug output", () => { ); } + const inFilesFolderLoc = path.join(testLoc, "in"); + opts.inFiles = { - "src/in.js": "", ".babelrc": helper.readFile(optionsLoc), }; + if (!fs.existsSync(inFilesFolderLoc)) { + opts.inFiles["src/in.js"] = ""; + } else { + fs.readdirSync(inFilesFolderLoc).forEach(filename => { + opts.inFiles[`src/${filename}`] = helper.readFile( + path.join(inFilesFolderLoc, filename), + ); + }); + } it(testName, buildTest(opts)); }); }); diff --git a/test/debug-fixtures/usage-none/in/in.js b/test/debug-fixtures/usage-none/in/in.js new file mode 100644 index 00000000..4ec1fa47 --- /dev/null +++ b/test/debug-fixtures/usage-none/in/in.js @@ -0,0 +1 @@ +var foo = "bar"; diff --git a/test/debug-fixtures/usage-none/in/in2.js b/test/debug-fixtures/usage-none/in/in2.js new file mode 100644 index 00000000..3fbea9d2 --- /dev/null +++ b/test/debug-fixtures/usage-none/in/in2.js @@ -0,0 +1,5 @@ +var x = 0; + +for (var i = 0; i < 5; i++) { + x += i; +} diff --git a/test/debug-fixtures/usage-none/options.json b/test/debug-fixtures/usage-none/options.json new file mode 100644 index 00000000..f1f5db8b --- /dev/null +++ b/test/debug-fixtures/usage-none/options.json @@ -0,0 +1,13 @@ +{ + "presets": [ + ["../../lib", { + "debug": true, + "targets": { + "chrome": 52, + "firefox": 50, + "ie": 11 + }, + "useBuiltIns": "usage" + }] + ] +} diff --git a/test/debug-fixtures/usage-none/stdout.txt b/test/debug-fixtures/usage-none/stdout.txt new file mode 100644 index 00000000..016878f0 --- /dev/null +++ b/test/debug-fixtures/usage-none/stdout.txt @@ -0,0 +1,40 @@ +babel-preset-env: `DEBUG` option + +Using targets: +{ + "chrome": "52", + "firefox": "50", + "ie": "11" +} + +Modules transform: commonjs + +Using plugins: + check-es2015-constants {"firefox":"50","ie":"11"} + transform-es2015-arrow-functions {"ie":"11"} + transform-es2015-block-scoping {"firefox":"50","ie":"11"} + transform-es2015-classes {"ie":"11"} + transform-es2015-computed-properties {"ie":"11"} + transform-es2015-destructuring {"firefox":"50","ie":"11"} + transform-es2015-duplicate-keys {"ie":"11"} + transform-es2015-for-of {"firefox":"50","ie":"11"} + transform-es2015-function-name {"firefox":"50","ie":"11"} + transform-es2015-literals {"firefox":"50","ie":"11"} + transform-es2015-object-super {"ie":"11"} + transform-es2015-parameters {"firefox":"50","ie":"11"} + transform-es2015-shorthand-properties {"ie":"11"} + transform-es2015-spread {"ie":"11"} + transform-es2015-sticky-regex {"ie":"11"} + transform-es2015-template-literals {"ie":"11"} + transform-es2015-typeof-symbol {"ie":"11"} + transform-es2015-unicode-regex {"ie":"11"} + transform-regenerator {"firefox":"50","ie":"11"} + transform-exponentiation-operator {"firefox":"50","ie":"11"} + transform-async-to-generator {"chrome":"52","firefox":"50","ie":"11"} + syntax-trailing-function-commas {"chrome":"52","firefox":"50","ie":"11"} + +Polyfills +========= + +src/in.js -> lib/in.js +src/in2.js -> lib/in2.js \ No newline at end of file diff --git a/test/debug-fixtures/usage/in/in.js b/test/debug-fixtures/usage/in/in.js new file mode 100644 index 00000000..b464d7f1 --- /dev/null +++ b/test/debug-fixtures/usage/in/in.js @@ -0,0 +1,3 @@ +const foo = new Promise((resolve) => { + resolve(new Map()); +}); diff --git a/test/debug-fixtures/usage/in/in2.js b/test/debug-fixtures/usage/in/in2.js new file mode 100644 index 00000000..4915d620 --- /dev/null +++ b/test/debug-fixtures/usage/in/in2.js @@ -0,0 +1,3 @@ +function* a() { + yield* 1; +} diff --git a/test/debug-fixtures/usage/options.json b/test/debug-fixtures/usage/options.json new file mode 100644 index 00000000..f1f5db8b --- /dev/null +++ b/test/debug-fixtures/usage/options.json @@ -0,0 +1,13 @@ +{ + "presets": [ + ["../../lib", { + "debug": true, + "targets": { + "chrome": 52, + "firefox": 50, + "ie": 11 + }, + "useBuiltIns": "usage" + }] + ] +} diff --git a/test/debug-fixtures/usage/stdout.txt b/test/debug-fixtures/usage/stdout.txt new file mode 100644 index 00000000..039877a7 --- /dev/null +++ b/test/debug-fixtures/usage/stdout.txt @@ -0,0 +1,44 @@ +babel-preset-env: `DEBUG` option + +Using targets: +{ + "chrome": "52", + "firefox": "50", + "ie": "11" +} + +Modules transform: commonjs + +Using plugins: + check-es2015-constants {"firefox":"50","ie":"11"} + transform-es2015-arrow-functions {"ie":"11"} + transform-es2015-block-scoping {"firefox":"50","ie":"11"} + transform-es2015-classes {"ie":"11"} + transform-es2015-computed-properties {"ie":"11"} + transform-es2015-destructuring {"firefox":"50","ie":"11"} + transform-es2015-duplicate-keys {"ie":"11"} + transform-es2015-for-of {"firefox":"50","ie":"11"} + transform-es2015-function-name {"firefox":"50","ie":"11"} + transform-es2015-literals {"firefox":"50","ie":"11"} + transform-es2015-object-super {"ie":"11"} + transform-es2015-parameters {"firefox":"50","ie":"11"} + transform-es2015-shorthand-properties {"ie":"11"} + transform-es2015-spread {"ie":"11"} + transform-es2015-sticky-regex {"ie":"11"} + transform-es2015-template-literals {"ie":"11"} + transform-es2015-typeof-symbol {"ie":"11"} + transform-es2015-unicode-regex {"ie":"11"} + transform-regenerator {"firefox":"50","ie":"11"} + transform-exponentiation-operator {"firefox":"50","ie":"11"} + transform-async-to-generator {"chrome":"52","firefox":"50","ie":"11"} + syntax-trailing-function-commas {"chrome":"52","firefox":"50","ie":"11"} + +Polyfills +========= + + [src/in.js] es6.promise {"ie":"11"} + [src/in.js] es6.map {"firefox":"50","ie":"11"} +src/in.js -> lib/in.js + [src/in2.js] regenerator-runtime {"chrome":"52","firefox":"50","ie":"11"} + [src/in2.js] web.dom.iterable {"chrome":"52","firefox":"50","ie":"11"} +src/in2.js -> lib/in2.js \ No newline at end of file diff --git a/test/debug-fixtures/versions-decimals/options.json b/test/debug-fixtures/versions-decimals/options.json index 0310aa52..5afbc32a 100644 --- a/test/debug-fixtures/versions-decimals/options.json +++ b/test/debug-fixtures/versions-decimals/options.json @@ -1,7 +1,7 @@ { "presets": [ ["../../lib", { - "useBuiltIns": "usage", + "useBuiltIns": "entry", "debug": true, "targets": { "chrome": 54, diff --git a/test/debug-fixtures/versions-decimals/stdout.txt b/test/debug-fixtures/versions-decimals/stdout.txt index 97e21865..7139cd0c 100644 --- a/test/debug-fixtures/versions-decimals/stdout.txt +++ b/test/debug-fixtures/versions-decimals/stdout.txt @@ -46,4 +46,91 @@ Using plugins: Polyfills ========= +Replaced `babel-polyfill` with the following polyfills: + es6.typed.array-buffer {"electron":"0.36","node":"6.1","ie":"10"} + es6.typed.data-view {"electron":"0.36"} + es6.typed.int8-array {"electron":"0.36","node":"6.1","ie":"10"} + es6.typed.uint8-array {"electron":"0.36","node":"6.1","ie":"10"} + es6.typed.uint8-clamped-array {"electron":"0.36","node":"6.1","ie":"10"} + es6.typed.int16-array {"electron":"0.36","node":"6.1","ie":"10"} + es6.typed.uint16-array {"electron":"0.36","node":"6.1","ie":"10"} + es6.typed.int32-array {"electron":"0.36","node":"6.1","ie":"10"} + es6.typed.uint32-array {"electron":"0.36","node":"6.1","ie":"10"} + es6.typed.float32-array {"electron":"0.36","node":"6.1","ie":"10"} + es6.typed.float64-array {"electron":"0.36","node":"6.1","ie":"10"} + es6.map {"electron":"0.36","node":"6.1","ie":"10"} + es6.set {"electron":"0.36","node":"6.1","ie":"10"} + es6.weak-map {"electron":"0.36","node":"6.1","ie":"10"} + es6.weak-set {"electron":"0.36","node":"6.1","ie":"10"} + es6.reflect.apply {"electron":"0.36","ie":"10"} + es6.reflect.construct {"electron":"0.36","ie":"10"} + es6.reflect.define-property {"electron":"0.36","ie":"10"} + es6.reflect.delete-property {"electron":"0.36","ie":"10"} + es6.reflect.get {"electron":"0.36","ie":"10"} + es6.reflect.get-own-property-descriptor {"electron":"0.36","ie":"10"} + es6.reflect.get-prototype-of {"electron":"0.36","ie":"10"} + es6.reflect.has {"electron":"0.36","ie":"10"} + es6.reflect.is-extensible {"electron":"0.36","ie":"10"} + es6.reflect.own-keys {"electron":"0.36","ie":"10"} + es6.reflect.prevent-extensions {"electron":"0.36","ie":"10"} + es6.reflect.set {"electron":"0.36","ie":"10"} + es6.reflect.set-prototype-of {"electron":"0.36","ie":"10"} + es6.promise {"electron":"0.36","node":"6.1","ie":"10"} + es6.symbol {"electron":"0.36","node":"6.1","ie":"10"} + es6.object.assign {"ie":"10"} + es6.object.is {"ie":"10"} + es6.object.set-prototype-of {"ie":"10"} + es6.function.name {"electron":"0.36","node":"6.1","ie":"10"} + es6.string.raw {"ie":"10"} + es6.string.from-code-point {"ie":"10"} + es6.string.code-point-at {"ie":"10"} + es6.string.repeat {"ie":"10"} + es6.string.starts-with {"ie":"10"} + es6.string.ends-with {"ie":"10"} + es6.string.includes {"ie":"10"} + es6.regexp.flags {"electron":"0.36","ie":"10"} + es6.regexp.match {"electron":"0.36","ie":"10"} + es6.regexp.replace {"electron":"0.36","ie":"10"} + es6.regexp.split {"electron":"0.36","ie":"10"} + es6.regexp.search {"electron":"0.36","ie":"10"} + es6.array.from {"electron":"0.36","node":"6.1","ie":"10"} + es6.array.of {"ie":"10"} + es6.array.copy-within {"ie":"10"} + es6.array.find {"ie":"10"} + es6.array.find-index {"ie":"10"} + es6.array.fill {"ie":"10"} + es6.array.iterator {"ie":"10"} + es6.number.is-finite {"ie":"10"} + es6.number.is-integer {"ie":"10"} + es6.number.is-safe-integer {"ie":"10"} + es6.number.is-nan {"ie":"10"} + es6.number.epsilon {"ie":"10"} + es6.number.min-safe-integer {"ie":"10"} + es6.number.max-safe-integer {"ie":"10"} + es6.math.acosh {"ie":"10"} + es6.math.asinh {"ie":"10"} + es6.math.atanh {"ie":"10"} + es6.math.cbrt {"ie":"10"} + es6.math.clz32 {"ie":"10"} + es6.math.cosh {"ie":"10"} + es6.math.expm1 {"ie":"10"} + es6.math.fround {"ie":"10"} + es6.math.hypot {"ie":"10"} + es6.math.imul {"ie":"10"} + es6.math.log1p {"ie":"10"} + es6.math.log10 {"ie":"10"} + es6.math.log2 {"ie":"10"} + es6.math.sign {"ie":"10"} + es6.math.sinh {"ie":"10"} + es6.math.tanh {"ie":"10"} + es6.math.trunc {"ie":"10"} + es7.array.includes {"ie":"10"} + es7.object.values {"electron":"0.36","node":"6.1","ie":"10"} + es7.object.entries {"electron":"0.36","node":"6.1","ie":"10"} + es7.object.get-own-property-descriptors {"electron":"0.36","node":"6.1","ie":"10"} + es7.string.pad-start {"chrome":"54","electron":"0.36","node":"6.1","ie":"10"} + es7.string.pad-end {"chrome":"54","electron":"0.36","node":"6.1","ie":"10"} + web.timers {"chrome":"54","electron":"0.36","node":"6.1","ie":"10"} + web.immediate {"chrome":"54","electron":"0.36","node":"6.1","ie":"10"} + web.dom.iterable {"chrome":"54","electron":"0.36","node":"6.1","ie":"10"} src/in.js -> lib/in.js \ No newline at end of file diff --git a/test/debug-fixtures/versions-strings/options.json b/test/debug-fixtures/versions-strings/options.json index 5b040adc..c0e33489 100644 --- a/test/debug-fixtures/versions-strings/options.json +++ b/test/debug-fixtures/versions-strings/options.json @@ -1,7 +1,7 @@ { "presets": [ ["../../lib", { - "useBuiltIns": "usage", + "useBuiltIns": "entry", "debug": true, "targets": { "chrome": "54", diff --git a/test/debug-fixtures/versions-strings/stdout.txt b/test/debug-fixtures/versions-strings/stdout.txt index 29c2d81b..4cf25543 100644 --- a/test/debug-fixtures/versions-strings/stdout.txt +++ b/test/debug-fixtures/versions-strings/stdout.txt @@ -37,4 +37,90 @@ Using plugins: Polyfills ========= +Replaced `babel-polyfill` with the following polyfills: + es6.typed.array-buffer {"ie":"10"} + es6.typed.int8-array {"ie":"10"} + es6.typed.uint8-array {"ie":"10"} + es6.typed.uint8-clamped-array {"ie":"10"} + es6.typed.int16-array {"ie":"10"} + es6.typed.uint16-array {"ie":"10"} + es6.typed.int32-array {"ie":"10"} + es6.typed.uint32-array {"ie":"10"} + es6.typed.float32-array {"ie":"10"} + es6.typed.float64-array {"ie":"10"} + es6.map {"ie":"10"} + es6.set {"ie":"10"} + es6.weak-map {"ie":"10"} + es6.weak-set {"ie":"10"} + es6.reflect.apply {"ie":"10"} + es6.reflect.construct {"ie":"10"} + es6.reflect.define-property {"ie":"10"} + es6.reflect.delete-property {"ie":"10"} + es6.reflect.get {"ie":"10"} + es6.reflect.get-own-property-descriptor {"ie":"10"} + es6.reflect.get-prototype-of {"ie":"10"} + es6.reflect.has {"ie":"10"} + es6.reflect.is-extensible {"ie":"10"} + es6.reflect.own-keys {"ie":"10"} + es6.reflect.prevent-extensions {"ie":"10"} + es6.reflect.set {"ie":"10"} + es6.reflect.set-prototype-of {"ie":"10"} + es6.promise {"ie":"10"} + es6.symbol {"ie":"10"} + es6.object.assign {"ie":"10"} + es6.object.is {"ie":"10"} + es6.object.set-prototype-of {"ie":"10"} + es6.function.name {"ie":"10"} + es6.string.raw {"ie":"10"} + es6.string.from-code-point {"ie":"10"} + es6.string.code-point-at {"ie":"10"} + es6.string.repeat {"ie":"10"} + es6.string.starts-with {"ie":"10"} + es6.string.ends-with {"ie":"10"} + es6.string.includes {"ie":"10"} + es6.regexp.flags {"ie":"10"} + es6.regexp.match {"ie":"10"} + es6.regexp.replace {"ie":"10"} + es6.regexp.split {"ie":"10"} + es6.regexp.search {"ie":"10"} + es6.array.from {"ie":"10"} + es6.array.of {"ie":"10"} + es6.array.copy-within {"ie":"10"} + es6.array.find {"ie":"10"} + es6.array.find-index {"ie":"10"} + es6.array.fill {"ie":"10"} + es6.array.iterator {"ie":"10"} + es6.number.is-finite {"ie":"10"} + es6.number.is-integer {"ie":"10"} + es6.number.is-safe-integer {"ie":"10"} + es6.number.is-nan {"ie":"10"} + es6.number.epsilon {"ie":"10"} + es6.number.min-safe-integer {"ie":"10"} + es6.number.max-safe-integer {"ie":"10"} + es6.math.acosh {"ie":"10"} + es6.math.asinh {"ie":"10"} + es6.math.atanh {"ie":"10"} + es6.math.cbrt {"ie":"10"} + es6.math.clz32 {"ie":"10"} + es6.math.cosh {"ie":"10"} + es6.math.expm1 {"ie":"10"} + es6.math.fround {"ie":"10"} + es6.math.hypot {"ie":"10"} + es6.math.imul {"ie":"10"} + es6.math.log1p {"ie":"10"} + es6.math.log10 {"ie":"10"} + es6.math.log2 {"ie":"10"} + es6.math.sign {"ie":"10"} + es6.math.sinh {"ie":"10"} + es6.math.tanh {"ie":"10"} + es6.math.trunc {"ie":"10"} + es7.array.includes {"ie":"10"} + es7.object.values {"node":"6.10","ie":"10"} + es7.object.entries {"node":"6.10","ie":"10"} + es7.object.get-own-property-descriptors {"node":"6.10","ie":"10"} + es7.string.pad-start {"chrome":"54","node":"6.10","ie":"10"} + es7.string.pad-end {"chrome":"54","node":"6.10","ie":"10"} + web.timers {"chrome":"54","node":"6.10","ie":"10"} + web.immediate {"chrome":"54","node":"6.10","ie":"10"} + web.dom.iterable {"chrome":"54","node":"6.10","ie":"10"} src/in.js -> lib/in.js \ No newline at end of file