@darraghor/eslint-plugin-nestjs-typed 3.18.0 → 3.19.0

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/README.md CHANGED
@@ -44,6 +44,7 @@ Preventing bugs
44
44
  Security
45
45
 
46
46
  - should-specify-forbid-unknown-values
47
+ - api-methods-should-be-guarded
47
48
 
48
49
  ## Why use this package?
49
50
 
@@ -738,3 +739,72 @@ class TestClass {
738
739
  thisIsAProp!: string;
739
740
  }
740
741
  ```
742
+
743
+ ### Rule: api-methods-should-be-guarded
744
+
745
+ If you require authentication, and don't use a global guard, you should be explicit about how each controller or endpoint is protected, and a UseGuards annotation should cover each.
746
+
747
+ NOTE: This rule is context-dependent (i.e. it'll generate useless noise if you've got a global guard) and so is OFF by default. It will need manually enabling in the rules section of your eslint config with `"@darraghor/nestjs-typed/api-methods-should-be-guarded": "error"`.
748
+
749
+ This PASSES - endpoint is protected by an AuthGuard
750
+
751
+ ```ts
752
+ class TestClass {
753
+ @Get()
754
+ @UseGuards(AuthGuard('jwt'))
755
+ public getAll(): Promise<string[]> {
756
+ return [];
757
+ }
758
+ }`
759
+ ```
760
+
761
+ This PASSES - entire controller is protected by an AuthGuard
762
+
763
+ ```ts
764
+ @UseGuards(AuthGuard('jwt'))
765
+ class TestClass {
766
+
767
+ @Get()
768
+ public getAll(): Promise<string[]> {
769
+ return [];
770
+ }
771
+
772
+ @Get()
773
+ public getOne(): Promise<string> {
774
+ return "1";
775
+ }
776
+ }
777
+ ```
778
+
779
+ This PASSES - endpoint is protected by a custom Guard
780
+
781
+ ```ts
782
+ class TestClass {
783
+ @Post()
784
+ @UseGuards(MyCustomGuard('hand-gestures'))
785
+ public getAll(): Promise<string[]> {
786
+ return [];
787
+ }
788
+ }
789
+ ```
790
+
791
+ This PASSES - it isn't a controller or an endpoint
792
+
793
+ ```ts
794
+ class TestClass {
795
+ public getAll(): Promise<string[]> {
796
+ return [];
797
+ }
798
+ }
799
+ ```
800
+
801
+ This FAILS - neither the controller nor the endpoint is protected with a guard
802
+
803
+ ```ts
804
+ class TestClass {
805
+ @Get()
806
+ public getAll(): Promise<string[]> {
807
+ return [];
808
+ }
809
+ }
810
+ ```
@@ -21,6 +21,7 @@ declare const allConfigs: {
21
21
  "@darraghor/nestjs-typed/validate-nested-of-array-should-set-each": string;
22
22
  "@darraghor/nestjs-typed/all-properties-are-whitelisted": string;
23
23
  "@darraghor/nestjs-typed/all-properties-have-explicit-defined": string;
24
+ "@darraghor/nestjs-typed/api-methods-should-be-guarded": string;
24
25
  };
25
26
  };
26
27
  "no-swagger": {
@@ -20,6 +20,7 @@ declare const _default: {
20
20
  "@darraghor/nestjs-typed/validate-nested-of-array-should-set-each": string;
21
21
  "@darraghor/nestjs-typed/all-properties-are-whitelisted": string;
22
22
  "@darraghor/nestjs-typed/all-properties-have-explicit-defined": string;
23
+ "@darraghor/nestjs-typed/api-methods-should-be-guarded": string;
23
24
  };
24
25
  };
25
26
  export = _default;
@@ -22,6 +22,7 @@ module.exports = {
22
22
  "@darraghor/nestjs-typed/validate-nested-of-array-should-set-each": "error",
23
23
  "@darraghor/nestjs-typed/all-properties-are-whitelisted": "error",
24
24
  "@darraghor/nestjs-typed/all-properties-have-explicit-defined": "error",
25
+ "@darraghor/nestjs-typed/api-methods-should-be-guarded": "off",
25
26
  },
26
27
  };
27
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVjb21tZW5kZWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY29uZmlncy9yZWNvbW1lbmRlZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsaUJBQVM7SUFDTCxNQUFNLEVBQUUsMkJBQTJCO0lBQ25DLGFBQWEsRUFBRSxFQUFDLFVBQVUsRUFBRSxRQUFRLEVBQUM7SUFDckMsS0FBSyxFQUFFO1FBQ0gsMkVBQTJFLEVBQ3ZFLE9BQU87UUFDWCx1REFBdUQsRUFBRTtZQUNyRCxPQUFPO1lBQ1A7Z0JBQ0ksR0FBRyxFQUFFLENBQUMsYUFBYSxDQUFDO2dCQUNwQixlQUFlLEVBQUUsQ0FBQyxjQUFjLEVBQUUsUUFBUSxFQUFFLFFBQVEsQ0FBQzthQUN4RDtTQUNKO1FBQ0QsbUVBQW1FLEVBQy9ELE9BQU87UUFDWCxnRUFBZ0UsRUFDNUQsT0FBTztRQUNYLDREQUE0RCxFQUFFLE9BQU87UUFDckUsMERBQTBELEVBQUUsT0FBTztRQUNuRSx1RUFBdUUsRUFDbkUsT0FBTztRQUNYLDhEQUE4RCxFQUFFLE9BQU87UUFDdkUsa0VBQWtFLEVBQzlELE9BQU87UUFDWCwrRUFBK0UsRUFDM0UsT0FBTztRQUNYLGtFQUFrRSxFQUM5RCxPQUFPO1FBQ1gsd0RBQXdELEVBQUUsT0FBTztRQUNqRSw4REFBOEQsRUFBRSxPQUFPO0tBQzFFO0NBQ0osQ0FBQyJ9
28
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVjb21tZW5kZWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY29uZmlncy9yZWNvbW1lbmRlZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsaUJBQVM7SUFDTCxNQUFNLEVBQUUsMkJBQTJCO0lBQ25DLGFBQWEsRUFBRSxFQUFDLFVBQVUsRUFBRSxRQUFRLEVBQUM7SUFDckMsS0FBSyxFQUFFO1FBQ0gsMkVBQTJFLEVBQ3ZFLE9BQU87UUFDWCx1REFBdUQsRUFBRTtZQUNyRCxPQUFPO1lBQ1A7Z0JBQ0ksR0FBRyxFQUFFLENBQUMsYUFBYSxDQUFDO2dCQUNwQixlQUFlLEVBQUUsQ0FBQyxjQUFjLEVBQUUsUUFBUSxFQUFFLFFBQVEsQ0FBQzthQUN4RDtTQUNKO1FBQ0QsbUVBQW1FLEVBQy9ELE9BQU87UUFDWCxnRUFBZ0UsRUFDNUQsT0FBTztRQUNYLDREQUE0RCxFQUFFLE9BQU87UUFDckUsMERBQTBELEVBQUUsT0FBTztRQUNuRSx1RUFBdUUsRUFDbkUsT0FBTztRQUNYLDhEQUE4RCxFQUFFLE9BQU87UUFDdkUsa0VBQWtFLEVBQzlELE9BQU87UUFDWCwrRUFBK0UsRUFDM0UsT0FBTztRQUNYLGtFQUFrRSxFQUM5RCxPQUFPO1FBQ1gsd0RBQXdELEVBQUUsT0FBTztRQUNqRSw4REFBOEQsRUFBRSxPQUFPO1FBQ3ZFLHVEQUF1RCxFQUFFLEtBQUs7S0FDakU7Q0FDSixDQUFDIn0=
package/dist/index.d.ts CHANGED
@@ -44,6 +44,9 @@ declare const configuration: {
44
44
  "all-properties-are-whitelisted": import("@typescript-eslint/utils/dist/ts-eslint/Rule").RuleModule<"missing-property-decorator", never[], {
45
45
  ClassDeclaration(node: import("@typescript-eslint/types/dist/generated/ast-spec").ClassDeclaration): void;
46
46
  }>;
47
+ "api-methods-should-be-guarded": import("@typescript-eslint/utils/dist/ts-eslint/Rule").RuleModule<"apiMethodsShouldBeGuarded", never[], {
48
+ MethodDefinition(node: import("@typescript-eslint/types/dist/generated/ast-spec").MethodDefinition): void;
49
+ }>;
47
50
  };
48
51
  configs: {
49
52
  recommended: {
@@ -68,6 +71,7 @@ declare const configuration: {
68
71
  "@darraghor/nestjs-typed/validate-nested-of-array-should-set-each": string;
69
72
  "@darraghor/nestjs-typed/all-properties-are-whitelisted": string;
70
73
  "@darraghor/nestjs-typed/all-properties-have-explicit-defined": string;
74
+ "@darraghor/nestjs-typed/api-methods-should-be-guarded": string;
71
75
  };
72
76
  };
73
77
  "no-swagger": {
@@ -0,0 +1,6 @@
1
+ import { TSESTree, TSESLint } from "@typescript-eslint/utils";
2
+ export declare const apiMethodsShouldBeGuarded: (node: TSESTree.MethodDefinition) => boolean;
3
+ declare const rule: TSESLint.RuleModule<"apiMethodsShouldBeGuarded", never[], {
4
+ MethodDefinition(node: TSESTree.MethodDefinition): void;
5
+ }>;
6
+ export default rule;
@@ -0,0 +1,58 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.apiMethodsShouldBeGuarded = void 0;
4
+ const createRule_1 = require("../../utils/createRule");
5
+ const typedTokenHelpers_1 = require("../../utils/typedTokenHelpers");
6
+ const apiMethodsShouldBeGuarded = (node) => {
7
+ const hasApiMethodDecorator = typedTokenHelpers_1.typedTokenHelpers.nodeHasDecoratorsNamed(node, ["Get", "Post", "Put", "Delete", "Patch", "Options", "Head", "All"]);
8
+ const hasUseGuardsDecorator = typedTokenHelpers_1.typedTokenHelpers.nodeHasDecoratorsNamed(node, ["UseGuards"]);
9
+ function findClassDeclaration(node) {
10
+ if (node.type === "ClassDeclaration") {
11
+ return node;
12
+ }
13
+ if (node.parent) {
14
+ return findClassDeclaration(node.parent);
15
+ }
16
+ return null;
17
+ }
18
+ const classNode = findClassDeclaration(node);
19
+ const hasUseGuardsDecoratorOnController = classNode
20
+ ? typedTokenHelpers_1.typedTokenHelpers.nodeHasDecoratorsNamed(classNode, ["UseGuards"])
21
+ : false;
22
+ return (hasApiMethodDecorator &&
23
+ !hasUseGuardsDecorator &&
24
+ !hasUseGuardsDecoratorOnController);
25
+ };
26
+ exports.apiMethodsShouldBeGuarded = apiMethodsShouldBeGuarded;
27
+ const rule = (0, createRule_1.createRule)({
28
+ name: "api-methods-should-be-guarded",
29
+ meta: {
30
+ docs: {
31
+ description: "Endpoints should have authentication guards to maintain our security model.",
32
+ recommended: false,
33
+ requiresTypeChecking: false,
34
+ },
35
+ messages: {
36
+ apiMethodsShouldBeGuarded: "All controller endpoints should have @UseGuards decorators, or one decorating the root of the Controller.",
37
+ },
38
+ schema: [],
39
+ hasSuggestions: false,
40
+ type: "suggestion",
41
+ },
42
+ defaultOptions: [],
43
+ create(context) {
44
+ return {
45
+ // eslint-disable-next-line @typescript-eslint/naming-convention
46
+ MethodDefinition(node) {
47
+ if ((0, exports.apiMethodsShouldBeGuarded)(node)) {
48
+ context.report({
49
+ node: node,
50
+ messageId: "apiMethodsShouldBeGuarded",
51
+ });
52
+ }
53
+ },
54
+ };
55
+ },
56
+ });
57
+ exports.default = rule;
58
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBpTWV0aG9kc1Nob3VsZEJlR3VhcmRlZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9ydWxlcy9hcGlNZXRob2RzU2hvdWxkQmVHdWFyZGVkL2FwaU1ldGhvZHNTaG91bGRCZUd1YXJkZWQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQ0EsdURBQWtEO0FBQ2xELHFFQUFnRTtBQUV6RCxNQUFNLHlCQUF5QixHQUFHLENBQUMsSUFBK0IsRUFBRSxFQUFFO0lBQ3pFLE1BQU0scUJBQXFCLEdBQUcscUNBQWlCLENBQUMsc0JBQXNCLENBQ2xFLElBQUksRUFDSixDQUFDLEtBQUssRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FDdEUsQ0FBQztJQUVGLE1BQU0scUJBQXFCLEdBQUcscUNBQWlCLENBQUMsc0JBQXNCLENBQ2xFLElBQUksRUFDSixDQUFDLFdBQVcsQ0FBQyxDQUNoQixDQUFDO0lBRUYsU0FBUyxvQkFBb0IsQ0FDekIsSUFBbUI7UUFFbkIsSUFBSSxJQUFJLENBQUMsSUFBSSxLQUFLLGtCQUFrQixFQUFFO1lBQ2xDLE9BQU8sSUFBSSxDQUFDO1NBQ2Y7UUFDRCxJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUU7WUFDYixPQUFPLG9CQUFvQixDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztTQUM1QztRQUNELE9BQU8sSUFBSSxDQUFDO0lBQ2hCLENBQUM7SUFFRCxNQUFNLFNBQVMsR0FBRyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUU3QyxNQUFNLGlDQUFpQyxHQUFHLFNBQVM7UUFDL0MsQ0FBQyxDQUFDLHFDQUFpQixDQUFDLHNCQUFzQixDQUFDLFNBQVMsRUFBRSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQ3BFLENBQUMsQ0FBQyxLQUFLLENBQUM7SUFFWixPQUFPLENBQ0gscUJBQXFCO1FBQ3JCLENBQUMscUJBQXFCO1FBQ3RCLENBQUMsaUNBQWlDLENBQ3JDLENBQUM7QUFDTixDQUFDLENBQUM7QUFsQ1csUUFBQSx5QkFBeUIsNkJBa0NwQztBQUVGLE1BQU0sSUFBSSxHQUFHLElBQUEsdUJBQVUsRUFBQztJQUNwQixJQUFJLEVBQUUsK0JBQStCO0lBQ3JDLElBQUksRUFBRTtRQUNGLElBQUksRUFBRTtZQUNGLFdBQVcsRUFDUCw2RUFBNkU7WUFDakYsV0FBVyxFQUFFLEtBQUs7WUFDbEIsb0JBQW9CLEVBQUUsS0FBSztTQUM5QjtRQUNELFFBQVEsRUFBRTtZQUNOLHlCQUF5QixFQUNyQiwyR0FBMkc7U0FDbEg7UUFDRCxNQUFNLEVBQUUsRUFBRTtRQUNWLGNBQWMsRUFBRSxLQUFLO1FBQ3JCLElBQUksRUFBRSxZQUFZO0tBQ3JCO0lBQ0QsY0FBYyxFQUFFLEVBQUU7SUFDbEIsTUFBTSxDQUNGLE9BRUM7UUFFRCxPQUFPO1lBQ0gsZ0VBQWdFO1lBQ2hFLGdCQUFnQixDQUFDLElBQStCO2dCQUM1QyxJQUFJLElBQUEsaUNBQXlCLEVBQUMsSUFBSSxDQUFDLEVBQUU7b0JBQ2pDLE9BQU8sQ0FBQyxNQUFNLENBQUM7d0JBQ1gsSUFBSSxFQUFFLElBQUk7d0JBQ1YsU0FBUyxFQUFFLDJCQUEyQjtxQkFDekMsQ0FBQyxDQUFDO2lCQUNOO1lBQ0wsQ0FBQztTQUNKLENBQUM7SUFDTixDQUFDO0NBQ0osQ0FBQyxDQUFDO0FBRUgsa0JBQWUsSUFBSSxDQUFDIn0=
@@ -43,5 +43,8 @@ declare const allRules: {
43
43
  "all-properties-are-whitelisted": import("@typescript-eslint/utils/dist/ts-eslint/Rule").RuleModule<"missing-property-decorator", never[], {
44
44
  ClassDeclaration(node: import("@typescript-eslint/types/dist/generated/ast-spec").ClassDeclaration): void;
45
45
  }>;
46
+ "api-methods-should-be-guarded": import("@typescript-eslint/utils/dist/ts-eslint/Rule").RuleModule<"apiMethodsShouldBeGuarded", never[], {
47
+ MethodDefinition(node: import("@typescript-eslint/types/dist/generated/ast-spec").MethodDefinition): void;
48
+ }>;
46
49
  };
47
50
  export default allRules;
@@ -16,6 +16,7 @@ const validateNonPrimitiveNeedsDecorators_1 = __importDefault(require("./validat
16
16
  const validateNestedOfArrayShouldSetEach_1 = __importDefault(require("./validateNestedOfArrayShouldSetEach/validateNestedOfArrayShouldSetEach"));
17
17
  const allPropertiesAreWhitelisted_1 = __importDefault(require("./allPropertiesAreWhitelisted/allPropertiesAreWhitelisted"));
18
18
  const allPropertiesHaveExplicitDefined_1 = __importDefault(require("./allPropertiesHaveExplicitDefined/allPropertiesHaveExplicitDefined"));
19
+ const apiMethodsShouldBeGuarded_1 = __importDefault(require("./apiMethodsShouldBeGuarded/apiMethodsShouldBeGuarded"));
19
20
  const allRules = {
20
21
  "all-properties-have-explicit-defined": allPropertiesHaveExplicitDefined_1.default,
21
22
  "api-property-matches-property-optionality": apiPropertyMatchesPropertyOptionality_1.default,
@@ -30,6 +31,7 @@ const allRules = {
30
31
  "validated-non-primitive-property-needs-type-decorator": validateNonPrimitiveNeedsDecorators_1.default,
31
32
  "validate-nested-of-array-should-set-each": validateNestedOfArrayShouldSetEach_1.default,
32
33
  "all-properties-are-whitelisted": allPropertiesAreWhitelisted_1.default,
34
+ "api-methods-should-be-guarded": apiMethodsShouldBeGuarded_1.default,
33
35
  };
34
36
  exports.default = allRules;
35
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcnVsZXMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSwwSEFBa0c7QUFDbEcsaUpBQW1JO0FBQ25JLDBKQUFrSTtBQUNsSSxrSUFBMEc7QUFDMUcsaUpBQXlIO0FBQ3pILCtIQUF1RztBQUN2RyxnS0FBd0k7QUFDeEksbUpBQXVIO0FBQ3ZILG9KQUFnSTtBQUNoSSx1SkFBK0g7QUFDL0gsaUpBQXlIO0FBQ3pILDRIQUFvRztBQUNwRywySUFBbUg7QUFFbkgsTUFBTSxRQUFRLEdBQUc7SUFDYixzQ0FBc0MsRUFBRSwwQ0FBZ0M7SUFDeEUsMkNBQTJDLEVBQ3ZDLCtDQUFxQztJQUN6QywrQkFBK0IsRUFBRSxvQ0FBMEI7SUFDM0QsbURBQW1ELEVBQy9DLDRDQUE0QztJQUNoRCxvQ0FBb0MsRUFBRSx1Q0FBNkI7SUFDbkUsd0NBQXdDLEVBQ3BDLDRDQUFrQztJQUN0QyxrQ0FBa0MsRUFBRSxzQ0FBNEI7SUFDaEUsK0NBQStDLEVBQzNDLGlEQUF1QztJQUMzQyxzQ0FBc0MsRUFBRSw4Q0FBZ0M7SUFDeEUsMENBQTBDLEVBQ3RDLDZDQUF1QztJQUMzQyx1REFBdUQsRUFDbkQsNkNBQW1DO0lBQ3ZDLDBDQUEwQyxFQUN0Qyw0Q0FBa0M7SUFDdEMsZ0NBQWdDLEVBQUUscUNBQTJCO0NBQ2hFLENBQUM7QUFFRixrQkFBZSxRQUFRLENBQUMifQ==
37
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcnVsZXMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSwwSEFBa0c7QUFDbEcsaUpBQW1JO0FBQ25JLDBKQUFrSTtBQUNsSSxrSUFBMEc7QUFDMUcsaUpBQXlIO0FBQ3pILCtIQUF1RztBQUN2RyxnS0FBd0k7QUFDeEksbUpBQXVIO0FBQ3ZILG9KQUFnSTtBQUNoSSx1SkFBK0g7QUFDL0gsaUpBQXlIO0FBQ3pILDRIQUFvRztBQUNwRywySUFBbUg7QUFDbkgsc0hBQThGO0FBRTlGLE1BQU0sUUFBUSxHQUFHO0lBQ2Isc0NBQXNDLEVBQUUsMENBQWdDO0lBQ3hFLDJDQUEyQyxFQUN2QywrQ0FBcUM7SUFDekMsK0JBQStCLEVBQUUsb0NBQTBCO0lBQzNELG1EQUFtRCxFQUMvQyw0Q0FBNEM7SUFDaEQsb0NBQW9DLEVBQUUsdUNBQTZCO0lBQ25FLHdDQUF3QyxFQUNwQyw0Q0FBa0M7SUFDdEMsa0NBQWtDLEVBQUUsc0NBQTRCO0lBQ2hFLCtDQUErQyxFQUMzQyxpREFBdUM7SUFDM0Msc0NBQXNDLEVBQUUsOENBQWdDO0lBQ3hFLDBDQUEwQyxFQUN0Qyw2Q0FBdUM7SUFDM0MsdURBQXVELEVBQ25ELDZDQUFtQztJQUN2QywwQ0FBMEMsRUFDdEMsNENBQWtDO0lBQ3RDLGdDQUFnQyxFQUFFLHFDQUEyQjtJQUM3RCwrQkFBK0IsRUFBRSxtQ0FBeUI7Q0FDN0QsQ0FBQztBQUVGLGtCQUFlLFFBQVEsQ0FBQyJ9
package/package.json CHANGED
@@ -1,13 +1,13 @@
1
1
  {
2
2
  "name": "@darraghor/eslint-plugin-nestjs-typed",
3
- "version": "3.18.0",
3
+ "version": "3.19.0",
4
4
  "description": "Eslint rules for nestjs projects",
5
5
  "scripts": {
6
6
  "clean": "rm -Rf ./dist/",
7
7
  "build:ci": "npm run build",
8
8
  "build": "npm run clean && mkdir ./dist && tsc --project tsconfig.build.json",
9
9
  "lint": "npx eslint -c .eslintrc.js --ext .ts './src/**/*.ts' './tests/**/*.ts' --no-error-on-unmatched-pattern",
10
- "test": "export NODE_OPTIONS=\"--max-old-space-size=8192\" && npx jest --runInBand --color --reporters=default --no-cache --coverage=false --silent=false -c jest.config.ts",
10
+ "test": "export NODE_OPTIONS=\"--max-old-space-size=8192\" && npx jest --runInBand --colors --reporters=default --no-cache --coverage=false --silent=false -c jest.config.ts",
11
11
  "pre-commit": "npx lint-staged",
12
12
  "prettier": "prettier --write src/*",
13
13
  "prepare": "husky install",