function-double
Version:
Stand-in for a function
73 lines (58 loc) • 1.8 kB
JavaScript
Object.defineProperty(exports, "__esModule", {
value: true
});
var _utilArity = require('util-arity');
var _utilArity2 = _interopRequireDefault(_utilArity);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function safeDefine(target, key, descriptor) {
try {
Object.defineProperty(target, key, descriptor);
} catch (e) {
// nop
}
}
function transferProperties(source, target) {
var keys = Object.getOwnPropertyNames(source);
keys.forEach(function (key) {
return safeDefine(target, key, Object.getOwnPropertyDescriptor(source, key));
});
}
function double(targetFn, sourceFn) {
var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
var result = targetFn;
transferProperties(sourceFn, targetFn);
if (targetFn.length !== sourceFn.length) {
result = (0, _utilArity2.default)(sourceFn.length, targetFn);
transferProperties(result, sourceFn);
}
if (options.hasOwnProperty('toString')) {
safeDefine(result, 'toString', {
configurable: true,
writable: false,
enumerable: false,
value: function toString() {
return typeof options.toString === 'function' ? options.toString(sourceFn) : options.toString;
}
});
} else {
safeDefine(result, 'toString', {
configurable: true,
writable: false,
enumerable: false,
value: function toString() {
return String(sourceFn);
}
});
}
if (options.hasOwnProperty('name')) {
safeDefine(result, 'name', {
configurable: true,
writable: false,
enumerable: false,
value: typeof options.name === 'function' ? options.name(sourceFn) : options.name
});
}
return result;
}
exports.default = double;
;