| 'use strict'; |
| 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_); |
| }; |