mirror of https://github.com/lukechilds/node.git
Browse Source
test/common.js contains code that detects global variable leaks. This eslint rule checks that a module named `common` is loaded. It is only applicable to files in the test directory. Tests that intentionally leak variables can opt out with an eslint-disable comment. PR-URL: https://github.com/nodejs/node/pull/3157 Reviewed-By: Rod Vagg <rod@vagg.org> Reviewed-By: Colin Ihrig <cjihrig@gmail.com>v5.x
Rich Trott
9 years ago
6 changed files with 110 additions and 2 deletions
@ -0,0 +1,104 @@ |
|||
/** |
|||
* @fileoverview Require usage of specified node modules. |
|||
* @author Rich Trott |
|||
*/ |
|||
'use strict'; |
|||
|
|||
var path = require('path'); |
|||
|
|||
//------------------------------------------------------------------------------
|
|||
// Rule Definition
|
|||
//------------------------------------------------------------------------------
|
|||
|
|||
module.exports = function(context) { |
|||
// trim required module names
|
|||
var requiredModules = context.options; |
|||
|
|||
var foundModules = []; |
|||
|
|||
// if no modules are required we don't need to check the CallExpressions
|
|||
if (requiredModules.length === 0) { |
|||
return {}; |
|||
} |
|||
|
|||
/** |
|||
* Function to check if a node is a string literal. |
|||
* @param {ASTNode} node The node to check. |
|||
* @returns {boolean} If the node is a string literal. |
|||
*/ |
|||
function isString(node) { |
|||
return node && node.type === 'Literal' && typeof node.value === 'string'; |
|||
} |
|||
|
|||
/** |
|||
* Function to check if a node is a require call. |
|||
* @param {ASTNode} node The node to check. |
|||
* @returns {boolean} If the node is a require call. |
|||
*/ |
|||
function isRequireCall(node) { |
|||
return node.callee.type === 'Identifier' && node.callee.name === 'require'; |
|||
} |
|||
|
|||
/** |
|||
* Function to check if a node has an argument that is a required module and |
|||
* return its name. |
|||
* @param {ASTNode} node The node to check |
|||
* @returns {undefined|String} required module name or undefined |
|||
*/ |
|||
function getRequiredModuleName(node) { |
|||
var moduleName; |
|||
|
|||
// node has arguments and first argument is string
|
|||
if (node.arguments.length && isString(node.arguments[0])) { |
|||
var argValue = path.basename(node.arguments[0].value.trim()); |
|||
|
|||
// check if value is in required modules array
|
|||
if (requiredModules.indexOf(argValue) !== -1) { |
|||
moduleName = argValue; |
|||
} |
|||
} |
|||
|
|||
return moduleName; |
|||
} |
|||
|
|||
return { |
|||
'CallExpression': function(node) { |
|||
if (isRequireCall(node)) { |
|||
var requiredModuleName = getRequiredModuleName(node); |
|||
|
|||
if (requiredModuleName) { |
|||
foundModules.push(requiredModuleName); |
|||
} |
|||
} |
|||
}, |
|||
'Program:exit': function(node) { |
|||
if (foundModules.length < requiredModules.length) { |
|||
var missingModules = requiredModules.filter( |
|||
function(module) { |
|||
return foundModules.indexOf(module === -1); |
|||
} |
|||
); |
|||
missingModules.forEach(function(moduleName) { |
|||
context.report( |
|||
node, |
|||
'Mandatory module "{{moduleName}}" must be loaded.', |
|||
{ moduleName: moduleName } |
|||
); |
|||
}); |
|||
} |
|||
} |
|||
}; |
|||
}; |
|||
|
|||
module.exports.schema = { |
|||
'type': 'array', |
|||
'items': [ |
|||
{ |
|||
'enum': [0, 1, 2] |
|||
} |
|||
], |
|||
'additionalItems': { |
|||
'type': 'string' |
|||
}, |
|||
'uniqueItems': true |
|||
}; |
Loading…
Reference in new issue