UNPKG

@nestjs/graphql

Version:

Nest - modern, fast, powerful node.js web framework (@graphql)

37 lines (36 loc) 2.05 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.getNumberOfArguments = void 0; /** * Counts the number of arguments for a given function. This algorithm isn't tested for all cases * (check in the spec file), so use it carefully, since it relies on getting the function as a string. * Note this also counts parameters with default initializers (as opposed to checking `function.length`) * @param fn The function to get the number of arguments * @returns the number of arguments in the function's signature */ function getNumberOfArguments(fn) { // Removing newlines is necessary to use easier regex and handle multi-line functions const functionAsStringWithoutNewLines = fn.toString().replace(/\n/g, ''); /* The RegExp below uses a non-greedy match (the question mark), meaning that it tries to find * the smallest possible match. This ensures that we don't accidentally * consider the function's body as part of the regex match, since we aim * to get only the parameters section. */ const anythingEnclosedInParenthesesRegex = /\(.*?\)/; const regexMatchedArray = functionAsStringWithoutNewLines.match(new RegExp(anythingEnclosedInParenthesesRegex)); if (functionHasOneOrMoreArguments(regexMatchedArray)) { const functionParametersAsString = regexMatchedArray[0]; // Removing arrays and objects is also necessary because we count the number of commas in the string, // and both could have commas and confuse the split process below. const parametersWithReplacedArraysAndObjects = functionParametersAsString .replace(/\[.+\]/g, '"array"') .replace(/(\{.+\})/g, '"object"'); const argumentsArray = parametersWithReplacedArraysAndObjects.split(','); return argumentsArray.length; } return 0; } exports.getNumberOfArguments = getNumberOfArguments; function functionHasOneOrMoreArguments(functionRegexMatchArray) { return functionRegexMatchArray && functionRegexMatchArray[0] !== '()'; }