blob: 1860404e43936e999a17ecc019a7cf9cf50527a2 [file] [log] [blame]
Yang Guo4fd355c2019-09-19 08:59:031'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;
Nikolay Vitkovd76576c2024-12-02 14:10:158var defineDataProperty = require('define-data-property');
Yang Guo4fd355c2019-09-19 08:59:039
10var isFunction = function (fn) {
11 return typeof fn === 'function' && toStr.call(fn) === '[object Function]';
12};
13
Nikolay Vitkovd76576c2024-12-02 14:10:1514var supportsDescriptors = require('has-property-descriptors')();
Yang Guo4fd355c2019-09-19 08:59:0315
16var defineProperty = function (object, name, value, predicate) {
Nikolay Vitkovd76576c2024-12-02 14:10:1517 if (name in object) {
18 if (predicate === true) {
19 if (object[name] === value) {
20 return;
21 }
22 } else if (!isFunction(predicate) || !predicate()) {
23 return;
24 }
Yang Guo4fd355c2019-09-19 08:59:0325 }
Nikolay Vitkovd76576c2024-12-02 14:10:1526
Yang Guo4fd355c2019-09-19 08:59:0327 if (supportsDescriptors) {
Nikolay Vitkovd76576c2024-12-02 14:10:1528 defineDataProperty(object, name, value, true);
Yang Guo4fd355c2019-09-19 08:59:0329 } else {
Nikolay Vitkovd76576c2024-12-02 14:10:1530 defineDataProperty(object, name, value);
Yang Guo4fd355c2019-09-19 08:59:0331 }
32};
33
34var defineProperties = function (object, map) {
35 var predicates = arguments.length > 2 ? arguments[2] : {};
36 var props = keys(map);
37 if (hasSymbols) {
38 props = concat.call(props, Object.getOwnPropertySymbols(map));
39 }
40 for (var i = 0; i < props.length; i += 1) {
41 defineProperty(object, props[i], map[props[i]], predicates[props[i]]);
42 }
43};
44
45defineProperties.supportsDescriptors = !!supportsDescriptors;
46
47module.exports = defineProperties;