| '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 defineDataProperty = require('define-data-property'); | |
| 
 | |
| var isFunction = function (fn) { | |
| 	return typeof fn === 'function' && toStr.call(fn) === '[object Function]'; | |
| }; | |
| 
 | |
| var supportsDescriptors = require('has-property-descriptors')(); | |
| 
 | |
| var defineProperty = function (object, name, value, predicate) { | |
| 	if (name in object) { | |
| 		if (predicate === true) { | |
| 			if (object[name] === value) { | |
| 				return; | |
| 			} | |
| 		} else if (!isFunction(predicate) || !predicate()) { | |
| 			return; | |
| 		} | |
| 	} | |
| 
 | |
| 	if (supportsDescriptors) { | |
| 		defineDataProperty(object, name, value, true); | |
| 	} else { | |
| 		defineDataProperty(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;
 |