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.
		
		
		
		
		
			
		
			
				
					
					
						
							55 lines
						
					
					
						
							1.3 KiB
						
					
					
				
			
		
		
	
	
							55 lines
						
					
					
						
							1.3 KiB
						
					
					
				'use strict'; | 
						|
 | 
						|
var implementation = require('./implementation'); | 
						|
 | 
						|
var lacksProperEnumerationOrder = function () { | 
						|
	if (!Object.assign) { | 
						|
		return false; | 
						|
	} | 
						|
	/* | 
						|
	 * v8, specifically in node 4.x, has a bug with incorrect property enumeration order | 
						|
	 * note: this does not detect the bug unless there's 20 characters | 
						|
	 */ | 
						|
	var str = 'abcdefghijklmnopqrst'; | 
						|
	var letters = str.split(''); | 
						|
	var map = {}; | 
						|
	for (var i = 0; i < letters.length; ++i) { | 
						|
		map[letters[i]] = letters[i]; | 
						|
	} | 
						|
	var obj = Object.assign({}, map); | 
						|
	var actual = ''; | 
						|
	for (var k in obj) { | 
						|
		actual += k; | 
						|
	} | 
						|
	return str !== actual; | 
						|
}; | 
						|
 | 
						|
var assignHasPendingExceptions = function () { | 
						|
	if (!Object.assign || !Object.preventExtensions) { | 
						|
		return false; | 
						|
	} | 
						|
	/* | 
						|
	 * Firefox 37 still has "pending exception" logic in its Object.assign implementation, | 
						|
	 * which is 72% slower than our shim, and Firefox 40's native implementation. | 
						|
	 */ | 
						|
	var thrower = Object.preventExtensions({ 1: 2 }); | 
						|
	try { | 
						|
		Object.assign(thrower, 'xy'); | 
						|
	} catch (e) { | 
						|
		return thrower[1] === 'y'; | 
						|
	} | 
						|
	return false; | 
						|
}; | 
						|
 | 
						|
module.exports = function getPolyfill() { | 
						|
	if (!Object.assign) { | 
						|
		return implementation; | 
						|
	} | 
						|
	if (lacksProperEnumerationOrder()) { | 
						|
		return implementation; | 
						|
	} | 
						|
	if (assignHasPendingExceptions()) { | 
						|
		return implementation; | 
						|
	} | 
						|
	return Object.assign; | 
						|
};
 | 
						|
 |