UNPKG

function-double

Version:
73 lines (58 loc) 1.8 kB
'use strict'; 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;