targets-parser.js 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  1. "use strict";
  2. exports.__esModule = true;
  3. var _browserslist = require("browserslist");
  4. var _browserslist2 = _interopRequireDefault(_browserslist);
  5. var _semver = require("semver");
  6. var _semver2 = _interopRequireDefault(_semver);
  7. var _utils = require("./utils");
  8. function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
  9. var browserNameMap = {
  10. android: "android",
  11. chrome: "chrome",
  12. edge: "edge",
  13. firefox: "firefox",
  14. ie: "ie",
  15. ios_saf: "ios",
  16. safari: "safari"
  17. };
  18. var isBrowsersQueryValid = function isBrowsersQueryValid(browsers) {
  19. return typeof browsers === "string" || Array.isArray(browsers);
  20. };
  21. var semverMin = function semverMin(first, second) {
  22. return first && _semver2.default.lt(first, second) ? first : second;
  23. };
  24. var getLowestVersions = function getLowestVersions(browsers) {
  25. return browsers.reduce(function (all, browser) {
  26. var _browser$split = browser.split(" "),
  27. browserName = _browser$split[0],
  28. browserVersion = _browser$split[1];
  29. var normalizedBrowserName = browserNameMap[browserName];
  30. if (!normalizedBrowserName) {
  31. return all;
  32. }
  33. try {
  34. // Browser version can return as "10.0-10.2"
  35. var splitVersion = browserVersion.split("-")[0];
  36. var parsedBrowserVersion = (0, _utils.semverify)(splitVersion);
  37. all[normalizedBrowserName] = semverMin(all[normalizedBrowserName], parsedBrowserVersion);
  38. } catch (e) {}
  39. return all;
  40. }, {});
  41. };
  42. var outputDecimalWarning = function outputDecimalWarning(decimalTargets) {
  43. if (!decimalTargets || !decimalTargets.length) {
  44. return;
  45. }
  46. console.log("Warning, the following targets are using a decimal version:");
  47. console.log("");
  48. decimalTargets.forEach(function (_ref) {
  49. var target = _ref.target,
  50. value = _ref.value;
  51. return console.log(" " + target + ": " + value);
  52. });
  53. console.log("");
  54. console.log("We recommend using a string for minor/patch versions to avoid numbers like 6.10");
  55. console.log("getting parsed as 6.1, which can lead to unexpected behavior.");
  56. console.log("");
  57. };
  58. var targetParserMap = {
  59. __default: function __default(target, value) {
  60. return [target, (0, _utils.semverify)(value)];
  61. },
  62. // Parse `node: true` and `node: "current"` to version
  63. node: function node(target, value) {
  64. var parsed = value === true || value === "current" ? process.versions.node : (0, _utils.semverify)(value);
  65. return [target, parsed];
  66. },
  67. // Only valid value for Uglify is `true`
  68. uglify: function uglify(target, value) {
  69. return [target, value === true];
  70. }
  71. };
  72. var getTargets = function getTargets() {
  73. var targets = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
  74. var targetOpts = {};
  75. // Parse browsers target via browserslist
  76. if (isBrowsersQueryValid(targets.browsers)) {
  77. targetOpts = getLowestVersions((0, _browserslist2.default)(targets.browsers));
  78. }
  79. // Parse remaining targets
  80. var parsed = Object.keys(targets).reduce(function (results, target) {
  81. if (target !== "browsers") {
  82. var value = targets[target];
  83. // Warn when specifying minor/patch as a decimal
  84. if (typeof value === "number" && value % 1 !== 0) {
  85. results.decimalWarnings.push({ target: target, value: value });
  86. }
  87. // Check if we have a target parser?
  88. var parser = targetParserMap[target] || targetParserMap.__default;
  89. var _parser = parser(target, value),
  90. parsedTarget = _parser[0],
  91. parsedValue = _parser[1];
  92. if (parsedValue) {
  93. // Merge (lowest wins)
  94. if (typeof parsedValue === "string") {
  95. results.targets[parsedTarget] = semverMin(results.targets[parsedTarget], parsedValue);
  96. } else {
  97. // We can remove this block if/when we replace Uglify target
  98. // with top level option
  99. results.targets[parsedTarget] = parsedValue;
  100. }
  101. }
  102. }
  103. return results;
  104. }, {
  105. targets: targetOpts,
  106. decimalWarnings: []
  107. });
  108. outputDecimalWarning(parsed.decimalWarnings);
  109. return parsed.targets;
  110. };
  111. exports.default = getTargets;