@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 +70 -0
- package/dist/configs/index.d.ts +1 -0
- package/dist/configs/recommended.d.ts +1 -0
- package/dist/configs/recommended.js +2 -1
- package/dist/index.d.ts +4 -0
- package/dist/rules/apiMethodsShouldBeGuarded/apiMethodsShouldBeGuarded.d.ts +6 -0
- package/dist/rules/apiMethodsShouldBeGuarded/apiMethodsShouldBeGuarded.js +58 -0
- package/dist/rules/index.d.ts +3 -0
- package/dist/rules/index.js +3 -1
- package/package.json +2 -2
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
|
+
```
|
package/dist/configs/index.d.ts
CHANGED
|
@@ -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,
|
|
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=
|
package/dist/rules/index.d.ts
CHANGED
|
@@ -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;
|
package/dist/rules/index.js
CHANGED
|
@@ -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,
|
|
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.
|
|
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 --
|
|
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",
|