@darraghor/eslint-plugin-nestjs-typed 6.7.3 → 6.8.1

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/dist/index.d.ts CHANGED
@@ -22,7 +22,7 @@ declare const classicPlugin: {
22
22
  "no-duplicate-decorators": TSESLint.RuleModule<"noDuplicateDecorators", import("./rules/noDuplicateDecorators/noDuplicateDecorators.js").NoDuplicateDecoratorsOptions, unknown, TSESLint.RuleListener>;
23
23
  "provided-injected-should-match-factory-parameters": TSESLint.RuleModule<"mainMessage", [], unknown, TSESLint.RuleListener>;
24
24
  "controllers-should-supply-api-tags": TSESLint.RuleModule<"shouldUseApiTagDecorator", [], unknown, TSESLint.RuleListener>;
25
- "api-method-should-specify-api-response": TSESLint.RuleModule<"shouldSpecifyApiResponse", [], unknown, TSESLint.RuleListener>;
25
+ "api-method-should-specify-api-response": TSESLint.RuleModule<"shouldSpecifyApiResponse", import("./rules/apiMethodsShouldSpecifyApiResponse/apiMethodsShouldSpecifyApiResponse.js").ApiMethodShouldSpecifyApiResponseOptions, unknown, TSESLint.RuleListener>;
26
26
  "api-method-should-specify-api-operation": TSESLint.RuleModule<"shouldSpecifyApiOperation", [], unknown, TSESLint.RuleListener>;
27
27
  "api-enum-property-best-practices": TSESLint.RuleModule<"needsEnumNameAdded" | "needsTypeRemoved" | "enumNameShouldMatchType", [], unknown, TSESLint.RuleListener>;
28
28
  "api-property-returning-array-should-set-array": TSESLint.RuleModule<"shouldSetArrayPropertyTrue" | "shouldSetArrayPropertyFalse", [], unknown, TSESLint.RuleListener>;
@@ -1,4 +1,9 @@
1
1
  import { TSESTree } from "@typescript-eslint/utils";
2
- export declare const shouldUseApiResponseDecorator: (node: TSESTree.MethodDefinition) => boolean;
3
- declare const rule: import("@typescript-eslint/utils/ts-eslint").RuleModule<"shouldSpecifyApiResponse", [], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener>;
2
+ export type ApiMethodShouldSpecifyApiResponseOptions = [
3
+ {
4
+ additionalCustomApiResponseDecorators: string[];
5
+ }
6
+ ];
7
+ export declare const shouldUseApiResponseDecorator: (node: TSESTree.MethodDefinition, options: ApiMethodShouldSpecifyApiResponseOptions[0]) => boolean;
8
+ declare const rule: import("@typescript-eslint/utils/ts-eslint").RuleModule<"shouldSpecifyApiResponse", ApiMethodShouldSpecifyApiResponseOptions, unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener>;
4
9
  export default rule;
@@ -1,6 +1,6 @@
1
1
  import { createRule } from "../../utils/createRule.js";
2
2
  import { typedTokenHelpers } from "../../utils/typedTokenHelpers.js";
3
- export const shouldUseApiResponseDecorator = (node) => {
3
+ export const shouldUseApiResponseDecorator = (node, options) => {
4
4
  const hasApiMethodDecorator = typedTokenHelpers.nodeHasDecoratorsNamed(node, ["Get", "Post", "Put", "Delete", "Patch", "Options", "Head", "All"]);
5
5
  const hasApiResponseDecorator = typedTokenHelpers.nodeHasDecoratorsNamed(node, [
6
6
  "ApiResponse",
@@ -31,6 +31,7 @@ export const shouldUseApiResponseDecorator = (node) => {
31
31
  "ApiUnsupportedMediaTypeResponse",
32
32
  "ApiDefaultResponse",
33
33
  ]);
34
+ const hasCustomApiResponseDecorator = typedTokenHelpers.nodeHasDecoratorsNamed(node, options.additionalCustomApiResponseDecorators);
34
35
  // check if the containing class has ApiExcludeController decorator
35
36
  const containingClass = node.parent?.parent;
36
37
  const hasApiExcludeControllerDecorator = typedTokenHelpers.nodeHasDecoratorsNamed(containingClass, [
@@ -38,7 +39,8 @@ export const shouldUseApiResponseDecorator = (node) => {
38
39
  ]);
39
40
  return (hasApiMethodDecorator &&
40
41
  !hasApiResponseDecorator &&
41
- !hasApiExcludeControllerDecorator);
42
+ !hasApiExcludeControllerDecorator &&
43
+ !hasCustomApiResponseDecorator);
42
44
  };
43
45
  const rule = createRule({
44
46
  name: "api-method-should-specify-api-response",
@@ -49,15 +51,38 @@ const rule = createRule({
49
51
  messages: {
50
52
  shouldSpecifyApiResponse: `A method decorated with @Get, @Post etc. should specify the expected ApiResponse e.g. @ApiOkResponse(type: MyType). These decorators are in the @nestjs/swagger npm package.`,
51
53
  },
52
- schema: [],
54
+ schema: [
55
+ {
56
+ type: "object",
57
+ properties: {
58
+ additionalCustomApiResponseDecorators: {
59
+ description: "A list of custom api response decorators that this rule will use to validate",
60
+ type: "array",
61
+ minItems: 0,
62
+ items: {
63
+ type: "string",
64
+ minLength: 1,
65
+ },
66
+ },
67
+ },
68
+ },
69
+ ],
53
70
  hasSuggestions: false,
54
71
  type: "suggestion",
55
72
  },
56
- defaultOptions: [],
73
+ defaultOptions: [
74
+ { additionalCustomApiResponseDecorators: new Array() },
75
+ ],
57
76
  create(context) {
77
+ const { additionalCustomApiResponseDecorators } = context.options[0] ||
78
+ {
79
+ additionalCustomApiResponseDecorators: [],
80
+ };
58
81
  return {
59
82
  MethodDefinition(node) {
60
- if (shouldUseApiResponseDecorator(node)) {
83
+ if (shouldUseApiResponseDecorator(node, {
84
+ additionalCustomApiResponseDecorators,
85
+ })) {
61
86
  context.report({
62
87
  node: node,
63
88
  messageId: "shouldSpecifyApiResponse",
@@ -68,4 +93,4 @@ const rule = createRule({
68
93
  },
69
94
  });
70
95
  export default rule;
71
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBpTWV0aG9kc1Nob3VsZFNwZWNpZnlBcGlSZXNwb25zZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9ydWxlcy9hcGlNZXRob2RzU2hvdWxkU3BlY2lmeUFwaVJlc3BvbnNlL2FwaU1ldGhvZHNTaG91bGRTcGVjaWZ5QXBpUmVzcG9uc2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFDLFVBQVUsRUFBQyxNQUFNLDJCQUEyQixDQUFDO0FBQ3JELE9BQU8sRUFBQyxpQkFBaUIsRUFBQyxNQUFNLGtDQUFrQyxDQUFDO0FBRW5FLE1BQU0sQ0FBQyxNQUFNLDZCQUE2QixHQUFHLENBQ3pDLElBQStCLEVBQ3hCLEVBQUU7SUFDVCxNQUFNLHFCQUFxQixHQUFHLGlCQUFpQixDQUFDLHNCQUFzQixDQUNsRSxJQUFJLEVBQ0osQ0FBQyxLQUFLLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsS0FBSyxDQUFDLENBQ3RFLENBQUM7SUFFRixNQUFNLHVCQUF1QixHQUFHLGlCQUFpQixDQUFDLHNCQUFzQixDQUNwRSxJQUFJLEVBQ0o7UUFDSSxhQUFhO1FBQ2IsZUFBZTtRQUNmLG9CQUFvQjtRQUNwQixxQkFBcUI7UUFDckIsc0JBQXNCO1FBQ3RCLDZCQUE2QjtRQUM3QixrQkFBa0I7UUFDbEIsdUJBQXVCO1FBQ3ZCLHlCQUF5QjtRQUN6Qiw0QkFBNEI7UUFDNUIscUJBQXFCO1FBQ3JCLGdDQUFnQztRQUNoQyx1QkFBdUI7UUFDdkIscUJBQXFCO1FBQ3JCLHNCQUFzQjtRQUN0QiwyQkFBMkI7UUFDM0IsaUJBQWlCO1FBQ2pCLDZCQUE2QjtRQUM3QiwwQkFBMEI7UUFDMUIsMkJBQTJCO1FBQzNCLCtCQUErQjtRQUMvQiw0QkFBNEI7UUFDNUIsMkJBQTJCO1FBQzNCLCtCQUErQjtRQUMvQixnQ0FBZ0M7UUFDaEMsaUNBQWlDO1FBQ2pDLG9CQUFvQjtLQUN2QixDQUNKLENBQUM7SUFFRixtRUFBbUU7SUFDbkUsTUFBTSxlQUFlLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxNQUFtQyxDQUFDO0lBQ3pFLE1BQU0sZ0NBQWdDLEdBQ2xDLGlCQUFpQixDQUFDLHNCQUFzQixDQUFDLGVBQWUsRUFBRTtRQUN0RCxzQkFBc0I7S0FDekIsQ0FBQyxDQUFDO0lBRVAsT0FBTyxDQUNILHFCQUFxQjtRQUNyQixDQUFDLHVCQUF1QjtRQUN4QixDQUFDLGdDQUFnQyxDQUNwQyxDQUFDO0FBQ04sQ0FBQyxDQUFDO0FBRUYsTUFBTSxJQUFJLEdBQUcsVUFBVSxDQUFpQztJQUNwRCxJQUFJLEVBQUUsd0NBQXdDO0lBQzlDLElBQUksRUFBRTtRQUNGLElBQUksRUFBRTtZQUNGLFdBQVcsRUFDUCwwSkFBMEo7U0FDaks7UUFDRCxRQUFRLEVBQUU7WUFDTix3QkFBd0IsRUFBRSw4S0FBOEs7U0FDM007UUFDRCxNQUFNLEVBQUUsRUFBRTtRQUNWLGNBQWMsRUFBRSxLQUFLO1FBQ3JCLElBQUksRUFBRSxZQUFZO0tBQ3JCO0lBQ0QsY0FBYyxFQUFFLEVBQUU7SUFFbEIsTUFBTSxDQUFDLE9BQU87UUFDVixPQUFPO1lBQ0gsZ0JBQWdCLENBQUMsSUFBK0I7Z0JBQzVDLElBQUksNkJBQTZCLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztvQkFDdEMsT0FBTyxDQUFDLE1BQU0sQ0FBQzt3QkFDWCxJQUFJLEVBQUUsSUFBSTt3QkFDVixTQUFTLEVBQUUsMEJBQTBCO3FCQUN4QyxDQUFDLENBQUM7Z0JBQ1AsQ0FBQztZQUNMLENBQUM7U0FDSixDQUFDO0lBQ04sQ0FBQztDQUNKLENBQUMsQ0FBQztBQUVILGVBQWUsSUFBSSxDQUFDIn0=
96
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBpTWV0aG9kc1Nob3VsZFNwZWNpZnlBcGlSZXNwb25zZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9ydWxlcy9hcGlNZXRob2RzU2hvdWxkU3BlY2lmeUFwaVJlc3BvbnNlL2FwaU1ldGhvZHNTaG91bGRTcGVjaWZ5QXBpUmVzcG9uc2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFDLFVBQVUsRUFBQyxNQUFNLDJCQUEyQixDQUFDO0FBQ3JELE9BQU8sRUFBQyxpQkFBaUIsRUFBQyxNQUFNLGtDQUFrQyxDQUFDO0FBUW5FLE1BQU0sQ0FBQyxNQUFNLDZCQUE2QixHQUFHLENBQ3pDLElBQStCLEVBQy9CLE9BQW9ELEVBQzdDLEVBQUU7SUFDVCxNQUFNLHFCQUFxQixHQUFHLGlCQUFpQixDQUFDLHNCQUFzQixDQUNsRSxJQUFJLEVBQ0osQ0FBQyxLQUFLLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsS0FBSyxDQUFDLENBQ3RFLENBQUM7SUFFRixNQUFNLHVCQUF1QixHQUFHLGlCQUFpQixDQUFDLHNCQUFzQixDQUNwRSxJQUFJLEVBQ0o7UUFDSSxhQUFhO1FBQ2IsZUFBZTtRQUNmLG9CQUFvQjtRQUNwQixxQkFBcUI7UUFDckIsc0JBQXNCO1FBQ3RCLDZCQUE2QjtRQUM3QixrQkFBa0I7UUFDbEIsdUJBQXVCO1FBQ3ZCLHlCQUF5QjtRQUN6Qiw0QkFBNEI7UUFDNUIscUJBQXFCO1FBQ3JCLGdDQUFnQztRQUNoQyx1QkFBdUI7UUFDdkIscUJBQXFCO1FBQ3JCLHNCQUFzQjtRQUN0QiwyQkFBMkI7UUFDM0IsaUJBQWlCO1FBQ2pCLDZCQUE2QjtRQUM3QiwwQkFBMEI7UUFDMUIsMkJBQTJCO1FBQzNCLCtCQUErQjtRQUMvQiw0QkFBNEI7UUFDNUIsMkJBQTJCO1FBQzNCLCtCQUErQjtRQUMvQixnQ0FBZ0M7UUFDaEMsaUNBQWlDO1FBQ2pDLG9CQUFvQjtLQUN2QixDQUNKLENBQUM7SUFFRixNQUFNLDZCQUE2QixHQUMvQixpQkFBaUIsQ0FBQyxzQkFBc0IsQ0FDcEMsSUFBSSxFQUNKLE9BQU8sQ0FBQyxxQ0FBcUMsQ0FDaEQsQ0FBQztJQUVOLG1FQUFtRTtJQUNuRSxNQUFNLGVBQWUsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLE1BQW1DLENBQUM7SUFDekUsTUFBTSxnQ0FBZ0MsR0FDbEMsaUJBQWlCLENBQUMsc0JBQXNCLENBQUMsZUFBZSxFQUFFO1FBQ3RELHNCQUFzQjtLQUN6QixDQUFDLENBQUM7SUFFUCxPQUFPLENBQ0gscUJBQXFCO1FBQ3JCLENBQUMsdUJBQXVCO1FBQ3hCLENBQUMsZ0NBQWdDO1FBQ2pDLENBQUMsNkJBQTZCLENBQ2pDLENBQUM7QUFDTixDQUFDLENBQUM7QUFFRixNQUFNLElBQUksR0FBRyxVQUFVLENBR3JCO0lBQ0UsSUFBSSxFQUFFLHdDQUF3QztJQUM5QyxJQUFJLEVBQUU7UUFDRixJQUFJLEVBQUU7WUFDRixXQUFXLEVBQ1AsMEpBQTBKO1NBQ2pLO1FBQ0QsUUFBUSxFQUFFO1lBQ04sd0JBQXdCLEVBQUUsOEtBQThLO1NBQzNNO1FBQ0QsTUFBTSxFQUFFO1lBQ0o7Z0JBQ0ksSUFBSSxFQUFFLFFBQVE7Z0JBQ2QsVUFBVSxFQUFFO29CQUNSLHFDQUFxQyxFQUFFO3dCQUNuQyxXQUFXLEVBQ1AsOEVBQThFO3dCQUNsRixJQUFJLEVBQUUsT0FBTzt3QkFDYixRQUFRLEVBQUUsQ0FBQzt3QkFDWCxLQUFLLEVBQUU7NEJBQ0gsSUFBSSxFQUFFLFFBQVE7NEJBQ2QsU0FBUyxFQUFFLENBQUM7eUJBQ2Y7cUJBQ0o7aUJBQ0o7YUFDSjtTQUNKO1FBQ0QsY0FBYyxFQUFFLEtBQUs7UUFDckIsSUFBSSxFQUFFLFlBQVk7S0FDckI7SUFDRCxjQUFjLEVBQUU7UUFDWixFQUFDLHFDQUFxQyxFQUFFLElBQUksS0FBSyxFQUFVLEVBQUM7S0FDL0Q7SUFFRCxNQUFNLENBQUMsT0FBTztRQUNWLE1BQU0sRUFBQyxxQ0FBcUMsRUFBQyxHQUN6QyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztZQUNqQjtnQkFDRyxxQ0FBcUMsRUFBRSxFQUFFO2FBQ1csQ0FBQztRQUU3RCxPQUFPO1lBQ0gsZ0JBQWdCLENBQUMsSUFBK0I7Z0JBQzVDLElBQ0ksNkJBQTZCLENBQUMsSUFBSSxFQUFFO29CQUNoQyxxQ0FBcUM7aUJBQ3hDLENBQUMsRUFDSixDQUFDO29CQUNDLE9BQU8sQ0FBQyxNQUFNLENBQUM7d0JBQ1gsSUFBSSxFQUFFLElBQUk7d0JBQ1YsU0FBUyxFQUFFLDBCQUEwQjtxQkFDeEMsQ0FBQyxDQUFDO2dCQUNQLENBQUM7WUFDTCxDQUFDO1NBQ0osQ0FBQztJQUNOLENBQUM7Q0FDSixDQUFDLENBQUM7QUFFSCxlQUFlLElBQUksQ0FBQyJ9
@@ -8,7 +8,7 @@ declare const allRules: {
8
8
  "no-duplicate-decorators": import("@typescript-eslint/utils/ts-eslint").RuleModule<"noDuplicateDecorators", import("./noDuplicateDecorators/noDuplicateDecorators.js").NoDuplicateDecoratorsOptions, unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener>;
9
9
  "provided-injected-should-match-factory-parameters": import("@typescript-eslint/utils/ts-eslint").RuleModule<"mainMessage", [], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener>;
10
10
  "controllers-should-supply-api-tags": import("@typescript-eslint/utils/ts-eslint").RuleModule<"shouldUseApiTagDecorator", [], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener>;
11
- "api-method-should-specify-api-response": import("@typescript-eslint/utils/ts-eslint").RuleModule<"shouldSpecifyApiResponse", [], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener>;
11
+ "api-method-should-specify-api-response": import("@typescript-eslint/utils/ts-eslint").RuleModule<"shouldSpecifyApiResponse", import("./apiMethodsShouldSpecifyApiResponse/apiMethodsShouldSpecifyApiResponse.js").ApiMethodShouldSpecifyApiResponseOptions, unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener>;
12
12
  "api-method-should-specify-api-operation": import("@typescript-eslint/utils/ts-eslint").RuleModule<"shouldSpecifyApiOperation", [], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener>;
13
13
  "api-enum-property-best-practices": import("@typescript-eslint/utils/ts-eslint").RuleModule<"needsEnumNameAdded" | "needsTypeRemoved" | "enumNameShouldMatchType", [], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener>;
14
14
  "api-property-returning-array-should-set-array": import("@typescript-eslint/utils/ts-eslint").RuleModule<"shouldSetArrayPropertyTrue" | "shouldSetArrayPropertyFalse", [], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener>;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@darraghor/eslint-plugin-nestjs-typed",
3
- "version": "6.7.3",
3
+ "version": "6.8.1",
4
4
  "description": "Eslint rules for nestjs projects",
5
5
  "scripts": {
6
6
  "clean": "rm -Rf ./dist/",
@@ -74,7 +74,7 @@
74
74
  "@semantic-release/exec": "7.1.0",
75
75
  "@types/eslint": "9.6.1",
76
76
  "@types/jest": "29.5.14",
77
- "@types/node": "22.15.35",
77
+ "@types/node": "22.18.0",
78
78
  "@typescript-eslint/eslint-plugin": "8.41.0",
79
79
  "@typescript-eslint/parser": "8.41.0",
80
80
  "@typescript-eslint/rule-tester": "8.41.0",