; | |
const mimicFn = require('mimic-fn'); | |
const calledFunctions = new WeakMap(); | |
const onetime = (function_, options = {}) => { | |
if (typeof function_ !== 'function') { | |
throw new TypeError('Expected a function'); | |
} | |
let returnValue; | |
let callCount = 0; | |
const functionName = function_.displayName || function_.name || '<anonymous>'; | |
const onetime = function (...arguments_) { | |
calledFunctions.set(onetime, ++callCount); | |
if (callCount === 1) { | |
returnValue = function_.apply(this, arguments_); | |
function_ = null; | |
} else if (options.throw === true) { | |
throw new Error(`Function \`${functionName}\` can only be called once`); | |
} | |
return returnValue; | |
}; | |
mimicFn(onetime, function_); | |
calledFunctions.set(onetime, callCount); | |
return onetime; | |
}; | |
module.exports = onetime; | |
// TODO: Remove this for the next major release | |
module.exports.default = onetime; | |
module.exports.callCount = function_ => { | |
if (!calledFunctions.has(function_)) { | |
throw new Error(`The given function \`${function_.name}\` is not wrapped by the \`onetime\` package`); | |
} | |
return calledFunctions.get(function_); | |
}; | |