A source-faithful extracted bundle of object-keys and its local helpers. Useful when you want the classic Object.keys shim behavior locally without adding another dependency.
This page ships an extracted object-keys bundle with its local helpers inlined. The value is to keep the old shim behavior local and inspectable without another npm dependency.
Native alternative: Object.keys exists in modern runtimes, but some legacy or compatibility-heavy codebases still rely on the shim contract and its edge-case handling.
Note: This snippet is extracted rather than copied as-is because the published package entry depends on local helper files.
This copy is your responsibility once you adopt it. It does not automatically receive upstream bug fixes or security updates.
/** * Derived from [email protected] * Rule-based normalized variant generated by this repository. * Preserve the upstream license and attribution notices when copying this file. */ /** * Derived from [email protected] * Rule-based normalized variant generated by this repository. * See THIRD_PARTY_NOTICES.md for upstream license and attribution details. */ "use strict"; var slice = Array.prototype.slice; var toStr = Object.prototype.toString; var isArgs = function isArguments(value) { var str = toStr.call(value); var isArgsValue = str === "[object Arguments]"; if (!isArgsValue) { isArgsValue = str !== "[object Array]" && value !== null && typeof value === "object" && typeof value.length === "number" && value.length >= 0 && toStr.call(value.callee) === "[object Function]"; } return isArgsValue; }; var keysShim; if (!Object.keys) { var has = Object.prototype.hasOwnProperty; 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 () { 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) { 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 m = 0; m < dontEnums.length; ++m) { if ( !(skipConstructor && dontEnums[m] === "constructor") && has.call(object, dontEnums[m]) ) { theKeys.push(dontEnums[m]); } } } return theKeys; }; } var origKeys = Object.keys; keysShim = origKeys ? function keys(o) { return origKeys(o); } : keysShim; var originalKeys = Object.keys; keysShim.shim = function shimObjectKeys() { if (Object.keys) { var keysWorksWithArguments = (function () { var args = Object.keys(arguments); return args && args.length === arguments.length; })(1, 2); if (!keysWorksWithArguments) { Object.keys = function keys(object) { if (isArgs(object)) { return originalKeys(slice.call(object)); } return originalKeys(object); }; } } else { Object.keys = keysShim; } return Object.keys || keysShim; }; export default keysShim;
'use strict';
var slice = Array.prototype.slice;
var toStr = Object.prototype.toString;
var isArgs = function isArguments(value) {
var str = toStr.call(value);
var isArgsValue = str === '[object Arguments]';
if (!isArgsValue) {
isArgsValue = str !== '[object Array]' &&
value !== null &&
typeof value === 'object' &&
typeof value.length === 'number' &&
value.length >= 0 &&
toStr.call(value.callee) === '[object Function]';
}
return isArgsValue;
};
var keysShim;
if (!Object.keys) {
var has = Object.prototype.hasOwnProperty;
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 () {
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) {
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 m = 0; m < dontEnums.length; ++m) {
if (!(skipConstructor && dontEnums[m] === 'constructor') && has.call(object, dontEnums[m])) {
theKeys.push(dontEnums[m]);
}
}
}
return theKeys;
};
}
var origKeys = Object.keys;
keysShim = origKeys ? function keys(o) { return origKeys(o); } : keysShim;
var originalKeys = Object.keys;
keysShim.shim = function shimObjectKeys() {
if (Object.keys) {
var keysWorksWithArguments = (function () {
var args = Object.keys(arguments);
return args && args.length === arguments.length;
}(1, 2));
if (!keysWorksWithArguments) {
Object.keys = function keys(object) {
if (isArgs(object)) {
return originalKeys(slice.call(object));
}
return originalKeys(object);
};
}
} else {
Object.keys = keysShim;
}
return Object.keys || keysShim;
};
module.exports = keysShim;