| '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; |