@clipboard-health/eslint-plugin 2.1.87 → 2.1.89

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@clipboard-health/eslint-plugin",
3
- "version": "2.1.87",
3
+ "version": "2.1.89",
4
4
  "description": "Clipboard's ESLint Plugin",
5
5
  "keywords": [
6
6
  "eslint",
@@ -1,2 +1,6 @@
1
- declare const rule: import("@typescript-eslint/utils/dist/ts-eslint").RuleModule<"missingDecorator" | "missingReturn" | "decoratorNotFromPackage" | "callNotFromPackage", [], unknown, import("@typescript-eslint/utils/dist/ts-eslint").RuleListener>;
1
+ /**
2
+ * @fileoverview Rule to require controller methods to use ts-rest as per our best practices on backend REST APIs
3
+ */
4
+ import { type TSESLint } from "@typescript-eslint/utils";
5
+ declare const rule: TSESLint.RuleModule<"missingDecorator" | "missingReturn" | "decoratorNotFromPackage" | "callNotFromPackage", [], unknown, TSESLint.RuleListener>;
2
6
  export default rule;
@@ -5,6 +5,63 @@ Object.defineProperty(exports, "__esModule", { value: true });
5
5
  */
6
6
  const utils_1 = require("@typescript-eslint/utils");
7
7
  const createRule_1 = require("../../createRule");
8
+ function validateDecorators(context, node, symbolName, decoratorImportedCorrectly) {
9
+ const decorators = node.decorators ?? [];
10
+ const hasMatchingDecorator = decorators.some((decorator) => decorator.expression.type === utils_1.AST_NODE_TYPES.CallExpression &&
11
+ decorator.expression.callee.type === utils_1.AST_NODE_TYPES.Identifier &&
12
+ decorator.expression.callee.name === "TsRestHandler");
13
+ if (!hasMatchingDecorator) {
14
+ context.report({
15
+ node,
16
+ messageId: "missingDecorator",
17
+ data: { name: symbolName },
18
+ });
19
+ }
20
+ decorators.forEach((decorator) => {
21
+ if (decorator.expression.type === utils_1.AST_NODE_TYPES.CallExpression &&
22
+ decorator.expression.callee.type === utils_1.AST_NODE_TYPES.Identifier &&
23
+ decorator.expression.callee.name === "TsRestHandler" &&
24
+ !decoratorImportedCorrectly) {
25
+ context.report({
26
+ node: decorator,
27
+ messageId: "decoratorNotFromPackage",
28
+ });
29
+ }
30
+ });
31
+ }
32
+ function validateReturnStatement(context, node, symbolName, methodImportedCorrectly) {
33
+ const body = node.value?.body;
34
+ if (body?.type !== utils_1.AST_NODE_TYPES.BlockStatement ||
35
+ body.body.length !== 1 ||
36
+ body.body[0]?.type !== utils_1.AST_NODE_TYPES.ReturnStatement) {
37
+ context.report({
38
+ node,
39
+ messageId: "missingReturn",
40
+ data: { name: symbolName },
41
+ });
42
+ return;
43
+ }
44
+ const returnValueExpr = body.body[0].argument;
45
+ if (returnValueExpr?.type !== utils_1.AST_NODE_TYPES.CallExpression ||
46
+ returnValueExpr.callee.type !== utils_1.AST_NODE_TYPES.Identifier ||
47
+ returnValueExpr.callee.name !== "tsRestHandler") {
48
+ context.report({
49
+ node,
50
+ messageId: "missingReturn",
51
+ data: { name: symbolName },
52
+ });
53
+ }
54
+ if (returnValueExpr &&
55
+ returnValueExpr?.type === utils_1.AST_NODE_TYPES.CallExpression &&
56
+ returnValueExpr.callee.type === utils_1.AST_NODE_TYPES.Identifier &&
57
+ returnValueExpr.callee.name === "tsRestHandler" &&
58
+ !methodImportedCorrectly) {
59
+ context.report({
60
+ node: returnValueExpr,
61
+ messageId: "callNotFromPackage",
62
+ });
63
+ }
64
+ }
8
65
  const rule = (0, createRule_1.createRule)({
9
66
  name: "enforce-ts-rest-in-controllers",
10
67
  defaultOptions: [],
@@ -54,73 +111,13 @@ const rule = (0, createRule_1.createRule)({
54
111
  */
55
112
  MethodDefinition(node) {
56
113
  const symbolName = (node.key.type === utils_1.AST_NODE_TYPES.Identifier && node.key.name) || "<unknown>";
57
- // Ignore this rule for constructor and private methods
58
114
  if (node.kind === "constructor" ||
59
115
  node.accessibility === "private" ||
60
116
  (node.key.type === utils_1.AST_NODE_TYPES.Identifier && node.key.name === "constructor")) {
61
117
  return;
62
118
  }
63
- // Check for use of `@TsRestHandler()` decorator and ensure it comes from `@ts-rest/nest` package
64
- const decorators = node.decorators || [];
65
- const hasMatchingDecorator = decorators.some((decorator) => decorator.expression.type === utils_1.AST_NODE_TYPES.CallExpression &&
66
- decorator.expression.callee.type === utils_1.AST_NODE_TYPES.Identifier &&
67
- decorator.expression.callee.name === "TsRestHandler");
68
- if (!hasMatchingDecorator) {
69
- context.report({
70
- node,
71
- messageId: "missingDecorator",
72
- data: {
73
- name: symbolName,
74
- },
75
- });
76
- }
77
- decorators.forEach((decorator) => {
78
- if (decorator.expression.type === utils_1.AST_NODE_TYPES.CallExpression &&
79
- decorator.expression.callee.type === utils_1.AST_NODE_TYPES.Identifier &&
80
- decorator.expression.callee.name === "TsRestHandler" &&
81
- !decoratorImportedCorrectly) {
82
- context.report({
83
- node: decorator,
84
- messageId: "decoratorNotFromPackage",
85
- });
86
- }
87
- });
88
- // Check for returning the result of `tsRestHandler()` method (without any other statement present), and ensure it comes from `@ts-rest/nest` package
89
- const body = node.value?.body;
90
- if (body?.type !== utils_1.AST_NODE_TYPES.BlockStatement ||
91
- body.body.length !== 1 ||
92
- body.body[0]?.type !== utils_1.AST_NODE_TYPES.ReturnStatement) {
93
- context.report({
94
- node,
95
- messageId: "missingReturn",
96
- data: {
97
- name: symbolName,
98
- },
99
- });
100
- return;
101
- }
102
- const returnValueExpr = body.body[0].argument;
103
- if (returnValueExpr?.type !== utils_1.AST_NODE_TYPES.CallExpression ||
104
- returnValueExpr.callee.type !== utils_1.AST_NODE_TYPES.Identifier ||
105
- returnValueExpr.callee.name !== "tsRestHandler") {
106
- context.report({
107
- node,
108
- messageId: "missingReturn",
109
- data: {
110
- name: symbolName,
111
- },
112
- });
113
- }
114
- if (returnValueExpr &&
115
- returnValueExpr?.type === utils_1.AST_NODE_TYPES.CallExpression &&
116
- returnValueExpr.callee.type === utils_1.AST_NODE_TYPES.Identifier &&
117
- returnValueExpr.callee.name === "tsRestHandler" &&
118
- !methodImportedCorrectly) {
119
- context.report({
120
- node: returnValueExpr,
121
- messageId: "callNotFromPackage",
122
- });
123
- }
119
+ validateDecorators(context, node, symbolName, decoratorImportedCorrectly);
120
+ validateReturnStatement(context, node, symbolName, methodImportedCorrectly);
124
121
  },
125
122
  };
126
123
  },
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../../packages/eslint-plugin/src/lib/rules/enforce-ts-rest-in-controllers/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../../packages/eslint-plugin/src/lib/rules/enforce-ts-rest-in-controllers/index.ts"],"names":[],"mappings":"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"}