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.
		
		
		
		
		
			
		
			
				
					
					
						
							39 lines
						
					
					
						
							709 B
						
					
					
				
			
		
		
	
	
							39 lines
						
					
					
						
							709 B
						
					
					
				'use strict'; | 
						|
const mimicFn = require('mimic-fn'); | 
						|
 | 
						|
module.exports = (fn, opts) => { | 
						|
	// TODO: Remove this in v3 | 
						|
	if (opts === true) { | 
						|
		throw new TypeError('The second argument is now an options object'); | 
						|
	} | 
						|
 | 
						|
	if (typeof fn !== 'function') { | 
						|
		throw new TypeError('Expected a function'); | 
						|
	} | 
						|
 | 
						|
	opts = opts || {}; | 
						|
 | 
						|
	let ret; | 
						|
	let called = false; | 
						|
	const fnName = fn.displayName || fn.name || '<anonymous>'; | 
						|
 | 
						|
	const onetime = function () { | 
						|
		if (called) { | 
						|
			if (opts.throw === true) { | 
						|
				throw new Error(`Function \`${fnName}\` can only be called once`); | 
						|
			} | 
						|
 | 
						|
			return ret; | 
						|
		} | 
						|
 | 
						|
		called = true; | 
						|
		ret = fn.apply(this, arguments); | 
						|
		fn = null; | 
						|
 | 
						|
		return ret; | 
						|
	}; | 
						|
 | 
						|
	mimicFn(onetime, fn); | 
						|
 | 
						|
	return onetime; | 
						|
};
 | 
						|
 |