You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
55 lines
2.6 KiB
55 lines
2.6 KiB
2 years ago
|
var global = require('../internals/global');
|
||
|
var getOwnPropertyDescriptor = require('../internals/object-get-own-property-descriptor').f;
|
||
|
var createNonEnumerableProperty = require('../internals/create-non-enumerable-property');
|
||
|
var defineBuiltIn = require('../internals/define-built-in');
|
||
|
var defineGlobalProperty = require('../internals/define-global-property');
|
||
|
var copyConstructorProperties = require('../internals/copy-constructor-properties');
|
||
|
var isForced = require('../internals/is-forced');
|
||
|
|
||
|
/*
|
||
|
options.target - name of the target object
|
||
|
options.global - target is the global object
|
||
|
options.stat - export as static methods of target
|
||
|
options.proto - export as prototype methods of target
|
||
|
options.real - real prototype method for the `pure` version
|
||
|
options.forced - export even if the native feature is available
|
||
|
options.bind - bind methods to the target, required for the `pure` version
|
||
|
options.wrap - wrap constructors to preventing global pollution, required for the `pure` version
|
||
|
options.unsafe - use the simple assignment of property instead of delete + defineProperty
|
||
|
options.sham - add a flag to not completely full polyfills
|
||
|
options.enumerable - export as enumerable property
|
||
|
options.dontCallGetSet - prevent calling a getter on target
|
||
|
options.name - the .name of the function if it does not match the key
|
||
|
*/
|
||
|
module.exports = function (options, source) {
|
||
|
var TARGET = options.target;
|
||
|
var GLOBAL = options.global;
|
||
|
var STATIC = options.stat;
|
||
|
var FORCED, target, key, targetProperty, sourceProperty, descriptor;
|
||
|
if (GLOBAL) {
|
||
|
target = global;
|
||
|
} else if (STATIC) {
|
||
|
target = global[TARGET] || defineGlobalProperty(TARGET, {});
|
||
|
} else {
|
||
|
target = (global[TARGET] || {}).prototype;
|
||
|
}
|
||
|
if (target) for (key in source) {
|
||
|
sourceProperty = source[key];
|
||
|
if (options.dontCallGetSet) {
|
||
|
descriptor = getOwnPropertyDescriptor(target, key);
|
||
|
targetProperty = descriptor && descriptor.value;
|
||
|
} else targetProperty = target[key];
|
||
|
FORCED = isForced(GLOBAL ? key : TARGET + (STATIC ? '.' : '#') + key, options.forced);
|
||
|
// contained in target
|
||
|
if (!FORCED && targetProperty !== undefined) {
|
||
|
if (typeof sourceProperty == typeof targetProperty) continue;
|
||
|
copyConstructorProperties(sourceProperty, targetProperty);
|
||
|
}
|
||
|
// add a flag to not completely full polyfills
|
||
|
if (options.sham || (targetProperty && targetProperty.sham)) {
|
||
|
createNonEnumerableProperty(sourceProperty, 'sham', true);
|
||
|
}
|
||
|
defineBuiltIn(target, key, sourceProperty, options);
|
||
|
}
|
||
|
};
|