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