diff --git a/src/rules/converters.ts b/src/rules/converters.ts index 8aa11d76f..f98b21917 100644 --- a/src/rules/converters.ts +++ b/src/rules/converters.ts @@ -101,6 +101,7 @@ import { convertUnifiedSignatures } from "./converters/unified-signatures"; import { convertUnnecessaryBind } from "./converters/unnecessary-bind"; import { convertUnnecessaryConstructor } from "./converters/unnecessary-constructor"; import { convertUseIsnan } from "./converters/use-isnan"; +import { convertQuotemark } from "./converters/quotemark"; import { convertTripleEquals } from "./converters/triple-equals"; /** @@ -210,7 +211,9 @@ export const converters = new Map([ ["no-octal-literal", convertNoOctalLiteral], ["no-regex-spaces", convertNoRegexSpaces], ["no-unnecessary-semicolons", convertNoUnnecessarySemicolons], + ["quotemark", convertQuotemark], ["triple-equals", convertTripleEquals], + // These converters are all for rules that need more complex option conversions. // Some of them will likely need to have notices about changed lint behaviors... // If you're willing to take on that work, that'd be great! Please send PRs! 💖 @@ -225,7 +228,6 @@ export const converters = new Map([ // ["no-trailing-whitespace", convertNoTrailingWhitespace], // no-trailing-spaces // ["no-unused-expression", convertNoUnusedExpression], // no-unused-expressions // ["no-void-expression", convertNoVoidExpression], // (no exact equivalent) - // ["quotemark", convertQuotemark], // quotes // ["space-within-parens", convertSpaceWithinParens], // space-in-parens // ["variable-name", convertVariableName], // a bunch of rules... diff --git a/src/rules/converters/quotemark.ts b/src/rules/converters/quotemark.ts new file mode 100644 index 000000000..3c864df7a --- /dev/null +++ b/src/rules/converters/quotemark.ts @@ -0,0 +1,33 @@ +import { RuleConverter } from "../converter"; + +type QuotemarkRule = string | { avoidEscape: true }; +export const convertQuotemark: RuleConverter = tslintRule => { + const notices: string[] = []; + const ruleArguments: QuotemarkRule[] = []; + + ["jsx-single", "jsx-double", "avoid-template"].forEach(option => { + if (tslintRule.ruleArguments.includes(option)) { + notices.push(`Option "${option}" is not supported by ESLint.`); + } + }); + + ["single", "double", "backtick"].forEach(option => { + if (tslintRule.ruleArguments.includes(option)) { + ruleArguments.push(option); + } + }); + + if (tslintRule.ruleArguments.includes("avoid-escape")) { + ruleArguments.push({ avoidEscape: true }); + } + + return { + rules: [ + { + notices, + ruleArguments, + ruleName: "@typescript-eslint/quotes", + }, + ], + }; +}; diff --git a/src/rules/converters/tests/quotemark.test.ts b/src/rules/converters/tests/quotemark.test.ts new file mode 100644 index 000000000..a5aeb3849 --- /dev/null +++ b/src/rules/converters/tests/quotemark.test.ts @@ -0,0 +1,87 @@ +import { convertQuotemark } from "../quotemark"; + +describe(convertQuotemark, () => { + test("conversion without arguments", () => { + const result = convertQuotemark({ + ruleArguments: [], + }); + + expect(result).toEqual({ + rules: [ + { + ruleName: "@typescript-eslint/quotes", + ruleArguments: [], + notices: [], + }, + ], + }); + }); + + test("conversion with an argument", () => { + const result = convertQuotemark({ + ruleArguments: ["double"], + }); + + expect(result).toEqual({ + rules: [ + { + ruleName: "@typescript-eslint/quotes", + ruleArguments: ["double"], + notices: [], + }, + ], + }); + }); + + test("conversion with an avoid-escape argument", () => { + const result = convertQuotemark({ + ruleArguments: ["avoid-escape"], + }); + + expect(result).toEqual({ + rules: [ + { + ruleName: "@typescript-eslint/quotes", + ruleArguments: [{ avoidEscape: true }], + notices: [], + }, + ], + }); + }); + + test("conversion with arguments", () => { + const result = convertQuotemark({ + ruleArguments: ["single", "avoid-template"], + }); + + expect(result).toEqual({ + rules: [ + { + ruleName: "@typescript-eslint/quotes", + ruleArguments: ["single"], + notices: ['Option "avoid-template" is not supported by ESLint.'], + }, + ], + }); + }); + + test("conversion with unsupported arguments", () => { + const result = convertQuotemark({ + ruleArguments: ["jsx-single", "jsx-double", "avoid-template"], + }); + + expect(result).toEqual({ + rules: [ + { + ruleName: "@typescript-eslint/quotes", + ruleArguments: [], + notices: [ + 'Option "jsx-single" is not supported by ESLint.', + 'Option "jsx-double" is not supported by ESLint.', + 'Option "avoid-template" is not supported by ESLint.', + ], + }, + ], + }); + }); +});