• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1'use strict';
2
3var ES = require('es-abstract/es7');
4
5var defineProperty = Object.defineProperty;
6var getDescriptor = Object.getOwnPropertyDescriptor;
7var getOwnNames = Object.getOwnPropertyNames;
8var getSymbols = Object.getOwnPropertySymbols;
9var concat = Function.call.bind(Array.prototype.concat);
10var reduce = Function.call.bind(Array.prototype.reduce);
11var getAll = getSymbols ? function (obj) {
12	return concat(getOwnNames(obj), getSymbols(obj));
13} : getOwnNames;
14
15var isES5 = ES.IsCallable(getDescriptor) && ES.IsCallable(getOwnNames);
16
17var safePut = function put(obj, prop, val) { // eslint-disable-line max-params
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
30module.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};
45