e-lado
Version:
[](https://circleci.com/gh/sharetribe/sharetribe/tree/master) [](https://gemnasium.com/sharetribe/shar
337 lines (266 loc) • 11.8 kB
JavaScript
;
exports.__esModule = true;
exports.validateModulesOption = exports.validateLooseOption = exports.getTargets = exports.electronVersionToChromeVersion = exports.getCurrentNodeVersion = exports.isPluginRequired = exports.validIncludesAndExcludes = exports.MODULE_TRANSFORMATIONS = undefined;
exports.validatePluginsOption = validatePluginsOption;
exports.checkDuplicateIncludeExcludes = checkDuplicateIncludeExcludes;
exports.default = buildPreset;
var _plugins = require("../data/plugins.json");
var _plugins2 = _interopRequireDefault(_plugins);
var _pluginFeatures = require("../data/plugin-features");
var _pluginFeatures2 = _interopRequireDefault(_pluginFeatures);
var _builtIns = require("../data/built-ins.json");
var _builtIns2 = _interopRequireDefault(_builtIns);
var _browserslist = require("browserslist");
var _browserslist2 = _interopRequireDefault(_browserslist);
var _transformPolyfillRequirePlugin = require("./transform-polyfill-require-plugin");
var _transformPolyfillRequirePlugin2 = _interopRequireDefault(_transformPolyfillRequirePlugin);
var _electronToChromium = require("../data/electron-to-chromium");
var _electronToChromium2 = _interopRequireDefault(_electronToChromium);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
var MODULE_TRANSFORMATIONS = exports.MODULE_TRANSFORMATIONS = {
"amd": "transform-es2015-modules-amd",
"commonjs": "transform-es2015-modules-commonjs",
"systemjs": "transform-es2015-modules-systemjs",
"umd": "transform-es2015-modules-umd"
};
var defaultInclude = ["web.timers", "web.immediate", "web.dom.iterable"];
var validIncludesAndExcludes = exports.validIncludesAndExcludes = [].concat(Object.keys(_pluginFeatures2.default), Object.keys(MODULE_TRANSFORMATIONS).map(function (m) {
return MODULE_TRANSFORMATIONS[m];
}), Object.keys(_builtIns2.default), defaultInclude);
/**
* Determine if a transformation is required
* @param {Object} supportedEnvironments An Object containing environment keys and the lowest
* supported version as a value
* @param {Object} plugin An Object containing environment keys and the lowest
* version the feature was implmented in as a value
* @return {Boolean} Whether or not the transformation is required
*/
var isPluginRequired = exports.isPluginRequired = function isPluginRequired(supportedEnvironments, plugin) {
if (supportedEnvironments.browsers) {
supportedEnvironments = getTargets(supportedEnvironments);
}
var targetEnvironments = Object.keys(supportedEnvironments);
if (targetEnvironments.length === 0) {
return true;
}
var isRequiredForEnvironments = targetEnvironments.filter(function (environment) {
// Feature is not implemented in that environment
if (!plugin[environment]) {
return true;
}
var lowestImplementedVersion = plugin[environment];
var lowestTargetedVersion = supportedEnvironments[environment];
if (typeof lowestTargetedVersion === "string") {
throw new Error("Target version must be a number, \n '" + lowestTargetedVersion + "' was given for '" + environment + "'");
}
return lowestTargetedVersion < lowestImplementedVersion;
});
return isRequiredForEnvironments.length > 0 ? true : false;
};
var isBrowsersQueryValid = function isBrowsersQueryValid(browsers) {
return typeof browsers === "string" || Array.isArray(browsers);
};
var browserNameMap = {
chrome: "chrome",
edge: "edge",
firefox: "firefox",
ie: "ie",
ios_saf: "ios",
safari: "safari"
};
var getLowestVersions = function getLowestVersions(browsers) {
return browsers.reduce(function (all, browser) {
var _browser$split = browser.split(" "),
browserName = _browser$split[0],
browserVersion = _browser$split[1];
var normalizedBrowserName = browserNameMap[browserName];
var parsedBrowserVersion = parseInt(browserVersion);
if (normalizedBrowserName && !isNaN(parsedBrowserVersion)) {
all[normalizedBrowserName] = Math.min(all[normalizedBrowserName] || Infinity, parsedBrowserVersion);
}
return all;
}, {});
};
var mergeBrowsers = function mergeBrowsers(fromQuery, fromTarget) {
return Object.keys(fromTarget).reduce(function (queryObj, targKey) {
if (targKey !== "browsers") {
queryObj[targKey] = fromTarget[targKey];
}
return queryObj;
}, fromQuery);
};
var getCurrentNodeVersion = exports.getCurrentNodeVersion = function getCurrentNodeVersion() {
return parseFloat(process.versions.node);
};
var electronVersionToChromeVersion = exports.electronVersionToChromeVersion = function electronVersionToChromeVersion(semverVer) {
semverVer = String(semverVer);
if (semverVer === "1") {
semverVer = "1.0";
}
var m = semverVer.match(/^(\d+\.\d+)/);
if (!m) {
throw new Error("Electron version must be a semver version");
}
var result = _electronToChromium2.default[m[1]];
if (!result) {
throw new Error("Electron version " + m[1] + " is either too old or too new");
}
return result;
};
var _extends = Object.assign || function (target) {
for (var i = 1; i < arguments.length; i++) {
var source = arguments[i];
for (var key in source) {
if (Object.prototype.hasOwnProperty.call(source, key)) {
target[key] = source[key];
}
}
}
return target;
};
var getTargets = exports.getTargets = function getTargets() {
var targets = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
var targetOps = _extends({}, targets);
if (targetOps.node === true || targetOps.node === "current") {
targetOps.node = getCurrentNodeVersion();
}
// Rewrite Electron versions to their Chrome equivalents
if (targetOps.electron) {
targetOps.chrome = electronVersionToChromeVersion(targetOps.electron);
delete targetOps.electron;
}
var browserOpts = targetOps.browsers;
if (isBrowsersQueryValid(browserOpts)) {
var queryBrowsers = getLowestVersions((0, _browserslist2.default)(browserOpts));
return mergeBrowsers(queryBrowsers, targetOps);
}
return targetOps;
};
// TODO: Allow specifying plugins as either shortened or full name
// babel-plugin-transform-es2015-classes
// transform-es2015-classes
var validateLooseOption = exports.validateLooseOption = function validateLooseOption() {
var looseOpt = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
if (typeof looseOpt !== "boolean") {
throw new Error("Preset env: 'loose' option must be a boolean.");
}
return looseOpt;
};
var validateModulesOption = exports.validateModulesOption = function validateModulesOption() {
var modulesOpt = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : "commonjs";
if (modulesOpt !== false && Object.keys(MODULE_TRANSFORMATIONS).indexOf(modulesOpt) === -1) {
throw new Error("The 'modules' option must be 'false' to indicate no modules\n" + "or a module type which be be one of: 'commonjs' (default), 'amd', 'umd', 'systemjs'");
}
return modulesOpt;
};
function validatePluginsOption() {
var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
var type = arguments[1];
if (!Array.isArray(opts)) {
throw new Error("The '" + type + "' option must be an Array<string> of plugins/built-ins");
}
var unknownOpts = [];
opts.forEach(function (opt) {
if (validIncludesAndExcludes.indexOf(opt) === -1) {
unknownOpts.push(opt);
}
});
if (unknownOpts.length > 0) {
throw new Error("Invalid plugins/built-ins '" + unknownOpts + "' passed to '" + type + "' option.\n Check data/[plugin-features|built-in-features].js in babel-preset-env");
}
return {
all: opts,
plugins: opts.filter(function (opt) {
return !opt.match(/^(es\d+|web)\./);
}),
builtIns: opts.filter(function (opt) {
return opt.match(/^(es\d+|web)\./);
})
};
}
var validateIncludeOption = function validateIncludeOption(opts) {
return validatePluginsOption(opts, "include");
};
var validateExcludeOption = function validateExcludeOption(opts) {
return validatePluginsOption(opts, "exclude");
};
function checkDuplicateIncludeExcludes(include, exclude) {
var duplicates = [];
include.forEach(function (opt) {
if (exclude.indexOf(opt) >= 0) {
duplicates.push(opt);
}
});
if (duplicates.length > 0) {
throw new Error("Duplicate plugins/built-ins: '" + duplicates + "' found\n in both the \"include\" and \"exclude\" options.");
}
}
var hasBeenLogged = false;
var hasBeenWarned = false;
var logPlugin = function logPlugin(plugin, targets, list) {
var envList = list[plugin] || {};
var filteredList = Object.keys(targets).reduce(function (a, b) {
a[b] = envList[b];
return a;
}, {});
var logStr = " " + plugin + " " + JSON.stringify(filteredList);
console.log(logStr);
};
var filterItem = function filterItem(targets, exclusions, list, item) {
var isDefault = defaultInclude.indexOf(item) >= 0;
var notExcluded = exclusions.indexOf(item) === -1;
if (isDefault) return notExcluded;
var isRequired = isPluginRequired(targets, list[item]);
return isRequired && notExcluded;
};
function buildPreset(context) {
var opts = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
var loose = validateLooseOption(opts.loose);
var moduleType = validateModulesOption(opts.modules);
// TODO: remove whitelist in favor of include in next major
if (opts.whitelist && !hasBeenWarned) {
hasBeenWarned = true;
console.warn("The \"whitelist\" option has been deprecated\n in favor of \"include\" to match the newly added \"exclude\" option (instead of \"blacklist\").");
}
var include = validateIncludeOption(opts.whitelist || opts.include);
var exclude = validateExcludeOption(opts.exclude);
checkDuplicateIncludeExcludes(include.all, exclude.all);
var targets = getTargets(opts.targets);
var debug = opts.debug;
var useBuiltIns = opts.useBuiltIns;
var filterPlugins = filterItem.bind(null, targets, exclude.plugins, _plugins2.default);
var transformations = Object.keys(_plugins2.default).filter(filterPlugins).concat(include.plugins);
var polyfills = void 0;
if (useBuiltIns) {
var filterBuiltIns = filterItem.bind(null, targets, exclude.builtIns, _builtIns2.default);
polyfills = Object.keys(_builtIns2.default).concat(defaultInclude).filter(filterBuiltIns).concat(include.builtIns);
}
if (debug && !hasBeenLogged) {
hasBeenLogged = true;
console.log("babel-preset-env: `DEBUG` option");
console.log("\nUsing targets:");
console.log(JSON.stringify(targets, null, 2));
console.log("\nModules transform: " + moduleType);
console.log("\nUsing plugins:");
transformations.forEach(function (transform) {
logPlugin(transform, targets, _plugins2.default);
});
if (useBuiltIns && polyfills.length) {
console.log("\nUsing polyfills:");
polyfills.forEach(function (polyfill) {
logPlugin(polyfill, targets, _builtIns2.default);
});
}
}
var regenerator = transformations.indexOf("transform-regenerator") >= 0;
var modulePlugin = moduleType !== false && MODULE_TRANSFORMATIONS[moduleType];
var plugins = [];
modulePlugin && plugins.push([require("babel-plugin-" + modulePlugin), { loose: loose }]);
plugins.push.apply(plugins, transformations.map(function (pluginName) {
return [require("babel-plugin-" + pluginName), { loose: loose }];
}));
useBuiltIns && plugins.push([_transformPolyfillRequirePlugin2.default, { polyfills: polyfills, regenerator: regenerator }]);
return {
plugins: plugins
};
}