index.js 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235
  1. "use strict";
  2. Object.defineProperty(exports, "__esModule", {
  3. value: true
  4. });
  5. exports.isBrowsersQueryValid = isBrowsersQueryValid;
  6. exports.default = getTargets;
  7. Object.defineProperty(exports, "unreleasedLabels", {
  8. enumerable: true,
  9. get: function () {
  10. return _targets.unreleasedLabels;
  11. }
  12. });
  13. Object.defineProperty(exports, "prettifyTargets", {
  14. enumerable: true,
  15. get: function () {
  16. return _pretty.prettifyTargets;
  17. }
  18. });
  19. Object.defineProperty(exports, "getInclusionReasons", {
  20. enumerable: true,
  21. get: function () {
  22. return _debug.getInclusionReasons;
  23. }
  24. });
  25. Object.defineProperty(exports, "filterItems", {
  26. enumerable: true,
  27. get: function () {
  28. return _filterItems.default;
  29. }
  30. });
  31. Object.defineProperty(exports, "isRequired", {
  32. enumerable: true,
  33. get: function () {
  34. return _filterItems.isRequired;
  35. }
  36. });
  37. var _browserslist = _interopRequireDefault(require("browserslist"));
  38. var _levenary = _interopRequireDefault(require("levenary"));
  39. var _invariant = _interopRequireDefault(require("invariant"));
  40. var _nativeModules = _interopRequireDefault(require("@babel/compat-data/native-modules"));
  41. var _utils = require("./utils");
  42. var _targets = require("./targets");
  43. var _options = require("./options");
  44. var _pretty = require("./pretty");
  45. var _debug = require("./debug");
  46. var _filterItems = _interopRequireWildcard(require("./filter-items"));
  47. function _getRequireWildcardCache() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }
  48. function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
  49. function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
  50. const browserslistDefaults = _browserslist.default.defaults;
  51. const validBrowserslistTargets = [...Object.keys(_browserslist.default.data), ...Object.keys(_browserslist.default.aliases)];
  52. function objectToBrowserslist(object) {
  53. return Object.keys(object).reduce((list, targetName) => {
  54. if (validBrowserslistTargets.indexOf(targetName) >= 0) {
  55. const targetVersion = object[targetName];
  56. return list.concat(`${targetName} ${targetVersion}`);
  57. }
  58. return list;
  59. }, []);
  60. }
  61. function validateTargetNames(targets) {
  62. const validTargets = Object.keys(_options.TargetNames);
  63. for (const target in targets) {
  64. if (!_options.TargetNames[target]) {
  65. throw new Error(`Invalid Option: '${target}' is not a valid target
  66. Maybe you meant to use '${(0, _levenary.default)(target, validTargets)}'?`);
  67. }
  68. }
  69. return targets;
  70. }
  71. function isBrowsersQueryValid(browsers) {
  72. return typeof browsers === "string" || Array.isArray(browsers);
  73. }
  74. function validateBrowsers(browsers) {
  75. (0, _invariant.default)(typeof browsers === "undefined" || isBrowsersQueryValid(browsers), `Invalid Option: '${String(browsers)}' is not a valid browserslist query`);
  76. return browsers;
  77. }
  78. function getLowestVersions(browsers) {
  79. return browsers.reduce((all, browser) => {
  80. const [browserName, browserVersion] = browser.split(" ");
  81. const normalizedBrowserName = _targets.browserNameMap[browserName];
  82. if (!normalizedBrowserName) {
  83. return all;
  84. }
  85. try {
  86. const splitVersion = browserVersion.split("-")[0].toLowerCase();
  87. const isSplitUnreleased = (0, _utils.isUnreleasedVersion)(splitVersion, browserName);
  88. if (!all[normalizedBrowserName]) {
  89. all[normalizedBrowserName] = isSplitUnreleased ? splitVersion : (0, _utils.semverify)(splitVersion);
  90. return all;
  91. }
  92. const version = all[normalizedBrowserName];
  93. const isUnreleased = (0, _utils.isUnreleasedVersion)(version, browserName);
  94. if (isUnreleased && isSplitUnreleased) {
  95. all[normalizedBrowserName] = (0, _utils.getLowestUnreleased)(version, splitVersion, browserName);
  96. } else if (isUnreleased) {
  97. all[normalizedBrowserName] = (0, _utils.semverify)(splitVersion);
  98. } else if (!isUnreleased && !isSplitUnreleased) {
  99. const parsedBrowserVersion = (0, _utils.semverify)(splitVersion);
  100. all[normalizedBrowserName] = (0, _utils.semverMin)(version, parsedBrowserVersion);
  101. }
  102. } catch (e) {}
  103. return all;
  104. }, {});
  105. }
  106. function outputDecimalWarning(decimalTargets) {
  107. if (!(decimalTargets == null ? void 0 : decimalTargets.length)) {
  108. return;
  109. }
  110. console.log("Warning, the following targets are using a decimal version:");
  111. console.log("");
  112. decimalTargets.forEach(({
  113. target,
  114. value
  115. }) => console.log(` ${target}: ${value}`));
  116. console.log("");
  117. console.log("We recommend using a string for minor/patch versions to avoid numbers like 6.10");
  118. console.log("getting parsed as 6.1, which can lead to unexpected behavior.");
  119. console.log("");
  120. }
  121. function semverifyTarget(target, value) {
  122. try {
  123. return (0, _utils.semverify)(value);
  124. } catch (error) {
  125. throw new Error(`Invalid Option: '${value}' is not a valid value for 'targets.${target}'.`);
  126. }
  127. }
  128. const targetParserMap = {
  129. __default(target, value) {
  130. const version = (0, _utils.isUnreleasedVersion)(value, target) ? value.toLowerCase() : semverifyTarget(target, value);
  131. return [target, version];
  132. },
  133. node(target, value) {
  134. const parsed = value === true || value === "current" ? process.versions.node : semverifyTarget(target, value);
  135. return [target, parsed];
  136. }
  137. };
  138. function getTargets(inputTargets = {}, options = {}) {
  139. const targetOpts = {};
  140. let {
  141. browsers
  142. } = inputTargets;
  143. if (inputTargets.esmodules) {
  144. const supportsESModules = _nativeModules.default["es6.module"];
  145. browsers = Object.keys(supportsESModules).map(browser => `${browser} ${supportsESModules[browser]}`).join(", ");
  146. }
  147. const browsersquery = validateBrowsers(browsers);
  148. const input = Object.assign({}, inputTargets);
  149. delete input.esmodules;
  150. delete input.browsers;
  151. let targets = validateTargetNames(input);
  152. const shouldParseBrowsers = !!browsersquery;
  153. const hasTargets = shouldParseBrowsers || Object.keys(targets).length > 0;
  154. const shouldSearchForConfig = !options.ignoreBrowserslistConfig && !hasTargets;
  155. if (shouldParseBrowsers || shouldSearchForConfig) {
  156. if (!hasTargets) {
  157. _browserslist.default.defaults = objectToBrowserslist(targets);
  158. }
  159. const browsers = (0, _browserslist.default)(browsersquery, {
  160. path: options.configPath,
  161. mobileToDesktop: true,
  162. env: options.browserslistEnv
  163. });
  164. const queryBrowsers = getLowestVersions(browsers);
  165. targets = Object.assign(queryBrowsers, targets);
  166. _browserslist.default.defaults = browserslistDefaults;
  167. }
  168. const parsed = Object.keys(targets).sort().reduce((results, target) => {
  169. var _targetParserMap$targ;
  170. const value = targets[target];
  171. if (typeof value === "number" && value % 1 !== 0) {
  172. results.decimalWarnings.push({
  173. target,
  174. value
  175. });
  176. }
  177. const parser = (_targetParserMap$targ = targetParserMap[target]) != null ? _targetParserMap$targ : targetParserMap.__default;
  178. const [parsedTarget, parsedValue] = parser(target, value);
  179. if (parsedValue) {
  180. results.targets[parsedTarget] = parsedValue;
  181. }
  182. return results;
  183. }, {
  184. targets: targetOpts,
  185. decimalWarnings: []
  186. });
  187. outputDecimalWarning(parsed.decimalWarnings);
  188. return parsed.targets;
  189. }