59 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
		
		
			
		
	
	
			59 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
|  | 'use strict'; | ||
|  | 
 | ||
|  | var keys = require('object-keys'); | ||
|  | var hasSymbols = typeof Symbol === 'function' && typeof Symbol('foo') === 'symbol'; | ||
|  | 
 | ||
|  | var toStr = Object.prototype.toString; | ||
|  | var concat = Array.prototype.concat; | ||
|  | var origDefineProperty = Object.defineProperty; | ||
|  | 
 | ||
|  | var isFunction = function (fn) { | ||
|  | 	return typeof fn === 'function' && toStr.call(fn) === '[object Function]'; | ||
|  | }; | ||
|  | 
 | ||
|  | var arePropertyDescriptorsSupported = function () { | ||
|  | 	var obj = {}; | ||
|  | 	try { | ||
|  | 		origDefineProperty(obj, 'x', { enumerable: false, value: obj }); | ||
|  | 		// eslint-disable-next-line no-unused-vars, no-restricted-syntax
 | ||
|  | 		for (var _ in obj) { // jscs:ignore disallowUnusedVariables
 | ||
|  | 			return false; | ||
|  | 		} | ||
|  | 		return obj.x === obj; | ||
|  | 	} catch (e) { /* this is IE 8. */ | ||
|  | 		return false; | ||
|  | 	} | ||
|  | }; | ||
|  | var supportsDescriptors = origDefineProperty && arePropertyDescriptorsSupported(); | ||
|  | 
 | ||
|  | var defineProperty = function (object, name, value, predicate) { | ||
|  | 	if (name in object && (!isFunction(predicate) || !predicate())) { | ||
|  | 		return; | ||
|  | 	} | ||
|  | 	if (supportsDescriptors) { | ||
|  | 		origDefineProperty(object, name, { | ||
|  | 			configurable: true, | ||
|  | 			enumerable: false, | ||
|  | 			value: value, | ||
|  | 			writable: true | ||
|  | 		}); | ||
|  | 	} else { | ||
|  | 		object[name] = value; | ||
|  | 	} | ||
|  | }; | ||
|  | 
 | ||
|  | var defineProperties = function (object, map) { | ||
|  | 	var predicates = arguments.length > 2 ? arguments[2] : {}; | ||
|  | 	var props = keys(map); | ||
|  | 	if (hasSymbols) { | ||
|  | 		props = concat.call(props, Object.getOwnPropertySymbols(map)); | ||
|  | 	} | ||
|  | 	for (var i = 0; i < props.length; i += 1) { | ||
|  | 		defineProperty(object, props[i], map[props[i]], predicates[props[i]]); | ||
|  | 	} | ||
|  | }; | ||
|  | 
 | ||
|  | defineProperties.supportsDescriptors = !!supportsDescriptors; | ||
|  | 
 | ||
|  | module.exports = defineProperties; |