UNPKG

7.3 kBJavaScriptView Raw
1"use strict";
2
3Object.defineProperty(exports, "__esModule", {
4 value: true
5});
6exports.transformIncludesAndExcludes = exports.isPluginRequired = undefined;
7exports.default = buildPreset;
8
9var _semver = require("semver");
10
11var _semver2 = _interopRequireDefault(_semver);
12
13var _builtIns = require("../data/built-ins.json");
14
15var _builtIns2 = _interopRequireDefault(_builtIns);
16
17var _defaultIncludes = require("./default-includes");
18
19var _moduleTransformations = require("./module-transformations");
20
21var _moduleTransformations2 = _interopRequireDefault(_moduleTransformations);
22
23var _normalizeOptions = require("./normalize-options.js");
24
25var _normalizeOptions2 = _interopRequireDefault(_normalizeOptions);
26
27var _plugins = require("../data/plugins.json");
28
29var _plugins2 = _interopRequireDefault(_plugins);
30
31var _transformPolyfillRequirePlugin = require("./transform-polyfill-require-plugin");
32
33var _transformPolyfillRequirePlugin2 = _interopRequireDefault(_transformPolyfillRequirePlugin);
34
35var _targetsParser = require("./targets-parser");
36
37var _targetsParser2 = _interopRequireDefault(_targetsParser);
38
39var _utils = require("./utils");
40
41function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
42
43function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }
44
45/**
46 * Determine if a transformation is required
47 *
48 * NOTE: This assumes `supportedEnvironments` has already been parsed by `getTargets`
49 *
50 * @param {Object} supportedEnvironments An Object containing environment keys and the lowest
51 * supported version as a value
52 * @param {Object} plugin An Object containing environment keys and the lowest
53 * version the feature was implemented in as a value
54 * @return {Boolean} Whether or not the transformation is required
55 */
56var isPluginRequired = exports.isPluginRequired = function isPluginRequired(supportedEnvironments, plugin) {
57 var targetEnvironments = Object.keys(supportedEnvironments);
58
59 if (targetEnvironments.length === 0) {
60 return true;
61 }
62
63 var isRequiredForEnvironments = targetEnvironments.filter(function (environment) {
64 // Feature is not implemented in that environment
65 if (!plugin[environment]) {
66 return true;
67 }
68
69 var lowestImplementedVersion = plugin[environment];
70 var lowestTargetedVersion = supportedEnvironments[environment];
71
72 if (!_semver2.default.valid(lowestTargetedVersion)) {
73 throw new Error(
74 // eslint-disable-next-line max-len
75 "Invalid version passed for target \"" + environment + "\": \"" + lowestTargetedVersion + "\". Versions must be in semver format (major.minor.patch)");
76 }
77
78 return _semver2.default.gt((0, _utils.semverify)(lowestImplementedVersion), lowestTargetedVersion);
79 });
80
81 return isRequiredForEnvironments.length > 0;
82};
83
84var hasBeenLogged = false;
85
86var logPlugin = function logPlugin(plugin, targets, list) {
87 var envList = list[plugin] || {};
88 var filteredList = Object.keys(targets).reduce(function (a, b) {
89 if (!envList[b] || _semver2.default.lt(targets[b], (0, _utils.semverify)(envList[b]))) {
90 a[b] = (0, _utils.prettifyVersion)(targets[b]);
91 }
92 return a;
93 }, {});
94 var logStr = " " + plugin + " " + JSON.stringify(filteredList);
95 console.log(logStr);
96};
97
98var filterItem = function filterItem(targets, exclusions, list, item) {
99 var isDefault = _defaultIncludes.defaultWebIncludes.indexOf(item) >= 0;
100 var notExcluded = exclusions.indexOf(item) === -1;
101
102 if (isDefault) return notExcluded;
103 var isRequired = isPluginRequired(targets, list[item]);
104 return isRequired && notExcluded;
105};
106
107var getBuiltInTargets = function getBuiltInTargets(targets) {
108 var builtInTargets = (0, _utils._extends)({}, targets);
109 if (builtInTargets.uglify != null) {
110 delete builtInTargets.uglify;
111 }
112 return builtInTargets;
113};
114
115var transformIncludesAndExcludes = exports.transformIncludesAndExcludes = function transformIncludesAndExcludes(opts) {
116 return {
117 all: opts,
118 plugins: opts.filter(function (opt) {
119 return !opt.match(/^(es\d+|web)\./);
120 }),
121 builtIns: opts.filter(function (opt) {
122 return opt.match(/^(es\d+|web)\./);
123 })
124 };
125};
126
127function getPlatformSpecificDefaultFor(targets) {
128 var targetNames = Object.keys(targets);
129 var isAnyTarget = !targetNames.length;
130 var isWebTarget = targetNames.some(function (name) {
131 return name !== "node";
132 });
133
134 return isAnyTarget || isWebTarget ? _defaultIncludes.defaultWebIncludes : [];
135}
136
137function buildPreset(context) {
138 var opts = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
139
140 var validatedOptions = (0, _normalizeOptions2.default)(opts);
141 var debug = validatedOptions.debug,
142 loose = validatedOptions.loose,
143 moduleType = validatedOptions.moduleType,
144 spec = validatedOptions.spec,
145 useBuiltIns = validatedOptions.useBuiltIns;
146
147
148 var targets = (0, _targetsParser2.default)(validatedOptions.targets);
149 var include = transformIncludesAndExcludes(validatedOptions.include);
150 var exclude = transformIncludesAndExcludes(validatedOptions.exclude);
151
152 var filterPlugins = filterItem.bind(null, targets, exclude.plugins, _plugins2.default);
153 var transformations = Object.keys(_plugins2.default).filter(filterPlugins).concat(include.plugins);
154
155 var polyfills = void 0;
156 var polyfillTargets = void 0;
157 if (useBuiltIns) {
158 polyfillTargets = getBuiltInTargets(targets);
159 var filterBuiltIns = filterItem.bind(null, polyfillTargets, exclude.builtIns, _builtIns2.default);
160 polyfills = Object.keys(_builtIns2.default).concat(getPlatformSpecificDefaultFor(polyfillTargets)).filter(filterBuiltIns).concat(include.builtIns);
161 }
162
163 if (debug && !hasBeenLogged) {
164 hasBeenLogged = true;
165 console.log("babel-preset-env: `DEBUG` option");
166 console.log("\nUsing targets:");
167 console.log(JSON.stringify((0, _utils.prettifyTargets)(targets), null, 2));
168 console.log("\nModules transform: " + moduleType);
169 console.log("\nUsing plugins:");
170 transformations.forEach(function (transform) {
171 logPlugin(transform, targets, _plugins2.default);
172 });
173 if (useBuiltIns && polyfills.length) {
174 console.log("\nUsing polyfills:");
175 polyfills.forEach(function (polyfill) {
176 logPlugin(polyfill, polyfillTargets, _builtIns2.default);
177 });
178 }
179 }
180
181 var regenerator = transformations.indexOf("transform-regenerator") >= 0;
182 var modulePlugin = moduleType !== false && _moduleTransformations2.default[moduleType];
183 var plugins = [];
184
185 // NOTE: not giving spec here yet to avoid compatibility issues when
186 // babel-plugin-transform-es2015-modules-commonjs gets its spec mode
187 modulePlugin && plugins.push([require("babel-plugin-" + modulePlugin), { loose: loose }]);
188
189 plugins.push.apply(plugins, _toConsumableArray(transformations.map(function (pluginName) {
190 return [require("babel-plugin-" + pluginName), { spec: spec, loose: loose }];
191 })));
192
193 useBuiltIns && plugins.push([_transformPolyfillRequirePlugin2.default, { polyfills: polyfills, regenerator: regenerator }]);
194
195 return {
196 plugins: plugins
197 };
198}
\No newline at end of file