45 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
		
		
			
		
	
	
			45 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
|  | 'use strict'; | ||
|  | 
 | ||
|  | var ES = require('es-abstract/es7'); | ||
|  | 
 | ||
|  | var defineProperty = Object.defineProperty; | ||
|  | var getDescriptor = Object.getOwnPropertyDescriptor; | ||
|  | var getOwnNames = Object.getOwnPropertyNames; | ||
|  | var getSymbols = Object.getOwnPropertySymbols; | ||
|  | var concat = Function.call.bind(Array.prototype.concat); | ||
|  | var reduce = Function.call.bind(Array.prototype.reduce); | ||
|  | var getAll = getSymbols ? function (obj) { | ||
|  | 	return concat(getOwnNames(obj), getSymbols(obj)); | ||
|  | } : getOwnNames; | ||
|  | 
 | ||
|  | var isES5 = ES.IsCallable(getDescriptor) && ES.IsCallable(getOwnNames); | ||
|  | 
 | ||
|  | var safePut = function put(obj, prop, val) { // eslint-disable-line max-params
 | ||
|  | 	if (defineProperty && prop in obj) { | ||
|  | 		defineProperty(obj, prop, { | ||
|  | 			configurable: true, | ||
|  | 			enumerable: true, | ||
|  | 			value: val, | ||
|  | 			writable: true | ||
|  | 		}); | ||
|  | 	} else { | ||
|  | 		obj[prop] = val; | ||
|  | 	} | ||
|  | }; | ||
|  | 
 | ||
|  | module.exports = function getOwnPropertyDescriptors(value) { | ||
|  | 	ES.RequireObjectCoercible(value); | ||
|  | 	if (!isES5) { | ||
|  | 		throw new TypeError('getOwnPropertyDescriptors requires Object.getOwnPropertyDescriptor'); | ||
|  | 	} | ||
|  | 
 | ||
|  | 	var O = ES.ToObject(value); | ||
|  | 	return reduce(getAll(O), function (acc, key) { | ||
|  | 		var descriptor = getDescriptor(O, key); | ||
|  | 		if (typeof descriptor !== 'undefined') { | ||
|  | 			safePut(acc, key, descriptor); | ||
|  | 		} | ||
|  | 		return acc; | ||
|  | 	}, {}); | ||
|  | }; |