index.js 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. 'use strict';
  2. var keys = require('object-keys');
  3. var hasSymbols = typeof Symbol === 'function' && typeof Symbol('foo') === 'symbol';
  4. var toStr = Object.prototype.toString;
  5. var concat = Array.prototype.concat;
  6. var origDefineProperty = Object.defineProperty;
  7. var isFunction = function (fn) {
  8. return typeof fn === 'function' && toStr.call(fn) === '[object Function]';
  9. };
  10. var hasPropertyDescriptors = require('has-property-descriptors')();
  11. var supportsDescriptors = origDefineProperty && hasPropertyDescriptors;
  12. var defineProperty = function (object, name, value, predicate) {
  13. if (name in object) {
  14. if (predicate === true) {
  15. if (object[name] === value) {
  16. return;
  17. }
  18. } else if (!isFunction(predicate) || !predicate()) {
  19. return;
  20. }
  21. }
  22. if (supportsDescriptors) {
  23. origDefineProperty(object, name, {
  24. configurable: true,
  25. enumerable: false,
  26. value: value,
  27. writable: true
  28. });
  29. } else {
  30. object[name] = value; // eslint-disable-line no-param-reassign
  31. }
  32. };
  33. var defineProperties = function (object, map) {
  34. var predicates = arguments.length > 2 ? arguments[2] : {};
  35. var props = keys(map);
  36. if (hasSymbols) {
  37. props = concat.call(props, Object.getOwnPropertySymbols(map));
  38. }
  39. for (var i = 0; i < props.length; i += 1) {
  40. defineProperty(object, props[i], map[props[i]], predicates[props[i]]);
  41. }
  42. };
  43. defineProperties.supportsDescriptors = !!supportsDescriptors;
  44. module.exports = defineProperties;