| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495 | /** * @fileoverview A rule to ensure consistent quotes used in jsx syntax. * @author Mathias Schreck <https://github.com/lo1tuma> */"use strict";//------------------------------------------------------------------------------// Requirements//------------------------------------------------------------------------------const astUtils = require("./utils/ast-utils");//------------------------------------------------------------------------------// Constants//------------------------------------------------------------------------------const QUOTE_SETTINGS = {    "prefer-double": {        quote: "\"",        description: "singlequote",        convert(str) {            return str.replace(/'/gu, "\"");        }    },    "prefer-single": {        quote: "'",        description: "doublequote",        convert(str) {            return str.replace(/"/gu, "'");        }    }};//------------------------------------------------------------------------------// Rule Definition//------------------------------------------------------------------------------/** @type {import('../shared/types').Rule} */module.exports = {    meta: {        type: "layout",        docs: {            description: "Enforce the consistent use of either double or single quotes in JSX attributes",            recommended: false,            url: "https://eslint.org/docs/rules/jsx-quotes"        },        fixable: "whitespace",        schema: [            {                enum: ["prefer-single", "prefer-double"]            }        ],        messages: {            unexpected: "Unexpected usage of {{description}}."        }    },    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.includes(setting.quote) || astUtils.isSurroundedBy(node.raw, setting.quote);        }        return {            JSXAttribute(node) {                const attributeValue = node.value;                if (attributeValue && astUtils.isStringLiteral(attributeValue) && !usesExpectedQuotes(attributeValue)) {                    context.report({                        node: attributeValue,                        messageId: "unexpected",                        data: {                            description: setting.description                        },                        fix(fixer) {                            return fixer.replaceText(attributeValue, setting.convert(attributeValue.raw));                        }                    });                }            }        };    }};
 |