mirror of https://github.com/lukechilds/node.git
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
108 lines
2.0 KiB
108 lines
2.0 KiB
/**
|
|
* @fileoverview Look for useless escapes in strings and regexes
|
|
* @author Onur Temizkan
|
|
* @copyright 2016 Onur Temizkan. All rights reserved.
|
|
*/
|
|
|
|
"use strict";
|
|
|
|
//------------------------------------------------------------------------------
|
|
// Rule Definition
|
|
//------------------------------------------------------------------------------
|
|
|
|
var VALID_STRING_ESCAPES = [
|
|
"\\",
|
|
"n",
|
|
"r",
|
|
"v",
|
|
"t",
|
|
"b",
|
|
"f",
|
|
"u",
|
|
"x",
|
|
"\n",
|
|
"\r"
|
|
];
|
|
|
|
var VALID_REGEX_ESCAPES = [
|
|
"\\",
|
|
".",
|
|
"-",
|
|
"^",
|
|
"$",
|
|
"*",
|
|
"+",
|
|
"?",
|
|
"{",
|
|
"}",
|
|
"[",
|
|
"]",
|
|
"|",
|
|
"(",
|
|
")",
|
|
"b",
|
|
"B",
|
|
"c",
|
|
"d",
|
|
"D",
|
|
"f",
|
|
"n",
|
|
"r",
|
|
"s",
|
|
"S",
|
|
"t",
|
|
"v",
|
|
"w",
|
|
"W",
|
|
"x",
|
|
"u"
|
|
];
|
|
|
|
module.exports = function(context) {
|
|
|
|
/**
|
|
* Checks if the escape character in given slice is unnecessary.
|
|
*
|
|
* @private
|
|
* @param {string} elm - string slice to validate.
|
|
* @param {ASTNode} node - node to validate.
|
|
* @returns {void}
|
|
* @this escapes_quote_node
|
|
*/
|
|
function validate(elm) {
|
|
var escapeNotFound = this.escapes.indexOf(elm[1]) === -1;
|
|
var isQuoteEscape = elm[1] === this.node.raw[0];
|
|
|
|
if (escapeNotFound && !isQuoteEscape) {
|
|
context.report(this.node, "Unnecessary escape character: " + elm);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Checks if a node has an escape.
|
|
*
|
|
* @param {ASTNode} node - node to check.
|
|
* @returns {void}
|
|
*/
|
|
function check(node) {
|
|
var nodeEscapes;
|
|
|
|
if (typeof node.value === "string") {
|
|
nodeEscapes = VALID_STRING_ESCAPES;
|
|
} else if (node.regex) {
|
|
nodeEscapes = VALID_REGEX_ESCAPES;
|
|
} else {
|
|
return;
|
|
}
|
|
|
|
(node.raw.match(/\\[^\d]/g) || []).forEach(validate, {
|
|
"escapes": nodeEscapes,
|
|
"node": node
|
|
});
|
|
}
|
|
return {
|
|
"Literal": check
|
|
};
|
|
};
|
|
|
|
module.exports.schema = [];
|
|
|