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.

93 lines
2.6 KiB

/**
* @fileoverview A rule to choose between single and double quote marks
* @author Matt DuVall <http://www.mattduvall.com/>, Brandon Payton
*/
"use strict";
//------------------------------------------------------------------------------
// Constants
//------------------------------------------------------------------------------
var QUOTE_SETTINGS = {
"double": {
quote: "\"",
alternateQuote: "'",
description: "doublequote"
},
"single": {
quote: "'",
alternateQuote: "\"",
description: "singlequote"
},
"backtick": {
quote: "`",
alternateQuote: "\"",
description: "backtick"
}
};
var AVOID_ESCAPE = "avoid-escape";
//------------------------------------------------------------------------------
// Rule Definition
//------------------------------------------------------------------------------
module.exports = function(context) {
/**
* Validate that a string passed in is surrounded by the specified character
* @param {string} val The text to check.
* @param {string} character The character to see if it's surrounded by.
* @returns {boolean} True if the text is surrounded by the character, false if not.
* @private
*/
function isSurroundedBy(val, character) {
return val[0] === character && val[val.length - 1] === character;
}
/**
* Determines if a given node is part of JSX syntax.
* @param {ASTNode} node The node to check.
* @returns {boolean} True if the node is a JSX node, false if not.
* @private
*/
function isJSXElement(node) {
return node.type.indexOf("JSX") === 0;
}
return {
"Literal": function(node) {
var val = node.value,
rawVal = node.raw,
quoteOption = context.options[0],
settings = QUOTE_SETTINGS[quoteOption || "double"],
avoidEscape = context.options[1] === AVOID_ESCAPE,
isValid;
if (settings && typeof val === "string") {
isValid = isJSXElement(node.parent) || isSurroundedBy(rawVal, settings.quote);
if (!isValid && avoidEscape) {
isValid = isSurroundedBy(rawVal, settings.alternateQuote) && rawVal.indexOf(settings.quote) >= 0;
}
if (!isValid) {
context.report(node, "Strings must use " + settings.description + ".");
}
}
}
};
};
module.exports.schema = [
{
"enum": ["single", "double", "backtick"]
},
{
"enum": ["avoid-escape"]
}
];