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

Issue:
rxjs-no-unsafe-takeuntil
### 💥 Missing Converter

-   `tslint-to-eslint-config` version: 1.5.0
-   `typescript-eslint` version: 4.6.0

#### TSLint Rule Name
[rxjs-no-unsafe-takeuntil](https://cartant.github.io/rxjs-tslint-rules/#rxjs-no-unsafe-takeuntil)

#### Package Source
rxjs-tslint-rules


Pull request:
rxjs-no-unsafe-takeuntil and fix in rxjs-no-async-subscribe
<!--
👋 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 #790
-   [x] That issue was marked as [`status: accepting prs`](https://github.com/typescript-eslint/tslint-to-eslint-config/labels/status%3A%20accepting%20prs)

## Overview

adding rxjs-no-unsafe-takeuntil converter and fix in rxjs-no-async-subscribe converter (missing 'rxjs/' prefix in new rule name)
also added .idea (Webstorm/InteliJ) folder to .gitignore

Patch:
diff --git a/src/converters/lintConfigs/rules/ruleConverters.ts b/src/converters/lintConfigs/rules/ruleConverters.ts
index 1cd2e9a..4baf906 100644
--- a/src/converters/lintConfigs/rules/ruleConverters.ts
+++ b/src/converters/lintConfigs/rules/ruleConverters.ts
@@ -185,6 +185,7 @@ import { convertJsxWrapMultiline } from "./ruleConverters/eslint-plugin-react/js
 
 // eslint-plugin-rxjs converters
 import { convertNoAsyncSubscribe } from "./ruleConverters/eslint-plugin-rxjs/no-async-subscribe";
+import { convertNoImplicitAnyCatch } from "./ruleConverters/eslint-plugin-rxjs/no-implicit-any-catch";
 import { convertNoCreate } from "./ruleConverters/eslint-plugin-rxjs/no-create";
 import { convertNoIgnoredNotifier } from "./ruleConverters/eslint-plugin-rxjs/no-ignored-notifier";
 import { convertNoIgnoredReplayBuffer } from "./ruleConverters/eslint-plugin-rxjs/no-ignored-replay-buffer";
@@ -198,6 +199,7 @@ import { convertNoSubjectUnubscribe } from "./ruleConverters/eslint-plugin-rxjs/
 import { convertNoSubjectValue } from "./ruleConverters/eslint-plugin-rxjs/no-subject-value";
 import { convertNoUnboundMethods } from "./ruleConverters/eslint-plugin-rxjs/no-unbound-methods";
 import { convertNoUnsafeSubjectNext } from "./ruleConverters/eslint-plugin-rxjs/no-unsafe-subject-next";
+import { convertNoUnsafeTakeUntil } from "./ruleConverters/eslint-plugin-rxjs/no-unsafe-takeuntil";
 
 /**
  * Keys TSLint rule names to their ESLint rule converters.
@@ -385,6 +387,7 @@ export const ruleConverters = new Map([
     ["use-pipe-transform-interface", convertUsePipeTransformInterface],
     ["variable-name", convertVariableName],
     ["rxjs-no-async-subscribe", convertNoAsyncSubscribe],
+    ["rxjs-no-implicit-any-catch", convertNoImplicitAnyCatch],
     ["rxjs-no-create", convertNoCreate],
     ["rxjs-no-ignored-notifier", convertNoIgnoredNotifier],
     ["rxjs-no-ignored-replay-buffer", convertNoIgnoredReplayBuffer],
@@ -398,6 +401,7 @@ export const ruleConverters = new Map([
     ["rxjs-no-subject-value", convertNoSubjectValue],
     ["rxjs-no-unbound-methods", convertNoUnboundMethods],
     ["rxjs-no-unsafe-subject-next", convertNoUnsafeSubjectNext],
+    ["rxjs-no-unsafe-takeuntil", convertNoUnsafeTakeUntil],
 
     // 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...
diff --git a/src/converters/lintConfigs/rules/ruleConverters/eslint-plugin-rxjs/no-async-subscribe.ts b/src/converters/lintConfigs/rules/ruleConverters/eslint-plugin-rxjs/no-async-subscribe.ts
index 8252efe..e0f399d 100644
--- a/src/converters/lintConfigs/rules/ruleConverters/eslint-plugin-rxjs/no-async-subscribe.ts
+++ b/src/converters/lintConfigs/rules/ruleConverters/eslint-plugin-rxjs/no-async-subscribe.ts
@@ -4,7 +4,7 @@ export const convertNoAsyncSubscribe: RuleConverter = () => {
     return {
         rules: [
             {
-                ruleName: "no-async-subscribe",
+                ruleName: "rxjs/no-async-subscribe",
             },
         ],
         plugins: ["eslint-plugin-rxjs"],
diff --git a/src/converters/lintConfigs/rules/ruleConverters/eslint-plugin-rxjs/no-implicit-any-catch.ts b/src/converters/lintConfigs/rules/ruleConverters/eslint-plugin-rxjs/no-implicit-any-catch.ts
new file mode 100644
index 0000000..bc040b3
--- /dev/null
+++ b/src/converters/lintConfigs/rules/ruleConverters/eslint-plugin-rxjs/no-implicit-any-catch.ts
@@ -0,0 +1,15 @@
+import { RuleConverter } from "../../ruleConverter";
+
+export const convertNoImplicitAnyCatch: RuleConverter = (tslintRule) => {
+    return {
+        rules: [
+            {
+                ...(tslintRule.ruleArguments.length !== 0 && {
+                    ruleArguments: tslintRule.ruleArguments,
+                }),
+                ruleName: "rxjs/no-implicit-any-catch",
+            },
+        ],
+        plugins: ["eslint-plugin-rxjs"],
+    };
+};
diff --git a/src/converters/lintConfigs/rules/ruleConverters/eslint-plugin-rxjs/no-unsafe-takeuntil.ts b/src/converters/lintConfigs/rules/ruleConverters/eslint-plugin-rxjs/no-unsafe-takeuntil.ts
new file mode 100644
index 0000000..889bf51
--- /dev/null
+++ b/src/converters/lintConfigs/rules/ruleConverters/eslint-plugin-rxjs/no-unsafe-takeuntil.ts
@@ -0,0 +1,15 @@
+import { RuleConverter } from "../../ruleConverter";
+
+export const convertNoUnsafeTakeUntil: RuleConverter = (tslintRule) => {
+    return {
+        rules: [
+            {
+                ...(tslintRule.ruleArguments.length !== 0 && {
+                    ruleArguments: tslintRule.ruleArguments,
+                }),
+                ruleName: "rxjs/no-unsafe-takeuntil",
+            },
+        ],
+        plugins: ["eslint-plugin-rxjs"],
+    };
+};


Test patch:
diff --git a/src/converters/lintConfigs/rules/ruleConverters/eslint-plugin-rxjs/tests/no-async-subscribe.test.ts b/src/converters/lintConfigs/rules/ruleConverters/eslint-plugin-rxjs/tests/no-async-subscribe.test.ts
index 40cdeed..3771774 100644
--- a/src/converters/lintConfigs/rules/ruleConverters/eslint-plugin-rxjs/tests/no-async-subscribe.test.ts
+++ b/src/converters/lintConfigs/rules/ruleConverters/eslint-plugin-rxjs/tests/no-async-subscribe.test.ts
@@ -9,7 +9,7 @@ describe(convertNoAsyncSubscribe, () => {
         expect(result).toEqual({
             rules: [
                 {
-                    ruleName: "no-async-subscribe",
+                    ruleName: "rxjs/no-async-subscribe",
                 },
             ],
             plugins: ["eslint-plugin-rxjs"],
diff --git a/src/converters/lintConfigs/rules/ruleConverters/eslint-plugin-rxjs/tests/no-implicit-any-catch.test..ts b/src/converters/lintConfigs/rules/ruleConverters/eslint-plugin-rxjs/tests/no-implicit-any-catch.test..ts
new file mode 100644
index 0000000..c9517f7
--- /dev/null
+++ b/src/converters/lintConfigs/rules/ruleConverters/eslint-plugin-rxjs/tests/no-implicit-any-catch.test..ts
@@ -0,0 +1,34 @@
+import { convertNoImplicitAnyCatch } from "../no-implicit-any-catch";
+
+describe(convertNoImplicitAnyCatch, () => {
+    test("conversion without arguments", () => {
+        const result = convertNoImplicitAnyCatch({
+            ruleArguments: [],
+        });
+
+        expect(result).toEqual({
+            rules: [
+                {
+                    ruleName: "rxjs/no-implicit-any-catch",
+                },
+            ],
+            plugins: ["eslint-plugin-rxjs"],
+        });
+    });
+
+    test("conversion with allowExplicitAny argument", () => {
+        const result = convertNoImplicitAnyCatch({
+            ruleArguments: [{ allowExplicitAny: true }],
+        });
+
+        expect(result).toEqual({
+            rules: [
+                {
+                    ruleName: "rxjs/no-implicit-any-catch",
+                    ruleArguments: [{ allowExplicitAny: true }],
+                },
+            ],
+            plugins: ["eslint-plugin-rxjs"],
+        });
+    });
+});
diff --git a/src/converters/lintConfigs/rules/ruleConverters/eslint-plugin-rxjs/tests/no-unsafe-takeuntil.test.ts b/src/converters/lintConfigs/rules/ruleConverters/eslint-plugin-rxjs/tests/no-unsafe-takeuntil.test.ts
new file mode 100644
index 0000000..2c27df5
--- /dev/null
+++ b/src/converters/lintConfigs/rules/ruleConverters/eslint-plugin-rxjs/tests/no-unsafe-takeuntil.test.ts
@@ -0,0 +1,50 @@
+import { convertNoUnsafeTakeUntil } from "../no-unsafe-takeuntil";
+
+describe(convertNoUnsafeTakeUntil, () => {
+    test("conversion without arguments", () => {
+        const result = convertNoUnsafeTakeUntil({
+            ruleArguments: [],
+        });
+
+        expect(result).toEqual({
+            rules: [
+                {
+                    ruleName: "rxjs/no-unsafe-takeuntil",
+                },
+            ],
+            plugins: ["eslint-plugin-rxjs"],
+        });
+    });
+
+    test("conversion with alias argument", () => {
+        const result = convertNoUnsafeTakeUntil({
+            ruleArguments: [{ alias: ["untilDestroyed"] }],
+        });
+
+        expect(result).toEqual({
+            rules: [
+                {
+                    ruleName: "rxjs/no-unsafe-takeuntil",
+                    ruleArguments: [{ alias: ["untilDestroyed"] }],
+                },
+            ],
+            plugins: ["eslint-plugin-rxjs"],
+        });
+    });
+
+    test("conversion with allow argument", () => {
+        const result = convertNoUnsafeTakeUntil({
+            ruleArguments: [{ allow: ["shareReplay", "share"] }],
+        });
+
+        expect(result).toEqual({
+            rules: [
+                {
+                    ruleName: "rxjs/no-unsafe-takeuntil",
+                    ruleArguments: [{ allow: ["shareReplay", "share"] }],
+                },
+            ],
+            plugins: ["eslint-plugin-rxjs"],
+        });
+    });
+});