You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					93 lines
				
				2.2 KiB
			
		
		
			
		
	
	
					93 lines
				
				2.2 KiB
			| 
								 
											3 years ago
										 
									 | 
							
								'use strict';
							 | 
						||
| 
								 | 
							
								const browserslist = require('browserslist');
							 | 
						||
| 
								 | 
							
								const { compare, has } = require('./helpers');
							 | 
						||
| 
								 | 
							
								const external = require('./external');
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								const aliases = new Map([
							 | 
						||
| 
								 | 
							
								  ['and_chr', 'chrome-android'],
							 | 
						||
| 
								 | 
							
								  ['and_ff', 'firefox-android'],
							 | 
						||
| 
								 | 
							
								  ['ie_mob', 'ie'],
							 | 
						||
| 
								 | 
							
								  ['ios_saf', 'ios'],
							 | 
						||
| 
								 | 
							
								  ['oculus', 'quest'],
							 | 
						||
| 
								 | 
							
								  ['op_mob', 'opera-android'],
							 | 
						||
| 
								 | 
							
								  // TODO: Remove from `core-js@4`
							 | 
						||
| 
								 | 
							
								  ['opera_mobile', 'opera-android'],
							 | 
						||
| 
								 | 
							
								  ['react', 'react-native'],
							 | 
						||
| 
								 | 
							
								  ['reactnative', 'react-native'],
							 | 
						||
| 
								 | 
							
								]);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								const validTargets = new Set([
							 | 
						||
| 
								 | 
							
								  'android',
							 | 
						||
| 
								 | 
							
								  'bun',
							 | 
						||
| 
								 | 
							
								  'chrome',
							 | 
						||
| 
								 | 
							
								  'chrome-android',
							 | 
						||
| 
								 | 
							
								  'deno',
							 | 
						||
| 
								 | 
							
								  'edge',
							 | 
						||
| 
								 | 
							
								  'electron',
							 | 
						||
| 
								 | 
							
								  'firefox',
							 | 
						||
| 
								 | 
							
								  'firefox-android',
							 | 
						||
| 
								 | 
							
								  'hermes',
							 | 
						||
| 
								 | 
							
								  'ie',
							 | 
						||
| 
								 | 
							
								  'ios',
							 | 
						||
| 
								 | 
							
								  'node',
							 | 
						||
| 
								 | 
							
								  'opera',
							 | 
						||
| 
								 | 
							
								  'opera-android',
							 | 
						||
| 
								 | 
							
								  'phantom',
							 | 
						||
| 
								 | 
							
								  'quest',
							 | 
						||
| 
								 | 
							
								  'react-native',
							 | 
						||
| 
								 | 
							
								  'rhino',
							 | 
						||
| 
								 | 
							
								  'safari',
							 | 
						||
| 
								 | 
							
								  'samsung',
							 | 
						||
| 
								 | 
							
								]);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								const toLowerKeys = function (object) {
							 | 
						||
| 
								 | 
							
								  return Object.entries(object).reduce((accumulator, [key, value]) => {
							 | 
						||
| 
								 | 
							
								    accumulator[key.toLowerCase()] = value;
							 | 
						||
| 
								 | 
							
								    return accumulator;
							 | 
						||
| 
								 | 
							
								  }, {});
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								module.exports = function (targets) {
							 | 
						||
| 
								 | 
							
								  const { browsers, esmodules, node, ...rest } = (typeof targets != 'object' || Array.isArray(targets))
							 | 
						||
| 
								 | 
							
								    ? { browsers: targets } : toLowerKeys(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;
							 | 
						||
| 
								 | 
							
								};
							 |