Skip to content

Commit

Permalink
feat(prefer-observer): added auto-fix and suggestions (#92)
Browse files Browse the repository at this point in the history
  • Loading branch information
benlesh committed Jan 6, 2022
1 parent 8332e6c commit d40b0a0
Show file tree
Hide file tree
Showing 2 changed files with 551 additions and 7 deletions.
74 changes: 71 additions & 3 deletions source/rules/prefer-observer.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,10 @@
* can be found in the LICENSE file at https://github.com/cartant/eslint-plugin-rxjs
*/

import { TSESTree as es } from "@typescript-eslint/experimental-utils";
import {
TSESTree as es,
TSESLint as eslint,
} from "@typescript-eslint/experimental-utils";
import {
getTypeServices,
isArrowFunctionExpression,
Expand All @@ -24,8 +27,8 @@ const rule = ruleCreator({
"Forbids the passing separate handlers to `subscribe` and `tap`.",
recommended: false,
},
fixable: undefined,
hasSuggestions: false,
fixable: "code",
hasSuggestions: true,
messages: {
forbidden:
"Passing separate handlers is forbidden; pass an observer instead.",
Expand All @@ -51,10 +54,64 @@ const rule = ruleCreator({
if (isMemberExpression(callee) && !couldBeObservable(callee.object)) {
return;
}

function* fix(fixer: eslint.RuleFixer) {
const sourceCode = context.getSourceCode();
const [nextArg, errorArg, completeArg] = args;
const nextArgText = nextArg ? sourceCode.getText(nextArg) : "";
const errorArgText = errorArg ? sourceCode.getText(errorArg) : "";
const completeArgText = completeArg
? sourceCode.getText(completeArg)
: "";
let observer = "{";
if (
nextArgText &&
nextArgText !== "undefined" &&
nextArgText !== "null"
) {
observer += ` next: ${nextArgText}${
isValidArgText(errorArgText) || isValidArgText(completeArgText)
? ","
: ""
}`;
}
if (
errorArgText &&
errorArgText !== "undefined" &&
errorArgText !== "null"
) {
observer += ` error: ${errorArgText}${
isValidArgText(completeArgText) ? "," : ""
}`;
}
if (
completeArgText &&
completeArgText !== "undefined" &&
completeArgText !== "null"
) {
observer += ` complete: ${completeArgText}`;
}
observer += " }";

yield fixer.replaceText(callExpression.arguments[0], observer);

const [, start] = callExpression.arguments[0].range;
const [, end] =
callExpression.arguments[callExpression.arguments.length - 1].range;
yield fixer.removeRange([start, end]);
}

if (args.length > 1) {
context.report({
messageId: "forbidden",
node: reportNode,
fix,
suggest: [
{
messageId: "forbidden",
fix,
},
],
});
} else if (args.length === 1 && !allowNext) {
const [arg] = args;
Expand All @@ -66,6 +123,13 @@ const rule = ruleCreator({
context.report({
messageId: "forbidden",
node: reportNode,
fix,
suggest: [
{
messageId: "forbidden",
fix,
},
],
});
}
}
Expand All @@ -82,3 +146,7 @@ const rule = ruleCreator({
});

export = rule;

function isValidArgText(argText: string) {
return argText && argText !== "undefined" && argText !== "null";
}
Loading

0 comments on commit d40b0a0

Please sign in to comment.