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.
		
		
		
		
			
				
					77 lines
				
				1.8 KiB
			
		
		
			
		
	
	
					77 lines
				
				1.8 KiB
			| 
								 
											4 years ago
										 
									 | 
							
								'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;
							 | 
						||
| 
								 | 
							
								};
							 |