/*! * function-arguments * * Copyright (c) 2016 Charlike Mike Reagent <@tunnckoCore> (http://www.tunnckocore.tk) * Released under the MIT license. */ 'use strict' /** * > Get function arguments names. * * **Example** * * ```js * var fnArgs = require('function-arguments') * * console.log(fnArgs(function (a, b, c) {})) // => [ 'a', 'b', 'c' ] * console.log(fnArgs(function named (a , b, c) {})) // => [ 'a', 'b', 'c' ] * * console.log(fnArgs(a => {})) // => [ 'a' ] * console.log(fnArgs((a, b) => {})) // => [ 'a', 'b' ] * * console.log(fnArgs(function * (a ,b, c) {})) // => [ 'a', 'b', 'c' ] * console.log(fnArgs(function * named (a ,b, c) {})) // => [ 'a', 'b', 'c' ] * ``` * * @param {Function} `fn` Function from which to get arguments names. * @return {Array} * @api public */ module.exports = function functionArguments (fn) { if (typeof fn !== 'function') { throw new TypeError('function-arguments expect a function') } if (fn.length === 0) { return [] } // from https://github.com/jrburke/requirejs var reComments = /(\/\*([\s\S]*?)\*\/|([^:]|^)\/\/(.*)$)/mg var fnToStr = Function.prototype.toString var fnStr = fnToStr.call(fn) fnStr = fnStr.replace(reComments, '') || fnStr fnStr = fnStr.slice(0, fnStr.indexOf('{')) var open = fnStr.indexOf('(') var close = fnStr.indexOf(')') open = open >= 0 ? open + 1 : 0 close = close > 0 ? close : fnStr.indexOf('=') fnStr = fnStr.slice(open, close) fnStr = '(' + fnStr + ')' var match = fnStr.match(/\(([\s\S]*)\)/) return match ? match[1].split(',').map(function (param) { return param.trim() }) : [] }