Show More
Commit Description:
merge
Commit Description:
merge
References:
File last commit:
Show/Diff file:
Action:
node_modules/object-keys/implementation.js
| 122 lines
| 3.1 KiB
| application/javascript
| JavascriptLexer
|
r789 | 'use strict'; | |||
var keysShim; | ||||
if (!Object.keys) { | ||||
// modified from https://github.com/es-shims/es5-shim | ||||
var has = Object.prototype.hasOwnProperty; | ||||
var toStr = Object.prototype.toString; | ||||
var isArgs = require('./isArguments'); // eslint-disable-line global-require | ||||
var isEnumerable = Object.prototype.propertyIsEnumerable; | ||||
var hasDontEnumBug = !isEnumerable.call({ toString: null }, 'toString'); | ||||
var hasProtoEnumBug = isEnumerable.call(function () {}, 'prototype'); | ||||
var dontEnums = [ | ||||
'toString', | ||||
'toLocaleString', | ||||
'valueOf', | ||||
'hasOwnProperty', | ||||
'isPrototypeOf', | ||||
'propertyIsEnumerable', | ||||
'constructor' | ||||
]; | ||||
var equalsConstructorPrototype = function (o) { | ||||
var ctor = o.constructor; | ||||
return ctor && ctor.prototype === o; | ||||
}; | ||||
var excludedKeys = { | ||||
$applicationCache: true, | ||||
$console: true, | ||||
$external: true, | ||||
$frame: true, | ||||
$frameElement: true, | ||||
$frames: true, | ||||
$innerHeight: true, | ||||
$innerWidth: true, | ||||
$onmozfullscreenchange: true, | ||||
$onmozfullscreenerror: true, | ||||
$outerHeight: true, | ||||
$outerWidth: true, | ||||
$pageXOffset: true, | ||||
$pageYOffset: true, | ||||
$parent: true, | ||||
$scrollLeft: true, | ||||
$scrollTop: true, | ||||
$scrollX: true, | ||||
$scrollY: true, | ||||
$self: true, | ||||
$webkitIndexedDB: true, | ||||
$webkitStorageInfo: true, | ||||
$window: true | ||||
}; | ||||
var hasAutomationEqualityBug = (function () { | ||||
/* global window */ | ||||
if (typeof window === 'undefined') { return false; } | ||||
for (var k in window) { | ||||
try { | ||||
if (!excludedKeys['$' + k] && has.call(window, k) && window[k] !== null && typeof window[k] === 'object') { | ||||
try { | ||||
equalsConstructorPrototype(window[k]); | ||||
} catch (e) { | ||||
return true; | ||||
} | ||||
} | ||||
} catch (e) { | ||||
return true; | ||||
} | ||||
} | ||||
return false; | ||||
}()); | ||||
var equalsConstructorPrototypeIfNotBuggy = function (o) { | ||||
/* global window */ | ||||
if (typeof window === 'undefined' || !hasAutomationEqualityBug) { | ||||
return equalsConstructorPrototype(o); | ||||
} | ||||
try { | ||||
return equalsConstructorPrototype(o); | ||||
} catch (e) { | ||||
return false; | ||||
} | ||||
}; | ||||
keysShim = function keys(object) { | ||||
var isObject = object !== null && typeof object === 'object'; | ||||
var isFunction = toStr.call(object) === '[object Function]'; | ||||
var isArguments = isArgs(object); | ||||
var isString = isObject && toStr.call(object) === '[object String]'; | ||||
var theKeys = []; | ||||
if (!isObject && !isFunction && !isArguments) { | ||||
throw new TypeError('Object.keys called on a non-object'); | ||||
} | ||||
var skipProto = hasProtoEnumBug && isFunction; | ||||
if (isString && object.length > 0 && !has.call(object, 0)) { | ||||
for (var i = 0; i < object.length; ++i) { | ||||
theKeys.push(String(i)); | ||||
} | ||||
} | ||||
if (isArguments && object.length > 0) { | ||||
for (var j = 0; j < object.length; ++j) { | ||||
theKeys.push(String(j)); | ||||
} | ||||
} else { | ||||
for (var name in object) { | ||||
if (!(skipProto && name === 'prototype') && has.call(object, name)) { | ||||
theKeys.push(String(name)); | ||||
} | ||||
} | ||||
} | ||||
if (hasDontEnumBug) { | ||||
var skipConstructor = equalsConstructorPrototypeIfNotBuggy(object); | ||||
for (var k = 0; k < dontEnums.length; ++k) { | ||||
if (!(skipConstructor && dontEnums[k] === 'constructor') && has.call(object, dontEnums[k])) { | ||||
theKeys.push(dontEnums[k]); | ||||
} | ||||
} | ||||
} | ||||
return theKeys; | ||||
}; | ||||
} | ||||
module.exports = keysShim; | ||||