optional-args
Version:
Wraps a function whose last argument is preceded by optional arguments so that when fewer arguments are passed in, missing optional arguments are filled in as `undefined`.
37 lines (35 loc) • 1.5 kB
JavaScript
var optionalArgs = function (optionalArgCount, argCount, fn) {
if (typeof optionalArgCount !== 'number' || optionalArgCount < 1) {
throw new Error('"optionalArgCount" is a required argument and must be a number greater than 0')
}
if (typeof argCount !== 'number') {
throw new Error('"argCount" is a required argument and must be a number')
}
if (typeof fn !== 'function') {
throw new Error('"fn" is a required argument and must be a function')
}
if (argCount < 2) {
throw new Error('function does not accept enough arguments for any to be optional. function must accept at least 2 arguments.')
}
if (optionalArgCount > argCount - 1) {
throw new Error('"fn" accepts ' + argCount + ' arguments. "optionalArgCount" must be less than ' + argCount)
}
var f = function () {
var givenArgs = [].slice.call(arguments)
if (givenArgs.length < argCount) {
var startingArgCount = argCount - optionalArgCount - 1
var missing = argCount - givenArgs.length
var pad = new Array(missing)
var beforeLastArg = Math.min(givenArgs.length, argCount) - 1
var spliceAt = Math.max(startingArgCount, beforeLastArg)
var spliceArgs = [spliceAt, 0].concat(pad)
givenArgs.splice.apply(givenArgs, spliceArgs)
return fn.apply(undefined, givenArgs)
} else {
return fn.apply(undefined, arguments)
}
}
Object.defineProperty(f, 'length', {get: function() { return argCount }})
return f
}
module.exports = optionalArgs