| 'use strict'; |
| const browserslist = require('browserslist'); |
| const { compare, has } = require('./helpers'); |
| const external = require('./external'); |
| |
| const aliases = new Map([ |
| ['and_chr', 'chrome'], |
| ['and_ff', 'firefox'], |
| ['ie_mob', 'ie'], |
| ['ios_saf', 'ios'], |
| ['op_mob', 'opera_mobile'], |
| ]); |
| |
| const validTargets = new Set([ |
| 'android', |
| 'chrome', |
| 'deno', |
| 'edge', |
| 'electron', |
| 'firefox', |
| 'ie', |
| 'ios', |
| 'node', |
| 'opera', |
| 'opera_mobile', |
| 'phantom', |
| 'rhino', |
| 'safari', |
| 'samsung', |
| ]); |
| |
| module.exports = function (targets) { |
| if (typeof targets != 'object' || Array.isArray(targets)) { |
| targets = { browsers: targets }; |
| } |
| |
| const { browsers, esmodules, node, ...rest } = targets; |
| const list = Object.entries(rest); |
| |
| if (browsers) { |
| if (typeof browsers == 'string' || Array.isArray(browsers)) { |
| list.push(...browserslist(browsers).map(it => it.split(' '))); |
| } else { |
| list.push(...Object.entries(browsers)); |
| } |
| } |
| if (esmodules) { |
| list.push(...Object.entries(external.modules)); |
| } |
| if (node) { |
| list.push(['node', node === 'current' ? process.versions.node : node]); |
| } |
| |
| const normalized = list.map(([engine, version]) => { |
| if (has(browserslist.aliases, engine)) { |
| engine = browserslist.aliases[engine]; |
| } |
| if (aliases.has(engine)) { |
| engine = aliases.get(engine); |
| } |
| return [engine, String(version)]; |
| }).filter(([engine]) => { |
| return validTargets.has(engine); |
| }).sort(([a], [b]) => { |
| return a < b ? -1 : a > b ? 1 : 0; |
| }); |
| |
| const reducedByMinVersion = new Map(); |
| for (const [engine, version] of normalized) { |
| if (!reducedByMinVersion.has(engine) || compare(version, '<=', reducedByMinVersion.get(engine))) { |
| reducedByMinVersion.set(engine, version); |
| } |
| } |
| |
| return reducedByMinVersion; |
| }; |