UNPKG

1.69 kBJavaScriptView Raw
1var global = require('../internals/global');
2var shared = require('../internals/shared');
3var createNonEnumerableProperty = require('../internals/create-non-enumerable-property');
4var has = require('../internals/has');
5var setGlobal = require('../internals/set-global');
6var nativeFunctionToString = require('../internals/function-to-string');
7var InternalStateModule = require('../internals/internal-state');
8
9var getInternalState = InternalStateModule.get;
10var enforceInternalState = InternalStateModule.enforce;
11var TEMPLATE = String(nativeFunctionToString).split('toString');
12
13shared('inspectSource', function (it) {
14 return nativeFunctionToString.call(it);
15});
16
17(module.exports = function (O, key, value, options) {
18 var unsafe = options ? !!options.unsafe : false;
19 var simple = options ? !!options.enumerable : false;
20 var noTargetGet = options ? !!options.noTargetGet : false;
21 if (typeof value == 'function') {
22 if (typeof key == 'string' && !has(value, 'name')) createNonEnumerableProperty(value, 'name', key);
23 enforceInternalState(value).source = TEMPLATE.join(typeof key == 'string' ? key : '');
24 }
25 if (O === global) {
26 if (simple) O[key] = value;
27 else setGlobal(key, value);
28 return;
29 } else if (!unsafe) {
30 delete O[key];
31 } else if (!noTargetGet && O[key]) {
32 simple = true;
33 }
34 if (simple) O[key] = value;
35 else createNonEnumerableProperty(O, key, value);
36// add fake Function#toString for correct work wrapped methods / constructors with methods like LoDash isNative
37})(Function.prototype, 'toString', function toString() {
38 return typeof this == 'function' && getInternalState(this).source || nativeFunctionToString.call(this);
39});