UNPKG

8.77 kBJavaScriptView Raw
1"use strict";
2
3Object.defineProperty(exports, "__esModule", {
4 value: true
5});
6exports.normalizeCoreJSOption = normalizeCoreJSOption;
7exports.default = normalizeOptions;
8exports.validateUseBuiltInsOption = exports.validateModulesOption = exports.validateIgnoreBrowserslistConfig = exports.validateBoolOption = exports.validateConfigPathOption = exports.checkDuplicateIncludeExcludes = exports.normalizePluginName = void 0;
9
10var _data = _interopRequireDefault(require("core-js-compat/data"));
11
12var _invariant = _interopRequireDefault(require("invariant"));
13
14var _semver = require("semver");
15
16var _corejs2BuiltIns = _interopRequireDefault(require("../data/corejs2-built-ins.json"));
17
18var _plugins = _interopRequireDefault(require("../data/plugins.json"));
19
20var _moduleTransformations = _interopRequireDefault(require("./module-transformations"));
21
22var _options = require("./options");
23
24var _getPlatformSpecificDefault = require("./polyfills/corejs2/get-platform-specific-default");
25
26var _targetsParser = require("./targets-parser");
27
28var _utils = require("./utils");
29
30function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
31
32const validateTopLevelOptions = options => {
33 const validOptions = Object.keys(_options.TopLevelOptions);
34
35 for (const option in options) {
36 if (!_options.TopLevelOptions[option]) {
37 throw new Error(`Invalid Option: ${option} is not a valid top-level option.
38 Maybe you meant to use '${(0, _utils.findSuggestion)(validOptions, option)}'?`);
39 }
40 }
41};
42
43const allPluginsList = Object.keys(_plugins.default);
44const modulePlugins = ["proposal-dynamic-import", ...Object.keys(_moduleTransformations.default).map(m => _moduleTransformations.default[m])];
45
46const getValidIncludesAndExcludes = (type, corejs) => new Set([...allPluginsList, ...(type === "exclude" ? modulePlugins : []), ...(corejs ? corejs == 2 ? [...Object.keys(_corejs2BuiltIns.default), ..._getPlatformSpecificDefault.defaultWebIncludes] : Object.keys(_data.default) : [])]);
47
48const pluginToRegExp = plugin => {
49 if (plugin instanceof RegExp) return plugin;
50
51 try {
52 return new RegExp(`^${normalizePluginName(plugin)}$`);
53 } catch (e) {
54 return null;
55 }
56};
57
58const selectPlugins = (regexp, type, corejs) => Array.from(getValidIncludesAndExcludes(type, corejs)).filter(item => regexp instanceof RegExp && regexp.test(item));
59
60const flatten = array => [].concat(...array);
61
62const expandIncludesAndExcludes = (plugins = [], type, corejs) => {
63 if (plugins.length === 0) return [];
64 const selectedPlugins = plugins.map(plugin => selectPlugins(pluginToRegExp(plugin), type, corejs));
65 const invalidRegExpList = plugins.filter((p, i) => selectedPlugins[i].length === 0);
66 (0, _invariant.default)(invalidRegExpList.length === 0, `Invalid Option: The plugins/built-ins '${invalidRegExpList.join(", ")}' passed to the '${type}' option are not
67 valid. Please check data/[plugin-features|built-in-features].js in babel-preset-env`);
68 return flatten(selectedPlugins);
69};
70
71const normalizePluginName = plugin => plugin.replace(/^(@babel\/|babel-)(plugin-)?/, "");
72
73exports.normalizePluginName = normalizePluginName;
74
75const checkDuplicateIncludeExcludes = (include = [], exclude = []) => {
76 const duplicates = include.filter(opt => exclude.indexOf(opt) >= 0);
77 (0, _invariant.default)(duplicates.length === 0, `Invalid Option: The plugins/built-ins '${duplicates.join(", ")}' were found in both the "include" and
78 "exclude" options.`);
79};
80
81exports.checkDuplicateIncludeExcludes = checkDuplicateIncludeExcludes;
82
83const normalizeTargets = targets => {
84 if ((0, _targetsParser.isBrowsersQueryValid)(targets)) {
85 return {
86 browsers: targets
87 };
88 }
89
90 return Object.assign({}, targets);
91};
92
93const validateConfigPathOption = (configPath = process.cwd()) => {
94 (0, _invariant.default)(typeof configPath === "string", `Invalid Option: The configPath option '${configPath}' is invalid, only strings are allowed.`);
95 return configPath;
96};
97
98exports.validateConfigPathOption = validateConfigPathOption;
99
100const validateBoolOption = (name, value, defaultValue) => {
101 if (typeof value === "undefined") {
102 value = defaultValue;
103 }
104
105 if (typeof value !== "boolean") {
106 throw new Error(`Preset env: '${name}' option must be a boolean.`);
107 }
108
109 return value;
110};
111
112exports.validateBoolOption = validateBoolOption;
113
114const validateIgnoreBrowserslistConfig = ignoreBrowserslistConfig => validateBoolOption(_options.TopLevelOptions.ignoreBrowserslistConfig, ignoreBrowserslistConfig, false);
115
116exports.validateIgnoreBrowserslistConfig = validateIgnoreBrowserslistConfig;
117
118const validateModulesOption = (modulesOpt = _options.ModulesOption.auto) => {
119 (0, _invariant.default)(_options.ModulesOption[modulesOpt.toString()] || _options.ModulesOption[modulesOpt.toString()] === _options.ModulesOption.false, `Invalid Option: The 'modules' option must be one of \n` + ` - 'false' to indicate no module processing\n` + ` - a specific module type: 'commonjs', 'amd', 'umd', 'systemjs'` + ` - 'auto' (default) which will automatically select 'false' if the current\n` + ` process is known to support ES module syntax, or "commonjs" otherwise\n`);
120 return modulesOpt;
121};
122
123exports.validateModulesOption = validateModulesOption;
124
125const validateUseBuiltInsOption = (builtInsOpt = false) => {
126 (0, _invariant.default)(_options.UseBuiltInsOption[builtInsOpt.toString()] || _options.UseBuiltInsOption[builtInsOpt.toString()] === _options.UseBuiltInsOption.false, `Invalid Option: The 'useBuiltIns' option must be either
127 'false' (default) to indicate no polyfill,
128 '"entry"' to indicate replacing the entry polyfill, or
129 '"usage"' to import only used polyfills per file`);
130 return builtInsOpt;
131};
132
133exports.validateUseBuiltInsOption = validateUseBuiltInsOption;
134
135function normalizeCoreJSOption(corejs, useBuiltIns) {
136 let proposals = false;
137 let rawVersion;
138
139 if (useBuiltIns && corejs === undefined) {
140 rawVersion = 2;
141 console.warn("\nWARNING: We noticed you're using the `useBuiltIns` option without declaring a " + "core-js version. Currently, we assume version 2.x when no version " + "is passed. Since this default version will likely change in future " + "versions of Babel, we recommend explicitly setting the core-js version " + "you are using via the `corejs` option.\n" + "\nYou should also be sure that the version you pass to the `corejs` " + "option matches the version specified in your `package.json`'s " + "`dependencies` section. If it doesn't, you need to run one of the " + "following commands:\n\n" + " npm install --save core-js@2 npm install --save core-js@3\n" + " yarn add core-js@2 yarn add core-js@3\n");
142 } else if (typeof corejs === "object" && corejs !== null) {
143 rawVersion = corejs.version;
144 proposals = Boolean(corejs.proposals);
145 } else {
146 rawVersion = corejs;
147 }
148
149 const version = rawVersion ? (0, _semver.coerce)(String(rawVersion)) : false;
150
151 if (!useBuiltIns && version) {
152 console.log("\nThe `corejs` option only has an effect when the `useBuiltIns` option is not `false`\n");
153 }
154
155 if (useBuiltIns && (!version || version.major < 2 || version.major > 3)) {
156 throw new RangeError("Invalid Option: The version passed to `corejs` is invalid. Currently, " + "only core-js@2 and core-js@3 are supported.");
157 }
158
159 return {
160 version,
161 proposals
162 };
163}
164
165function normalizeOptions(opts) {
166 validateTopLevelOptions(opts);
167 const useBuiltIns = validateUseBuiltInsOption(opts.useBuiltIns);
168 const corejs = normalizeCoreJSOption(opts.corejs, useBuiltIns);
169 const include = expandIncludesAndExcludes(opts.include, _options.TopLevelOptions.include, !!corejs.version && corejs.version.major);
170 const exclude = expandIncludesAndExcludes(opts.exclude, _options.TopLevelOptions.exclude, !!corejs.version && corejs.version.major);
171 checkDuplicateIncludeExcludes(include, exclude);
172 const shippedProposals = validateBoolOption(_options.TopLevelOptions.shippedProposals, opts.shippedProposals, false) || corejs.proposals;
173 return {
174 configPath: validateConfigPathOption(opts.configPath),
175 corejs,
176 debug: validateBoolOption(_options.TopLevelOptions.debug, opts.debug, false),
177 include,
178 exclude,
179 forceAllTransforms: validateBoolOption(_options.TopLevelOptions.forceAllTransforms, opts.forceAllTransforms, false),
180 ignoreBrowserslistConfig: validateIgnoreBrowserslistConfig(opts.ignoreBrowserslistConfig),
181 loose: validateBoolOption(_options.TopLevelOptions.loose, opts.loose, false),
182 modules: validateModulesOption(opts.modules),
183 shippedProposals,
184 spec: validateBoolOption(_options.TopLevelOptions.spec, opts.spec, false),
185 targets: normalizeTargets(opts.targets),
186 useBuiltIns: useBuiltIns
187 };
188}
\No newline at end of file