Repository: typescript-eslint/tslint-to-eslint-config (ts)

Issue:
Missing converter: quotemark
### 💥 Missing Converter

-   `tslint-to-eslint-config` version: 1.2.0
-   `typescript-eslint` version: 2.3.2

#### TSLint Rule Name

`quotemark`


Pull request:
Added missing quotemark converter
<!--
👋 Hi, thanks for sending a PR to tslint-to-eslint-config! 💖
Please fill out all fields below to ensure your PR is reviewed quickly.
-->

## PR Checklist

-   [x] Addresses an existing issue: fixes #182
-   [x] That issue was marked as [`status: accepting prs`](https://github.com/typescript-eslint/tslint-to-eslint-config/labels/status%3A%20accepting%20prs)

## Overview

<!-- Brief description of what is changed and how the code change does that. -->
Adds a missing rule converter for the `quotemark` rule.

Patch:
diff --git a/src/rules/converters.ts b/src/rules/converters.ts
index 8aa11d7..f98b219 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 0000000..3c864df
--- /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",
+            },
+        ],
+    };
+};


Test patch:
diff --git a/src/rules/converters/tests/quotemark.test.ts b/src/rules/converters/tests/quotemark.test.ts
new file mode 100644
index 0000000..a5aeb38
--- /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.',
+                    ],
+                },
+            ],
+        });
+    });
+});