'use strict'; var ES = require('es-abstract/es7'); var defineProperty = Object.defineProperty; var getDescriptor = Object.getOwnPropertyDescriptor; var getOwnNames = Object.getOwnPropertyNames; var getSymbols = Object.getOwnPropertySymbols; var concat = Function.call.bind(Array.prototype.concat); var reduce = Function.call.bind(Array.prototype.reduce); var getAll = getSymbols ? function (obj) { return concat(getOwnNames(obj), getSymbols(obj)); } : getOwnNames; var isES5 = ES.IsCallable(getDescriptor) && ES.IsCallable(getOwnNames); var safePut = function put(obj, prop, val) { // eslint-disable-line max-params if (defineProperty && prop in obj) { defineProperty(obj, prop, { configurable: true, enumerable: true, value: val, writable: true }); } else { obj[prop] = val; } }; module.exports = function getOwnPropertyDescriptors(value) { ES.RequireObjectCoercible(value); if (!isES5) { throw new TypeError('getOwnPropertyDescriptors requires Object.getOwnPropertyDescriptor'); } var O = ES.ToObject(value); return reduce(getAll(O), function (acc, key) { var descriptor = getDescriptor(O, key); if (typeof descriptor !== 'undefined') { safePut(acc, key, descriptor); } return acc; }, {}); };