mirror of https://github.com/lukechilds/node.git
Browse Source
PR-URL: https://github.com/nodejs/node/pull/8296 Reviewed-By: Colin Ihrig <cjihrig@gmail.com> Reviewed-By: James M Snell <jasnell@gmail.com> Reviewed-By: Benjamin Gruenbaum <benjamingr@gmail.com> Reviewed-By: Roman Reiss <me@silverwind.io>v7.x
Rich Trott
8 years ago
303 changed files with 2227 additions and 2058 deletions
@ -0,0 +1,77 @@ |
|||||
|
#!/usr/bin/env node
|
||||
|
|
||||
|
/** |
||||
|
* @fileoverview Main CLI that is run via the eslint command. |
||||
|
* @author Nicholas C. Zakas |
||||
|
*/ |
||||
|
|
||||
|
"use strict"; |
||||
|
|
||||
|
//------------------------------------------------------------------------------
|
||||
|
// Helpers
|
||||
|
//------------------------------------------------------------------------------
|
||||
|
|
||||
|
var useStdIn = (process.argv.indexOf("--stdin") > -1), |
||||
|
init = (process.argv.indexOf("--init") > -1), |
||||
|
debug = (process.argv.indexOf("--debug") > -1); |
||||
|
|
||||
|
// must do this initialization *before* other requires in order to work
|
||||
|
if (debug) { |
||||
|
require("debug").enable("eslint:*,-eslint:code-path"); |
||||
|
} |
||||
|
|
||||
|
//------------------------------------------------------------------------------
|
||||
|
// Requirements
|
||||
|
//------------------------------------------------------------------------------
|
||||
|
|
||||
|
// now we can safely include the other modules that use debug
|
||||
|
var concat = require("concat-stream"), |
||||
|
cli = require("../lib/cli"), |
||||
|
path = require("path"), |
||||
|
fs = require("fs"); |
||||
|
|
||||
|
//------------------------------------------------------------------------------
|
||||
|
// Execution
|
||||
|
//------------------------------------------------------------------------------
|
||||
|
|
||||
|
process.on("uncaughtException", function(err){ |
||||
|
// lazy load
|
||||
|
var lodash = require("lodash"); |
||||
|
|
||||
|
if (typeof err.messageTemplate === "string" && err.messageTemplate.length > 0) { |
||||
|
var template = lodash.template(fs.readFileSync(path.resolve(__dirname, "../messages/" + err.messageTemplate + ".txt"), "utf-8")); |
||||
|
|
||||
|
console.log("\nOops! Something went wrong! :("); |
||||
|
console.log("\n" + template(err.messageData || {})); |
||||
|
} else { |
||||
|
console.log(err.message); |
||||
|
console.log(err.stack); |
||||
|
} |
||||
|
|
||||
|
process.exit(1); |
||||
|
}); |
||||
|
|
||||
|
if (useStdIn) { |
||||
|
process.stdin.pipe(concat({ encoding: "string" }, function(text) { |
||||
|
try { |
||||
|
process.exitCode = cli.execute(process.argv, text); |
||||
|
} catch (ex) { |
||||
|
console.error(ex.message); |
||||
|
console.error(ex.stack); |
||||
|
process.exitCode = 1; |
||||
|
} |
||||
|
})); |
||||
|
} else if (init) { |
||||
|
var configInit = require("../lib/config/config-initializer"); |
||||
|
configInit.initializeConfig(function(err) { |
||||
|
if (err) { |
||||
|
process.exitCode = 1; |
||||
|
console.error(err.message); |
||||
|
console.error(err.stack); |
||||
|
} else { |
||||
|
process.exitCode = 0; |
||||
|
} |
||||
|
}); |
||||
|
} else { |
||||
|
process.exitCode = cli.execute(process.argv); |
||||
|
} |
@ -0,0 +1,80 @@ |
|||||
|
/** |
||||
|
* @fileoverview Rule to enforce that all class methods use 'this'. |
||||
|
* @author Patrick Williams |
||||
|
*/ |
||||
|
|
||||
|
"use strict"; |
||||
|
|
||||
|
//------------------------------------------------------------------------------
|
||||
|
// Rule Definition
|
||||
|
//------------------------------------------------------------------------------
|
||||
|
|
||||
|
module.exports = { |
||||
|
meta: { |
||||
|
docs: { |
||||
|
description: "enforce that class methods utilize `this`", |
||||
|
category: "Best Practices", |
||||
|
recommended: false |
||||
|
}, |
||||
|
schema: [] |
||||
|
}, |
||||
|
create(context) { |
||||
|
const stack = []; |
||||
|
|
||||
|
/** |
||||
|
* Initializes the current context to false and pushes it onto the stack. |
||||
|
* These booleans represent whether 'this' has been used in the context. |
||||
|
* @returns {void} |
||||
|
* @private |
||||
|
*/ |
||||
|
function enterFunction() { |
||||
|
stack.push(false); |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* Check if the node is an instance method |
||||
|
* @param {ASTNode} node - node to check |
||||
|
* @returns {boolean} True if its an instance method |
||||
|
* @private |
||||
|
*/ |
||||
|
function isInstanceMethod(node) { |
||||
|
return !node.static && node.kind !== "constructor" && node.type === "MethodDefinition"; |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* Checks if we are leaving a function that is a method, and reports if 'this' has not been used. |
||||
|
* Static methods and the constructor are exempt. |
||||
|
* Then pops the context off the stack. |
||||
|
* @param {ASTNode} node - A function node that was entered. |
||||
|
* @returns {void} |
||||
|
* @private |
||||
|
*/ |
||||
|
function exitFunction(node) { |
||||
|
const methodUsesThis = stack.pop(); |
||||
|
|
||||
|
if (isInstanceMethod(node.parent) && !methodUsesThis) { |
||||
|
context.report(node, "Expected 'this' to be used by class method '" + node.parent.key.name + "'."); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* Mark the current context as having used 'this'. |
||||
|
* @returns {void} |
||||
|
* @private |
||||
|
*/ |
||||
|
function markThisUsed() { |
||||
|
if (stack.length) { |
||||
|
stack[stack.length - 1] = true; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
return { |
||||
|
FunctionDeclaration: enterFunction, |
||||
|
"FunctionDeclaration:exit": exitFunction, |
||||
|
FunctionExpression: enterFunction, |
||||
|
"FunctionExpression:exit": exitFunction, |
||||
|
ThisExpression: markThisUsed, |
||||
|
Super: markThisUsed |
||||
|
}; |
||||
|
} |
||||
|
}; |
Some files were not shown because too many files changed in this diff
Loading…
Reference in new issue