12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152 |
- 'use strict';
- /* !
- * Chai - getFuncName utility
- * Copyright(c) 2012-2016 Jake Luer <jake@alogicalparadox.com>
- * MIT Licensed
- */
- /**
- * ### .getFuncName(constructorFn)
- *
- * Returns the name of a function.
- * When a non-function instance is passed, returns `null`.
- * This also includes a polyfill function if `aFunc.name` is not defined.
- *
- * @name getFuncName
- * @param {Function} funct
- * @namespace Utils
- * @api public
- */
- var toString = Function.prototype.toString;
- var functionNameMatch = /\s*function(?:\s|\s*\/\*[^(?:*\/)]+\*\/\s*)*([^\s\(\/]+)/;
- var maxFunctionSourceLength = 512;
- function getFuncName(aFunc) {
- if (typeof aFunc !== 'function') {
- return null;
- }
- var name = '';
- if (typeof Function.prototype.name === 'undefined' && typeof aFunc.name === 'undefined') {
- // eslint-disable-next-line prefer-reflect
- var functionSource = toString.call(aFunc);
- // To avoid unconstrained resource consumption due to pathalogically large function names,
- // we limit the available return value to be less than 512 characters.
- if (functionSource.indexOf('(') > maxFunctionSourceLength) {
- return name;
- }
- // Here we run a polyfill if Function does not support the `name` property and if aFunc.name is not defined
- var match = functionSource.match(functionNameMatch);
- if (match) {
- name = match[1];
- }
- } else {
- // If we've got a `name` property we just use it
- name = aFunc.name;
- }
- return name;
- }
- module.exports = getFuncName;
|