1 | 'use strict';
|
2 |
|
3 | var ES = require('es-abstract/es7');
|
4 |
|
5 | var defineProperty = Object.defineProperty;
|
6 | var getDescriptor = Object.getOwnPropertyDescriptor;
|
7 | var getOwnNames = Object.getOwnPropertyNames;
|
8 | var getSymbols = Object.getOwnPropertySymbols;
|
9 | var concat = Function.call.bind(Array.prototype.concat);
|
10 | var reduce = Function.call.bind(Array.prototype.reduce);
|
11 | var getAll = getSymbols ? function (obj) {
|
12 | return concat(getOwnNames(obj), getSymbols(obj));
|
13 | } : getOwnNames;
|
14 |
|
15 | var isES5 = ES.IsCallable(getDescriptor) && ES.IsCallable(getOwnNames);
|
16 |
|
17 | var safePut = function put(obj, prop, val) {
|
18 | if (defineProperty && prop in obj) {
|
19 | defineProperty(obj, prop, {
|
20 | configurable: true,
|
21 | enumerable: true,
|
22 | value: val,
|
23 | writable: true
|
24 | });
|
25 | } else {
|
26 | obj[prop] = val;
|
27 | }
|
28 | };
|
29 |
|
30 | module.exports = function getOwnPropertyDescriptors(value) {
|
31 | ES.RequireObjectCoercible(value);
|
32 | if (!isES5) {
|
33 | throw new TypeError('getOwnPropertyDescriptors requires Object.getOwnPropertyDescriptor');
|
34 | }
|
35 |
|
36 | var O = ES.ToObject(value);
|
37 | return reduce(getAll(O), function (acc, key) {
|
38 | var descriptor = getDescriptor(O, key);
|
39 | if (typeof descriptor !== 'undefined') {
|
40 | safePut(acc, key, descriptor);
|
41 | }
|
42 | return acc;
|
43 | }, {});
|
44 | };
|