From 01f7048289934196e43a23f509937b4cdba6e4c8 Mon Sep 17 00:00:00 2001 From: Brandon Mills Date: Tue, 7 Apr 2015 17:06:52 -0400 Subject: [PATCH] Show validation error source in warning --- conf/eslint.json | 2 +- lib/cli-engine.js | 7 ++++++- lib/config.js | 15 +++++++-------- lib/eslint.js | 25 ++++++++++++++----------- lib/rules/brace-style.js | 1 - lib/rules/camelcase.js | 1 - lib/rules/comma-dangle.js | 1 - lib/rules/comma-spacing.js | 1 - lib/rules/curly.js | 1 - lib/rules/dot-notation.js | 1 - lib/rules/eqeqeq.js | 1 - lib/rules/key-spacing.js | 1 - lib/rules/max-len.js | 1 - lib/rules/new-cap.js | 1 - lib/rules/no-cond-assign.js | 1 - lib/rules/no-inner-declarations.js | 1 - lib/rules/no-mixed-spaces-and-tabs.js | 1 - lib/rules/no-multi-spaces.js | 1 - lib/rules/no-unused-vars.js | 1 - lib/rules/no-use-before-define.js | 1 - lib/rules/quotes.js | 1 - lib/rules/semi-spacing.js | 1 - lib/rules/semi.js | 1 - lib/rules/space-infix-ops.js | 1 - lib/rules/space-unary-ops.js | 1 - lib/rules/strict.js | 1 - lib/rules/yoda.js | 1 - lib/validate-options.js | 17 +++++++++++++---- 28 files changed, 41 insertions(+), 48 deletions(-) diff --git a/conf/eslint.json b/conf/eslint.json index 236c385935b..0a822cc6376 100755 --- a/conf/eslint.json +++ b/conf/eslint.json @@ -166,6 +166,6 @@ "vars-on-top": 0, "wrap-iife": 0, "wrap-regex": 0, - "yoda": [2, "never"] + "yoda": [2, "never", { "exceptRange": true }] } } diff --git a/lib/cli-engine.js b/lib/cli-engine.js index 675153a46a1..279c2ad5df4 100644 --- a/lib/cli-engine.js +++ b/lib/cli-engine.js @@ -27,7 +27,8 @@ var fs = require("fs"), traverse = require("./util/traverse"), IgnoredPaths = require("./ignored-paths"), Config = require("./config"), - util = require("./util"); + util = require("./util"), + validate = require("./validate-options"); //------------------------------------------------------------------------------ // Typedefs @@ -262,6 +263,10 @@ function CLIEngine(options) { } loadPlugins(this.options.plugins); + + Object.keys(this.options.rules || {}).forEach(function(name) { + validate(name, this.options.rules[name], "CLI"); + }.bind(this)); } CLIEngine.prototype = { diff --git a/lib/config.js b/lib/config.js index 8206b376a9a..a73ee6ddcfe 100644 --- a/lib/config.js +++ b/lib/config.js @@ -11,18 +11,17 @@ // Requirements //------------------------------------------------------------------------------ -var assign = require("object-assign"), - debug = require("debug"), +var fs = require("fs"), + path = require("path"), environments = require("../conf/environments"), + util = require("./util"), FileFinder = require("./file-finder"), - fs = require("fs"), - path = require("path"), - rules = require('./rules'), stripComments = require("strip-json-comments"), + assign = require("object-assign"), + debug = require("debug"), + yaml = require("js-yaml"), userHome = require("user-home"), - util = require("./util"), - validate = require("./validate-options"), - yaml = require("js-yaml"); + validate = require("./validate-options"); //------------------------------------------------------------------------------ // Constants diff --git a/lib/eslint.js b/lib/eslint.js index 998306eb0d7..2d75f172b13 100755 --- a/lib/eslint.js +++ b/lib/eslint.js @@ -8,17 +8,18 @@ // Requirements //------------------------------------------------------------------------------ -var estraverse = require("estraverse-fb"), - escope = require("escope"), +var assign = require("object-assign"), + createTokenStore = require("./token-store.js"), environments = require("../conf/environments"), - assign = require("object-assign"), - rules = require("./rules"), - util = require("./util"), + escapeRegExp = require("escape-string-regexp"), + escope = require("escope"), + estraverse = require("estraverse-fb"), + EventEmitter = require("events").EventEmitter, RuleContext = require("./rule-context"), + rules = require("./rules"), timing = require("./timing"), - createTokenStore = require("./token-store.js"), - EventEmitter = require("events").EventEmitter, - escapeRegExp = require("escape-string-regexp"); + util = require("./util"), + validate = require("./validate-options"); //------------------------------------------------------------------------------ // Helpers @@ -247,13 +248,14 @@ function enableReporting(reportingConfig, start, rulesToEnable) { * Parses comments in file to extract file-specific config of rules, globals * and environments and merges them with global config; also code blocks * where reporting is disabled or enabled and merges them with reporting config. + * @param {string} filename The file being checked. * @param {ASTNode} ast The top node of the AST. * @param {Object} config The existing configuration data. * @param {Object[]} reportingConfig The existing reporting configuration data. * @param {Object[]} messages The messages queue. * @returns {void} */ -function modifyConfigsFromComments(ast, config, reportingConfig, messages) { +function modifyConfigsFromComments(filename, ast, config, reportingConfig, messages) { var commentConfig = { astGlobals: {}, @@ -294,6 +296,7 @@ function modifyConfigsFromComments(ast, config, reportingConfig, messages) { Object.keys(items).forEach(function(name) { var ruleValue = items[name]; if (typeof ruleValue === "number" || (Array.isArray(ruleValue) && typeof ruleValue[0] === "number")) { + validate(name, ruleValue, filename + " line " + comment.loc.start.line); commentRules[name] = ruleValue; } }); @@ -622,7 +625,7 @@ module.exports = (function() { currentAST = ast; // parse global comments and modify config - modifyConfigsFromComments(ast, config, reportingConfig, messages); + modifyConfigsFromComments(filename, ast, config, reportingConfig, messages); // enable appropriate rules Object.keys(config.rules).filter(function(key) { @@ -632,7 +635,7 @@ module.exports = (function() { var ruleCreator = rules.get(key), severity = getRuleSeverity(config.rules[key]), options = getRuleOptions(config.rules[key]), - rule, valid; + rule; if (ruleCreator) { try { diff --git a/lib/rules/brace-style.js b/lib/rules/brace-style.js index 6bf2ea6c582..5d639eac53d 100644 --- a/lib/rules/brace-style.js +++ b/lib/rules/brace-style.js @@ -204,7 +204,6 @@ module.exports = function(context) { }; module.exports.schema = { - "type": "array", "items": [ { "type": "string", diff --git a/lib/rules/camelcase.js b/lib/rules/camelcase.js index 3810a757c8b..679575e739e 100644 --- a/lib/rules/camelcase.js +++ b/lib/rules/camelcase.js @@ -99,7 +99,6 @@ module.exports = function(context) { }; module.exports.schema = { - "type": "array", "items": [ { "type": "object", diff --git a/lib/rules/comma-dangle.js b/lib/rules/comma-dangle.js index 152ad51a9f0..2d87772b5f4 100644 --- a/lib/rules/comma-dangle.js +++ b/lib/rules/comma-dangle.js @@ -58,7 +58,6 @@ module.exports = function (context) { }; module.exports.schema = { - "type": "array", "items": [ { "type": "string", diff --git a/lib/rules/comma-spacing.js b/lib/rules/comma-spacing.js index 8b2602a5954..1327174f47a 100644 --- a/lib/rules/comma-spacing.js +++ b/lib/rules/comma-spacing.js @@ -159,7 +159,6 @@ module.exports = function(context) { }; module.exports.schema = { - "type": "array", "items": [ { "type": "object", diff --git a/lib/rules/curly.js b/lib/rules/curly.js index 7c1e1504efa..57ebf099b05 100644 --- a/lib/rules/curly.js +++ b/lib/rules/curly.js @@ -103,7 +103,6 @@ module.exports = function(context) { }; module.exports.schema = { - "type": "array", "items": [ { "type": "string", diff --git a/lib/rules/dot-notation.js b/lib/rules/dot-notation.js index 5c9d0309784..1be329abcbd 100644 --- a/lib/rules/dot-notation.js +++ b/lib/rules/dot-notation.js @@ -104,7 +104,6 @@ module.exports = function(context) { }; module.exports.schema = { - "type": "array", "items": [ { "type": "object", diff --git a/lib/rules/eqeqeq.js b/lib/rules/eqeqeq.js index 9f0dcdecd50..110bae15f88 100644 --- a/lib/rules/eqeqeq.js +++ b/lib/rules/eqeqeq.js @@ -90,7 +90,6 @@ module.exports = function(context) { }; module.exports.schema = { - "type": "array", "items": [ { "type": "string", diff --git a/lib/rules/key-spacing.js b/lib/rules/key-spacing.js index bce8a44318d..3a06b487126 100644 --- a/lib/rules/key-spacing.js +++ b/lib/rules/key-spacing.js @@ -307,7 +307,6 @@ module.exports = function(context) { }; module.exports.schema = { - "type": "array", "items": [ { "type": "object", diff --git a/lib/rules/max-len.js b/lib/rules/max-len.js index 2d2290f4343..d058d943bd8 100644 --- a/lib/rules/max-len.js +++ b/lib/rules/max-len.js @@ -65,7 +65,6 @@ module.exports = function(context) { }; module.exports.schema = { - "type": "array", "items": [ { "type": "integer", diff --git a/lib/rules/new-cap.js b/lib/rules/new-cap.js index 0e8254b8f21..469a1d9ba79 100644 --- a/lib/rules/new-cap.js +++ b/lib/rules/new-cap.js @@ -197,7 +197,6 @@ module.exports = function(context) { }; module.exports.schema = { - "type": "array", "items": [ { "type": "object", diff --git a/lib/rules/no-cond-assign.js b/lib/rules/no-cond-assign.js index 74ef92f6c17..cbd157b163d 100644 --- a/lib/rules/no-cond-assign.js +++ b/lib/rules/no-cond-assign.js @@ -117,7 +117,6 @@ module.exports = function(context) { }; module.exports.schema = { - "type": "array", "items": [ { "type": "string", diff --git a/lib/rules/no-inner-declarations.js b/lib/rules/no-inner-declarations.js index fe66b41e390..2f39a896da4 100644 --- a/lib/rules/no-inner-declarations.js +++ b/lib/rules/no-inner-declarations.js @@ -72,7 +72,6 @@ module.exports = function(context) { }; module.exports.schema = { - "type": "array", "items": [ { "type": "string", diff --git a/lib/rules/no-mixed-spaces-and-tabs.js b/lib/rules/no-mixed-spaces-and-tabs.js index 63c1ed2a584..4dabb9b1f2a 100644 --- a/lib/rules/no-mixed-spaces-and-tabs.js +++ b/lib/rules/no-mixed-spaces-and-tabs.js @@ -68,7 +68,6 @@ module.exports = function(context) { }; module.exports.schema = { - "type": "array", "items": [ { "enum": ["smart-tabs", true, false] diff --git a/lib/rules/no-multi-spaces.js b/lib/rules/no-multi-spaces.js index 657a12ceaf4..6fea63768ae 100644 --- a/lib/rules/no-multi-spaces.js +++ b/lib/rules/no-multi-spaces.js @@ -101,7 +101,6 @@ module.exports = function(context) { }; module.exports.schema = { - "type": "array", "items": [ { "type": "object", diff --git a/lib/rules/no-unused-vars.js b/lib/rules/no-unused-vars.js index 6d059a811e5..512f1cbd1f6 100644 --- a/lib/rules/no-unused-vars.js +++ b/lib/rules/no-unused-vars.js @@ -180,7 +180,6 @@ module.exports = function(context) { }; module.exports.schema = { - "type": "array", "items": [ { "oneOf": [ diff --git a/lib/rules/no-use-before-define.js b/lib/rules/no-use-before-define.js index 190ded332f9..4f1c2908f97 100644 --- a/lib/rules/no-use-before-define.js +++ b/lib/rules/no-use-before-define.js @@ -67,7 +67,6 @@ module.exports = function(context) { }; module.exports.schema = { - "type": "array", "items": [ { "enum": ["nofunc"] diff --git a/lib/rules/quotes.js b/lib/rules/quotes.js index 732d8f7d8ff..b1b21c4630d 100644 --- a/lib/rules/quotes.js +++ b/lib/rules/quotes.js @@ -78,7 +78,6 @@ module.exports = function(context) { }; module.exports.schema = { - "type": "array", "items": [ { "type": "string", diff --git a/lib/rules/semi-spacing.js b/lib/rules/semi-spacing.js index 38d46605f2c..a923970367b 100644 --- a/lib/rules/semi-spacing.js +++ b/lib/rules/semi-spacing.js @@ -152,7 +152,6 @@ module.exports = function (context) { }; module.exports.schema = { - "type": "array", "items": [ { "type": "object", diff --git a/lib/rules/semi.js b/lib/rules/semi.js index f8dbff7d465..a9ac45f3167 100644 --- a/lib/rules/semi.js +++ b/lib/rules/semi.js @@ -130,7 +130,6 @@ module.exports = function(context) { }; module.exports.schema = { - "type": "array", "items": [ { "enum": ["always", "never"] diff --git a/lib/rules/space-infix-ops.js b/lib/rules/space-infix-ops.js index 64509a5923c..94c6d68fae4 100644 --- a/lib/rules/space-infix-ops.js +++ b/lib/rules/space-infix-ops.js @@ -68,7 +68,6 @@ module.exports = function(context) { }; module.exports.schema = { - "type": "array", "items": [ { "type": "object", diff --git a/lib/rules/space-unary-ops.js b/lib/rules/space-unary-ops.js index 4c611f4fea2..616a9d28a2f 100644 --- a/lib/rules/space-unary-ops.js +++ b/lib/rules/space-unary-ops.js @@ -118,7 +118,6 @@ module.exports = function(context) { }; module.exports.schema = { - "type": "array", "items": [ { "type": "object", diff --git a/lib/rules/strict.js b/lib/rules/strict.js index 80ed97869cf..4ade7971615 100644 --- a/lib/rules/strict.js +++ b/lib/rules/strict.js @@ -236,7 +236,6 @@ module.exports = function(context) { }; module.exports.schema = { - "type": "array", "items": [ { "type": "string", diff --git a/lib/rules/yoda.js b/lib/rules/yoda.js index 84b57d350b2..7e2ddb0a6de 100644 --- a/lib/rules/yoda.js +++ b/lib/rules/yoda.js @@ -210,7 +210,6 @@ module.exports = function (context) { }; module.exports.schema = { - "type": "array", "items": [ { "type": "string", diff --git a/lib/validate-options.js b/lib/validate-options.js index 6b75d8281c7..3db74a2553e 100644 --- a/lib/validate-options.js +++ b/lib/validate-options.js @@ -6,11 +6,16 @@ "use strict"; -var rules = require('./rules'), +var rules = require("./rules"), validator = require("is-my-json-valid"); var validators = Object.create(null); // Cache generated schema validators +/** + * Converts a rule's exported, abbreviated schema into a full schema. + * @param {object} options Exported schema from a rule. + * @returns {object} Full schema ready for validation. + */ function makeSchema(options) { if (!options) { return { @@ -20,7 +25,7 @@ function makeSchema(options) { "enum": [0, 1, 2] } ], - "minItems": 1, + "minItems": 1 }; } @@ -55,6 +60,10 @@ module.exports = function (id, config, source) { ].join("")); } + if (typeof config === "number") { + return; + } + validate = validators[id]; if (!validate) { rule = rules.get(id); @@ -62,7 +71,7 @@ module.exports = function (id, config, source) { validators[id] = validate; } - validate(config.slice(1)); + validate(config); if (validate.errors) { message = [ @@ -71,7 +80,7 @@ module.exports = function (id, config, source) { ]; validate.errors.forEach(function (error) { message.push( - "\tValue ", error.value, " ", error.message, ".\n" + "\tValue \"", error.value, "\" ", error.message, ".\n" ); });