/** * @author Toru Nagashima * @copyright 2016 Toru Nagashima. All rights reserved. * See LICENSE file in root directory for full license. */ "use strict" //------------------------------------------------------------------------------ // Requirements //------------------------------------------------------------------------------ const path = require("path") const resolve = require("resolve") const getResolvePaths = require("./get-resolve-paths") const getTryExtensions = require("./get-try-extensions") const getValueIfString = require("./get-value-if-string") const ImportTarget = require("./import-target") const stripImportPathParams = require("./strip-import-path-params") //------------------------------------------------------------------------------ // Helpers //------------------------------------------------------------------------------ /** * Checks whether or not a given node is a callee. * * @param {ASTNode} node - A node to check. * @returns {boolean} `true` if the node is a callee. */ function isCallee(node) { return node.parent.type === "CallExpression" && node.parent.callee === node } /** * Gets references of "require". * * @param {escope.Scope} scope - The global scope. * @returns {escope.Reference[]} References of "require". */ function getReferencesOfRequire(scope) { const variable = scope.set.get("require") if (!variable) { // Not found. return [] } return variable.references } //------------------------------------------------------------------------------ // Public Interface //------------------------------------------------------------------------------ /** * Gets a list of `require()` targets. * * Core modules of Node.js (e.g. `fs`, `http`) are excluded. * * @param {RuleContext} context - The rule context. * @param {boolean} includeCore - The flag to include core modules. * @returns {ImportTarget[]} A list of found target's information. */ module.exports = function getRequireTargets(context, includeCore) { const retv = [] const basedir = path.dirname(path.resolve(context.getFilename())) const paths = getResolvePaths(context) const references = getReferencesOfRequire(context.getScope()) const extensions = getTryExtensions(context) const options = {basedir, paths, extensions} for (const reference of references) { const node = reference.identifier // Skips if it's not a call of `require`. if (!isCallee(node)) { continue } // Gets the target module. const targetNode = node.parent.arguments[0] const rawName = getValueIfString(targetNode) const name = rawName && stripImportPathParams(rawName) if (name && (includeCore || !resolve.isCore(name))) { retv.push(new ImportTarget(targetNode, name, options)) } } return retv }