1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192 |
- /**
- * @fileoverview A rule to ensure consistent quotes used in jsx syntax.
- * @author Mathias Schreck <https://github.com/lo1tuma>
- */
-
- "use strict";
-
- //------------------------------------------------------------------------------
- // Requirements
- //------------------------------------------------------------------------------
-
- const astUtils = require("../util/ast-utils");
-
- //------------------------------------------------------------------------------
- // Constants
- //------------------------------------------------------------------------------
-
- const QUOTE_SETTINGS = {
- "prefer-double": {
- quote: "\"",
- description: "singlequote",
- convert(str) {
- return str.replace(/'/g, "\"");
- }
- },
- "prefer-single": {
- quote: "'",
- description: "doublequote",
- convert(str) {
- return str.replace(/"/g, "'");
- }
- }
- };
-
- //------------------------------------------------------------------------------
- // Rule Definition
- //------------------------------------------------------------------------------
-
- module.exports = {
- meta: {
- type: "layout",
-
- docs: {
- description: "enforce the consistent use of either double or single quotes in JSX attributes",
- category: "Stylistic Issues",
- recommended: false,
- url: "https://eslint.org/docs/rules/jsx-quotes"
- },
-
- fixable: "whitespace",
-
- schema: [
- {
- enum: ["prefer-single", "prefer-double"]
- }
- ]
- },
-
- create(context) {
- const quoteOption = context.options[0] || "prefer-double",
- setting = QUOTE_SETTINGS[quoteOption];
-
- /**
- * Checks if the given string literal node uses the expected quotes
- * @param {ASTNode} node - A string literal node.
- * @returns {boolean} Whether or not the string literal used the expected quotes.
- * @public
- */
- function usesExpectedQuotes(node) {
- return node.value.indexOf(setting.quote) !== -1 || astUtils.isSurroundedBy(node.raw, setting.quote);
- }
-
- return {
- JSXAttribute(node) {
- const attributeValue = node.value;
-
- if (attributeValue && astUtils.isStringLiteral(attributeValue) && !usesExpectedQuotes(attributeValue)) {
- context.report({
- node: attributeValue,
- message: "Unexpected usage of {{description}}.",
- data: {
- description: setting.description
- },
- fix(fixer) {
- return fixer.replaceText(attributeValue, setting.convert(attributeValue.raw));
- }
- });
- }
- }
- };
- }
- };
|