]> git.proxmox.com Git - pve-eslint.git/blob - eslint/lib/rules/jsx-quotes.js
cbadc19d5ed5632567538b41d40f1b61b72aead5
[pve-eslint.git] / eslint / lib / rules / jsx-quotes.js
1 /**
2 * @fileoverview A rule to ensure consistent quotes used in jsx syntax.
3 * @author Mathias Schreck <https://github.com/lo1tuma>
4 */
5
6 "use strict";
7
8 //------------------------------------------------------------------------------
9 // Requirements
10 //------------------------------------------------------------------------------
11
12 const astUtils = require("./utils/ast-utils");
13
14 //------------------------------------------------------------------------------
15 // Constants
16 //------------------------------------------------------------------------------
17
18 const QUOTE_SETTINGS = {
19 "prefer-double": {
20 quote: "\"",
21 description: "singlequote",
22 convert(str) {
23 return str.replace(/'/gu, "\"");
24 }
25 },
26 "prefer-single": {
27 quote: "'",
28 description: "doublequote",
29 convert(str) {
30 return str.replace(/"/gu, "'");
31 }
32 }
33 };
34
35 //------------------------------------------------------------------------------
36 // Rule Definition
37 //------------------------------------------------------------------------------
38
39 module.exports = {
40 meta: {
41 type: "layout",
42
43 docs: {
44 description: "enforce the consistent use of either double or single quotes in JSX attributes",
45 recommended: false,
46 url: "https://eslint.org/docs/rules/jsx-quotes"
47 },
48
49 fixable: "whitespace",
50
51 schema: [
52 {
53 enum: ["prefer-single", "prefer-double"]
54 }
55 ],
56 messages: {
57 unexpected: "Unexpected usage of {{description}}."
58 }
59 },
60
61 create(context) {
62 const quoteOption = context.options[0] || "prefer-double",
63 setting = QUOTE_SETTINGS[quoteOption];
64
65 /**
66 * Checks if the given string literal node uses the expected quotes
67 * @param {ASTNode} node A string literal node.
68 * @returns {boolean} Whether or not the string literal used the expected quotes.
69 * @public
70 */
71 function usesExpectedQuotes(node) {
72 return node.value.indexOf(setting.quote) !== -1 || astUtils.isSurroundedBy(node.raw, setting.quote);
73 }
74
75 return {
76 JSXAttribute(node) {
77 const attributeValue = node.value;
78
79 if (attributeValue && astUtils.isStringLiteral(attributeValue) && !usesExpectedQuotes(attributeValue)) {
80 context.report({
81 node: attributeValue,
82 messageId: "unexpected",
83 data: {
84 description: setting.description
85 },
86 fix(fixer) {
87 return fixer.replaceText(attributeValue, setting.convert(attributeValue.raw));
88 }
89 });
90 }
91 }
92 };
93 }
94 };