UNPKG

1.61 kBJavaScriptView Raw
1'use strict';
2
3var keys = require('object-keys');
4var hasSymbols = typeof Symbol === 'function' && typeof Symbol('foo') === 'symbol';
5
6var toStr = Object.prototype.toString;
7var concat = Array.prototype.concat;
8var origDefineProperty = Object.defineProperty;
9
10var isFunction = function (fn) {
11 return typeof fn === 'function' && toStr.call(fn) === '[object Function]';
12};
13
14var arePropertyDescriptorsSupported = function () {
15 var obj = {};
16 try {
17 origDefineProperty(obj, 'x', { enumerable: false, value: obj });
18 // eslint-disable-next-line no-unused-vars, no-restricted-syntax
19 for (var _ in obj) { // jscs:ignore disallowUnusedVariables
20 return false;
21 }
22 return obj.x === obj;
23 } catch (e) { /* this is IE 8. */
24 return false;
25 }
26};
27var supportsDescriptors = origDefineProperty && arePropertyDescriptorsSupported();
28
29var defineProperty = function (object, name, value, predicate) {
30 if (name in object && (!isFunction(predicate) || !predicate())) {
31 return;
32 }
33 if (supportsDescriptors) {
34 origDefineProperty(object, name, {
35 configurable: true,
36 enumerable: false,
37 value: value,
38 writable: true
39 });
40 } else {
41 object[name] = value;
42 }
43};
44
45var defineProperties = function (object, map) {
46 var predicates = arguments.length > 2 ? arguments[2] : {};
47 var props = keys(map);
48 if (hasSymbols) {
49 props = concat.call(props, Object.getOwnPropertySymbols(map));
50 }
51 for (var i = 0; i < props.length; i += 1) {
52 defineProperty(object, props[i], map[props[i]], predicates[props[i]]);
53 }
54};
55
56defineProperties.supportsDescriptors = !!supportsDescriptors;
57
58module.exports = defineProperties;