@darraghor/eslint-plugin-nestjs-typed 3.3.0 → 3.4.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 +37 -30
- package/dist/fixtures/file.d.ts +0 -0
- package/dist/fixtures/file.js +2 -0
- package/dist/index.d.ts +3 -3
- package/dist/rules/apiEnumPropertyBestPractices/apiEnumPropertyBestPractices.d.ts +1 -1
- package/dist/rules/apiEnumPropertyBestPractices/apiEnumPropertyBestPractices.js +2 -2
- package/dist/rules/apiPropertyMatchesPropertyOptionality/apiPropertyMatchesPropertyOptionality.d.ts +1 -1
- package/dist/rules/apiPropertyMatchesPropertyOptionality/apiPropertyMatchesPropertyOptionality.js +2 -2
- package/dist/rules/apiPropertyReturningArrayShouldSetArray/apiPropertyReturningArrayShouldSetArray.d.ts +1 -1
- package/dist/rules/apiPropertyReturningArrayShouldSetArray/apiPropertyReturningArrayShouldSetArray.js +7 -16
- package/dist/rules/index.d.ts +3 -3
- package/dist/rules/paramDecoratorNameMatchesRouteParam/rule.testData.d.ts +0 -6
- package/dist/rules/paramDecoratorNameMatchesRouteParam/rule.testData.js +3 -54
- package/dist/rules/validate-non-primitves-needs-decorators/validateNonPrimitiveNeedsDecorators.d.ts +6 -0
- package/dist/rules/validate-non-primitves-needs-decorators/validateNonPrimitiveNeedsDecorators.js +54 -0
- package/dist/testing/fixtureSetup.d.ts +1 -0
- package/dist/testing/fixtureSetup.js +13 -0
- package/dist/utils/typedTokenHelpers.d.ts +8 -1
- package/dist/utils/typedTokenHelpers.js +45 -1
- package/package.json +2 -2
- package/dist/rules/apiEnumPropertyBestPractices/apiEnumPropertyBestPractices.testData.d.ts +0 -9
- package/dist/rules/apiEnumPropertyBestPractices/apiEnumPropertyBestPractices.testData.js +0 -137
- package/dist/rules/apiMethodsShouldSpecifyApiResponse/apiMethodsShouldSpecifyApiResponse.testData.d.ts +0 -5
- package/dist/rules/apiMethodsShouldSpecifyApiResponse/apiMethodsShouldSpecifyApiResponse.testData.js +0 -48
- package/dist/rules/apiPropertyMatchesPropertyOptionality/apiPropertyMatchesPropertyOptionality.testData.d.ts +0 -6
- package/dist/rules/apiPropertyMatchesPropertyOptionality/apiPropertyMatchesPropertyOptionality.testData.js +0 -55
- package/dist/rules/apiPropertyReturningArrayShouldSetArray/apiPropertyReturningArrayShouldSetArray.testData.d.ts +0 -6
- package/dist/rules/apiPropertyReturningArrayShouldSetArray/apiPropertyReturningArrayShouldSetArray.testData.js +0 -51
- package/dist/rules/controllerDecoratedHasApiTags/controllerDecoratedHasApiTags.testData.d.ts +0 -5
- package/dist/rules/controllerDecoratedHasApiTags/controllerDecoratedHasApiTags.testData.js +0 -30
- package/dist/rules/providerInjectedShouldMatchFactory/ProviderInjectedShouldMatchFactory.testData.d.ts +0 -5
- package/dist/rules/providerInjectedShouldMatchFactory/ProviderInjectedShouldMatchFactory.testData.js +0 -82
- package/dist/rules/shouldSpecifyForbidUnknownValues/rule.testData.d.ts +0 -6
- package/dist/rules/shouldSpecifyForbidUnknownValues/rule.testData.js +0 -138
package/README.md
CHANGED
|
@@ -6,6 +6,31 @@ Version 3.x supports Eslint version >=8.x and typescript eslint parser 5+
|
|
|
6
6
|
|
|
7
7
|
There were many breaking changes between these versions.
|
|
8
8
|
|
|
9
|
+
## Index of Available rules
|
|
10
|
+
|
|
11
|
+
Details for each rule are available in sections below.
|
|
12
|
+
|
|
13
|
+
Nest Modules
|
|
14
|
+
|
|
15
|
+
- provided-injected-should-match-factory-parameters
|
|
16
|
+
- injectable-should-be-provided
|
|
17
|
+
|
|
18
|
+
Nest Swagger
|
|
19
|
+
|
|
20
|
+
- api-property-matches-property-optionality
|
|
21
|
+
- controllers-should-supply-api-tags
|
|
22
|
+
- api-method-should-specify-api-response
|
|
23
|
+
- api-enum-property-best-practices
|
|
24
|
+
- api-property-returning-array-should-set-array
|
|
25
|
+
|
|
26
|
+
Preventing bugs
|
|
27
|
+
|
|
28
|
+
- param-decorator-name-matches-route-param
|
|
29
|
+
|
|
30
|
+
Security
|
|
31
|
+
|
|
32
|
+
- should-specify-forbid-unknown-values
|
|
33
|
+
|
|
9
34
|
## Why use this package?
|
|
10
35
|
|
|
11
36
|
If you use NestJs (https://nestjs.com/) then these rules will help keep you usage of decorators consistent.
|
|
@@ -22,7 +47,7 @@ In particular if you're using custom providers the errors can be really tricky t
|
|
|
22
47
|
|
|
23
48
|
These are described in the "Common Errors" section of the nest js docs.
|
|
24
49
|
|
|
25
|
-
###
|
|
50
|
+
### 1. Using Open Api / Swagger decorators and automatically generating a clients
|
|
26
51
|
|
|
27
52
|
When working with NestJS I generate my front end client and models using the swagger generated from the nest controllers and models.
|
|
28
53
|
|
|
@@ -30,34 +55,16 @@ I have a bunch of rules here that are mostly for strict typing with decorators f
|
|
|
30
55
|
|
|
31
56
|
These rules are somewhat opinionated, but necessary for clean model generation if using an Open Api model generator.
|
|
32
57
|
|
|
33
|
-
###
|
|
58
|
+
### 1. Helping prevent bugs
|
|
59
|
+
|
|
60
|
+
There are some tightly coupled but untyped decorators and things like that in nest that will catch you out if your not careful. There are some rules to help prevent issues that have caught me out before.
|
|
61
|
+
|
|
62
|
+
### 1. Security
|
|
34
63
|
|
|
35
64
|
There is a CVE for class-transformer when using random javascript objects. You need to be careful about configuring the ValidationPipe in NestJs. See
|
|
36
65
|
https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2019-18413
|
|
37
66
|
https://github.com/typestack/class-validator/issues/438
|
|
38
67
|
|
|
39
|
-
## Index of Available rules
|
|
40
|
-
|
|
41
|
-
Details for each rule are available in sections below.
|
|
42
|
-
|
|
43
|
-
Nest Modules
|
|
44
|
-
|
|
45
|
-
- provided-injected-should-match-factory-parameters
|
|
46
|
-
- injectable-should-be-provided
|
|
47
|
-
|
|
48
|
-
Nest Swagger
|
|
49
|
-
|
|
50
|
-
- api-property-matches-property-optionality
|
|
51
|
-
- controllers-should-supply-api-tags
|
|
52
|
-
- api-method-should-specify-api-response
|
|
53
|
-
- api-enum-property-best-practices
|
|
54
|
-
- api-property-returning-array-should-set-array
|
|
55
|
-
|
|
56
|
-
Security and best practices
|
|
57
|
-
|
|
58
|
-
- should-specify-forbid-unknown-values
|
|
59
|
-
- param-decorator-name-matches-route-param
|
|
60
|
-
|
|
61
68
|
## To install
|
|
62
69
|
|
|
63
70
|
```
|
|
@@ -100,7 +107,7 @@ Note: You can easily turn off all the swagger rules if you don't use swagger by
|
|
|
100
107
|
|
|
101
108
|
This rule will verify you have entered a `Param("name")` that has a matching url parameter in a controller or method decorator
|
|
102
109
|
|
|
103
|
-
e.g. this passes because the uuid param is in the `Get()`
|
|
110
|
+
e.g. this passes because the uuid param is in the `Get()` decorator
|
|
104
111
|
|
|
105
112
|
```ts
|
|
106
113
|
@Controller("custom-bot")
|
|
@@ -118,7 +125,7 @@ export class CustomBotController {
|
|
|
118
125
|
}
|
|
119
126
|
```
|
|
120
127
|
|
|
121
|
-
this passes because the uuid param is in the `Controller()`
|
|
128
|
+
this passes because the uuid param is in the `Controller()` decorator
|
|
122
129
|
|
|
123
130
|
```ts
|
|
124
131
|
@Controller("custom-bot/:uuid")
|
|
@@ -136,7 +143,7 @@ export class CustomBotController {
|
|
|
136
143
|
}
|
|
137
144
|
```
|
|
138
145
|
|
|
139
|
-
|
|
146
|
+
This fails because there is a typo in the param decorator
|
|
140
147
|
|
|
141
148
|
```ts
|
|
142
149
|
@Controller("custom-bot")
|
|
@@ -146,7 +153,7 @@ export class CustomBotController {
|
|
|
146
153
|
@Get(":uuid")
|
|
147
154
|
@ApiOkResponse({type: CustomBot})
|
|
148
155
|
findOne(
|
|
149
|
-
@Param("
|
|
156
|
+
@Param("uui") uuid: string,
|
|
150
157
|
@Request() request: RequestWithUser
|
|
151
158
|
): Promise<CustomBot> {
|
|
152
159
|
return this.customBotService.findOne(uuid, request.user.uuid);
|
|
@@ -154,7 +161,7 @@ export class CustomBotController {
|
|
|
154
161
|
}
|
|
155
162
|
```
|
|
156
163
|
|
|
157
|
-
|
|
164
|
+
this fails because you shouldn't put the `:` in the param decorator
|
|
158
165
|
|
|
159
166
|
```ts
|
|
160
167
|
@Controller("custom-bot")
|
|
@@ -164,7 +171,7 @@ export class CustomBotController {
|
|
|
164
171
|
@Get(":uuid")
|
|
165
172
|
@ApiOkResponse({type: CustomBot})
|
|
166
173
|
findOne(
|
|
167
|
-
@Param("
|
|
174
|
+
@Param(":uuid") uuid: string,
|
|
168
175
|
@Request() request: RequestWithUser
|
|
169
176
|
): Promise<CustomBot> {
|
|
170
177
|
return this.customBotService.findOne(uuid, request.user.uuid);
|
|
File without changes
|
package/dist/index.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
declare const configuration: {
|
|
2
2
|
rules: {
|
|
3
3
|
"api-property-matches-property-optionality": import("@typescript-eslint/experimental-utils/dist/ts-eslint/Rule").RuleModule<"shouldUseOptionalDecorator" | "shouldUseRequiredDecorator", never[], {
|
|
4
|
-
|
|
4
|
+
PropertyDefinition(node: import("@typescript-eslint/types/dist/ast-spec").PropertyDefinition): void;
|
|
5
5
|
}>;
|
|
6
6
|
"injectable-should-be-provided": import("@typescript-eslint/experimental-utils/dist/ts-eslint/Rule").RuleModule<"injectableInModule" | "controllersInModule", never[], {
|
|
7
7
|
ClassDeclaration(node: import("@typescript-eslint/types/dist/ast-spec").ClassDeclaration): void;
|
|
@@ -17,10 +17,10 @@ declare const configuration: {
|
|
|
17
17
|
MethodDefinition(node: import("@typescript-eslint/types/dist/ast-spec").MethodDefinition): void;
|
|
18
18
|
}>;
|
|
19
19
|
"api-enum-property-best-practices": import("@typescript-eslint/experimental-utils/dist/ts-eslint/Rule").RuleModule<"needsEnumNameAdded" | "needsTypeRemoved" | "enumNameShouldMatchType", never[], {
|
|
20
|
-
|
|
20
|
+
PropertyDefinition(node: import("@typescript-eslint/types/dist/ast-spec").Node): void;
|
|
21
21
|
}>;
|
|
22
22
|
"api-property-returning-array-should-set-array": import("@typescript-eslint/experimental-utils/dist/ts-eslint/Rule").RuleModule<"shouldSetArrayPropertyTrue" | "shouldSetArrayPropertyFalse", never[], {
|
|
23
|
-
|
|
23
|
+
PropertyDefinition: (node: import("@typescript-eslint/types/dist/ast-spec").Node) => void;
|
|
24
24
|
}>;
|
|
25
25
|
"should-specify-forbid-unknown-values": import("@typescript-eslint/experimental-utils/dist/ts-eslint/Rule").RuleModule<"shouldSpecifyForbidUnknownValues", never[], {
|
|
26
26
|
NewExpression(node: import("@typescript-eslint/types/dist/ast-spec").Node): void;
|
|
@@ -3,6 +3,6 @@ import { EnumTestResultModel } from "./enumTestResultModel";
|
|
|
3
3
|
export declare const hasEnumSpecifiedCorrectly: (node: TSESTree.Node, isEnumType: boolean) => EnumTestResultModel;
|
|
4
4
|
export declare const needsEnumNameMatchingEnumType: (enumNameProperty: TSESTree.Property, enumProperty: TSESTree.Property) => boolean;
|
|
5
5
|
declare const rule: import("@typescript-eslint/experimental-utils/dist/ts-eslint/Rule").RuleModule<"needsEnumNameAdded" | "needsTypeRemoved" | "enumNameShouldMatchType", never[], {
|
|
6
|
-
|
|
6
|
+
PropertyDefinition(node: TSESTree.Node): void;
|
|
7
7
|
}>;
|
|
8
8
|
export default rule;
|
|
@@ -105,7 +105,7 @@ const rule = (0, createRule_1.createRule)({
|
|
|
105
105
|
const typeChecker = parserServices.program.getTypeChecker();
|
|
106
106
|
return {
|
|
107
107
|
// eslint-disable-next-line @typescript-eslint/naming-convention
|
|
108
|
-
|
|
108
|
+
PropertyDefinition(node) {
|
|
109
109
|
const mappedNode = parserServices.esTreeNodeToTSNodeMap.get(node);
|
|
110
110
|
const objectType = typeChecker.getTypeAtLocation(mappedNode);
|
|
111
111
|
const isEnumType = tsutils.isTypeFlagSet(objectType, typescript_1.TypeFlags.EnumLike);
|
|
@@ -133,4 +133,4 @@ const rule = (0, createRule_1.createRule)({
|
|
|
133
133
|
},
|
|
134
134
|
});
|
|
135
135
|
exports.default = rule;
|
|
136
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
136
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBpRW51bVByb3BlcnR5QmVzdFByYWN0aWNlcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9ydWxlcy9hcGlFbnVtUHJvcGVydHlCZXN0UHJhY3RpY2VzL2FwaUVudW1Qcm9wZXJ0eUJlc3RQcmFjdGljZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLDBGQUEwRjtBQUUxRix1REFBa0Q7QUFDbEQscUVBQWdFO0FBQ2hFLCtEQUEwRDtBQUMxRCxnREFBZ0Q7QUFDaEQsMEJBQTBCO0FBQzFCLGlEQUFtQztBQUNuQywyQ0FBcUM7QUFFckMsTUFBTSx1QkFBdUIsR0FBRyxJQUFJLHlDQUFtQixDQUFDO0lBQ3BELGNBQWMsRUFBRSxLQUFLO0lBQ3JCLGtCQUFrQixFQUFFLEtBQUs7SUFDekIsNEJBQTRCLEVBQUUsS0FBSztJQUNuQyxnQkFBZ0IsRUFBRSxLQUFLO0NBQzFCLENBQUMsQ0FBQztBQUVJLE1BQU0seUJBQXlCLEdBQUcsQ0FDckMsSUFBbUIsRUFDbkIsVUFBbUIsRUFDQSxFQUFFO0lBQ3JCLGtCQUFrQjtJQUNsQixJQUFJLENBQUMsVUFBVSxFQUFFO1FBQ2IsT0FBTyx1QkFBdUIsQ0FBQztLQUNsQztJQUVELDJDQUEyQztJQUMzQyxNQUFNLFVBQVUsR0FBRyxxQ0FBaUIsQ0FBQyxrQkFBa0IsQ0FDbkQsSUFBbUMsRUFDbkMsQ0FBQyxxQkFBcUIsRUFBRSxhQUFhLENBQUMsQ0FDekMsQ0FBQztJQUVGLElBQUksVUFBVSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7UUFDekIsT0FBTyx1QkFBdUIsQ0FBQztLQUNsQztJQUVELHNHQUFzRztJQUN0RyxNQUFNLGFBQWEsR0FBSSxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBc0M7U0FDdEUsU0FBUyxDQUFDLENBQUMsQ0FBOEIsQ0FBQztJQUMvQyxJQUFJLENBQUMsYUFBYSxFQUFFO1FBQ2hCLE9BQU8sSUFBSSx5Q0FB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
|
package/dist/rules/apiPropertyMatchesPropertyOptionality/apiPropertyMatchesPropertyOptionality.d.ts
CHANGED
|
@@ -2,6 +2,6 @@ import { TSESTree } from "@typescript-eslint/types";
|
|
|
2
2
|
export declare const shouldUseRequiredDecorator: (node: TSESTree.PropertyDefinition) => boolean;
|
|
3
3
|
export declare const shouldUseOptionalDecorator: (node: TSESTree.PropertyDefinition) => boolean;
|
|
4
4
|
declare const rule: import("@typescript-eslint/experimental-utils/dist/ts-eslint/Rule").RuleModule<"shouldUseOptionalDecorator" | "shouldUseRequiredDecorator", never[], {
|
|
5
|
-
|
|
5
|
+
PropertyDefinition(node: TSESTree.PropertyDefinition): void;
|
|
6
6
|
}>;
|
|
7
7
|
export default rule;
|
package/dist/rules/apiPropertyMatchesPropertyOptionality/apiPropertyMatchesPropertyOptionality.js
CHANGED
|
@@ -35,7 +35,7 @@ const rule = (0, createRule_1.createRule)({
|
|
|
35
35
|
create(context) {
|
|
36
36
|
return {
|
|
37
37
|
// eslint-disable-next-line @typescript-eslint/naming-convention
|
|
38
|
-
|
|
38
|
+
PropertyDefinition(node) {
|
|
39
39
|
if ((0, exports.shouldUseOptionalDecorator)(node)) {
|
|
40
40
|
context.report({
|
|
41
41
|
node: node,
|
|
@@ -53,4 +53,4 @@ const rule = (0, createRule_1.createRule)({
|
|
|
53
53
|
},
|
|
54
54
|
});
|
|
55
55
|
exports.default = rule;
|
|
56
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
56
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBpUHJvcGVydHlNYXRjaGVzUHJvcGVydHlPcHRpb25hbGl0eS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9ydWxlcy9hcGlQcm9wZXJ0eU1hdGNoZXNQcm9wZXJ0eU9wdGlvbmFsaXR5L2FwaVByb3BlcnR5TWF0Y2hlc1Byb3BlcnR5T3B0aW9uYWxpdHkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBSUEsdURBQWtEO0FBQ2xELHFFQUFnRTtBQUV6RCxNQUFNLDBCQUEwQixHQUFHLENBQ3RDLElBQWlDLEVBQzFCLEVBQUU7SUFDVCxNQUFNLG9CQUFvQixHQUFHLHFDQUFpQixDQUFDLHNCQUFzQixDQUNqRSxJQUFJLEVBQ0osQ0FBQyxxQkFBcUIsQ0FBQyxDQUMxQixDQUFDO0lBRUYsTUFBTSx1QkFBdUIsR0FDekIscUNBQWlCLENBQUMsdUJBQXVCLENBQUMsSUFBSSxDQUFDLENBQUM7SUFFcEQsT0FBTyxvQkFBb0IsSUFBSSxDQUFDLHVCQUF1QixDQUFDO0FBQzVELENBQUMsQ0FBQztBQVpXLFFBQUEsMEJBQTBCLDhCQVlyQztBQUVLLE1BQU0sMEJBQTBCLEdBQUcsQ0FDdEMsSUFBaUMsRUFDMUIsRUFBRTtJQUNULE1BQU0sb0JBQW9CLEdBQUcscUNBQWlCLENBQUMsc0JBQXNCLENBQ2pFLElBQUksRUFDSixDQUFDLGFBQWEsQ0FBQyxDQUNsQixDQUFDO0lBRUYsTUFBTSx1QkFBdUIsR0FDekIscUNBQWlCLENBQUMsdUJBQXVCLENBQUMsSUFBSSxDQUFDLENBQUM7SUFFcEQsT0FBTyxvQkFBb0IsSUFBSSx1QkFBdUIsQ0FBQztBQUMzRCxDQUFDLENBQUM7QUFaVyxRQUFBLDBCQUEwQiw4QkFZckM7QUFFRixNQUFNLElBQUksR0FBRyxJQUFBLHVCQUFVLEVBQUM7SUFDcEIsSUFBSSxFQUFFLDJDQUEyQztJQUNqRCxJQUFJLEVBQUU7UUFDRixJQUFJLEVBQUU7WUFDRixXQUFXLEVBQ1Asd0RBQXdEO1lBQzVELFdBQVcsRUFBRSxLQUFLO1lBQ2xCLG9CQUFvQixFQUFFLEtBQUs7U0FDOUI7UUFDRCxRQUFRLEVBQUU7WUFDTiwwQkFBMEIsRUFBRSx1RUFBdUU7WUFDbkcsMEJBQTBCLEVBQUUsK0RBQStEO1NBQzlGO1FBQ0QsTUFBTSxFQUFFLEVBQUU7UUFDVixjQUFjLEVBQUUsS0FBSztRQUNyQixJQUFJLEVBQUUsWUFBWTtLQUNyQjtJQUNELGNBQWMsRUFBRSxFQUFFO0lBRWxCLE1BQU0sQ0FBQyxPQUFPO1FBQ1YsT0FBTztZQUNILGdFQUFnRTtZQUNoRSxrQkFBa0IsQ0FBQyxJQUFpQztnQkFDaEQsSUFBSSxJQUFBLGtDQUEwQixFQUFDLElBQUksQ0FBQyxFQUFFO29CQUNsQyxPQUFPLENBQUMsTUFBTSxDQUFDO3dCQUNYLElBQUksRUFBRSxJQUFJO3dCQUNWLFNBQVMsRUFBRSw0QkFBNEI7cUJBQzFDLENBQUMsQ0FBQztpQkFDTjtnQkFDRCxJQUFJLElBQUEsa0NBQTBCLEVBQUMsSUFBSSxDQUFDLEVBQUU7b0JBQ2xDLE9BQU8sQ0FBQyxNQUFNLENBQUM7d0JBQ1gsSUFBSSxFQUFFLElBQUk7d0JBQ1YsU0FBUyxFQUFFLDRCQUE0QjtxQkFDMUMsQ0FBQyxDQUFDO2lCQUNOO1lBQ0wsQ0FBQztTQUNKLENBQUM7SUFDTixDQUFDO0NBQ0osQ0FBQyxDQUFDO0FBRUgsa0JBQWUsSUFBSSxDQUFDIn0=
|
|
@@ -2,6 +2,6 @@ import { TSESTree } from "@typescript-eslint/types";
|
|
|
2
2
|
import ArraySetResultModel from "./arraySetResultModel";
|
|
3
3
|
export declare const shouldSetArrayProperty: (node: TSESTree.PropertyDefinition) => ArraySetResultModel;
|
|
4
4
|
declare const rule: import("@typescript-eslint/experimental-utils/dist/ts-eslint/Rule").RuleModule<"shouldSetArrayPropertyTrue" | "shouldSetArrayPropertyFalse", never[], {
|
|
5
|
-
|
|
5
|
+
PropertyDefinition: (node: TSESTree.Node) => void;
|
|
6
6
|
}>;
|
|
7
7
|
export default rule;
|
|
@@ -17,24 +17,15 @@ const shouldSetArrayProperty = (node) => {
|
|
|
17
17
|
if (decorators.length === 0) {
|
|
18
18
|
return new arraySetResultModel_1.default(false, false);
|
|
19
19
|
}
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
if (firstArgument !== undefined) {
|
|
24
|
-
const isArrayProperty = firstArgument.properties.find((p) => p.key.name ===
|
|
25
|
-
"isArray");
|
|
26
|
-
isArraySet =
|
|
27
|
-
isArrayProperty !== undefined &&
|
|
28
|
-
isArrayProperty.value
|
|
29
|
-
.value === true;
|
|
30
|
-
}
|
|
20
|
+
// There should only be one of these apiproperty decorators so we just grab the parameter to decorator at index 0
|
|
21
|
+
const firstArgumentToDecorator = decorators[0].expression.arguments[0];
|
|
22
|
+
const hasIsArraySetInOptions = typedTokenHelpers_1.typedTokenHelpers.getPropertyValueEqualsExpected(firstArgumentToDecorator, "isArray", true);
|
|
31
23
|
// handle string[] or Array<string>
|
|
32
24
|
const isArrayType = ((_b = ((_a = node.typeAnnotation) === null || _a === void 0 ? void 0 : _a.typeAnnotation)
|
|
33
25
|
.typeName) === null || _b === void 0 ? void 0 : _b.name) === "Array";
|
|
34
26
|
const isTypescriptArrayType = ((_c = node.typeAnnotation) === null || _c === void 0 ? void 0 : _c.typeAnnotation.type) === types_1.AST_NODE_TYPES.TSArrayType;
|
|
35
|
-
const
|
|
36
|
-
|
|
37
|
-
return new arraySetResultModel_1.default(shouldArrayBeSet && isArraySet === false, shouldArrayBeSet === false && isArraySet);
|
|
27
|
+
const isAnArrayLikeType = isArrayType || isTypescriptArrayType;
|
|
28
|
+
return new arraySetResultModel_1.default(isAnArrayLikeType && !hasIsArraySetInOptions, !isAnArrayLikeType && hasIsArraySetInOptions);
|
|
38
29
|
};
|
|
39
30
|
exports.shouldSetArrayProperty = shouldSetArrayProperty;
|
|
40
31
|
const rule = (0, createRule_1.createRule)({
|
|
@@ -57,7 +48,7 @@ const rule = (0, createRule_1.createRule)({
|
|
|
57
48
|
create(context) {
|
|
58
49
|
return {
|
|
59
50
|
// eslint-disable-next-line @typescript-eslint/naming-convention
|
|
60
|
-
|
|
51
|
+
PropertyDefinition: (node) => {
|
|
61
52
|
const shouldSetArrayResults = (0, exports.shouldSetArrayProperty)(node);
|
|
62
53
|
if (shouldSetArrayResults.isArrayShouldBeSetFalse) {
|
|
63
54
|
context.report({
|
|
@@ -76,4 +67,4 @@ const rule = (0, createRule_1.createRule)({
|
|
|
76
67
|
},
|
|
77
68
|
});
|
|
78
69
|
exports.default = rule;
|
|
79
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
70
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBpUHJvcGVydHlSZXR1cm5pbmdBcnJheVNob3VsZFNldEFycmF5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3J1bGVzL2FwaVByb3BlcnR5UmV0dXJuaW5nQXJyYXlTaG91bGRTZXRBcnJheS9hcGlQcm9wZXJ0eVJldHVybmluZ0FycmF5U2hvdWxkU2V0QXJyYXkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsb0RBQWtFO0FBQ2xFLHVEQUFrRDtBQUNsRCxxRUFBZ0U7QUFDaEUsZ0ZBQXdEO0FBRWpELE1BQU0sc0JBQXNCLEdBQUcsQ0FDbEMsSUFBaUMsRUFDZCxFQUFFOztJQUNyQixNQUFNLFVBQVUsR0FBRyxxQ0FBaUIsQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLEVBQUU7UUFDMUQscUJBQXFCO1FBQ3JCLGFBQWE7S0FDaEIsQ0FBQyxDQUFDO0lBRUgsSUFBSSxVQUFVLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtRQUN6QixPQUFPLElBQUksNkJBQW1CLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDO0tBQ2hEO0lBRUQsaUhBQWlIO0lBQ2pILE1BQU0sd0JBQXdCLEdBQzFCLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUNqQixDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQThCLENBQUM7SUFFNUMsTUFBTSxzQkFBc0IsR0FDeEIscUNBQWlCLENBQUMsOEJBQThCLENBQzVDLHdCQUF3QixFQUN4QixTQUFTLEVBQ1QsSUFBSSxDQUNQLENBQUM7SUFDTixtQ0FBbUM7SUFDbkMsTUFBTSxXQUFXLEdBQ2IsQ0FBQSxNQUNJLENBQUMsTUFBQSxJQUFJLENBQUMsY0FBYywwQ0FBRSxjQUEyQyxDQUFBO1NBQzVELFFBQ1IsMENBQUUsSUFBSSxNQUFLLE9BQU8sQ0FBQztJQUN4QixNQUFNLHFCQUFxQixHQUN2QixDQUFBLE1BQUEsSUFBSSxDQUFDLGNBQWMsMENBQUUsY0FBYyxDQUFDLElBQUksTUFBSyxzQkFBYyxDQUFDLFdBQVcsQ0FBQztJQUM1RSxNQUFNLGlCQUFpQixHQUFHLFdBQVcsSUFBSSxxQkFBcUIsQ0FBQztJQUUvRCxPQUFPLElBQUksNkJBQW1CLENBQzFCLGlCQUFpQixJQUFJLENBQUMsc0JBQXNCLEVBQzVDLENBQUMsaUJBQWlCLElBQUksc0JBQXNCLENBQy9DLENBQUM7QUFDTixDQUFDLENBQUM7QUFyQ1csUUFBQSxzQkFBc0IsMEJBcUNqQztBQUVGLE1BQU0sSUFBSSxHQUFHLElBQUEsdUJBQVUsRUFBQztJQUNwQixJQUFJLEVBQUUsK0NBQStDO0lBQ3JELElBQUksRUFBRTtRQUNGLElBQUksRUFBRTtZQUNGLFdBQVcsRUFBRSxzQ0FBc0M7WUFDbkQsV0FBVyxFQUFFLEtBQUs7WUFDbEIsb0JBQW9CLEVBQUUsS0FBSztTQUM5QjtRQUNELFFBQVEsRUFBRTtZQUNOLDBCQUEwQixFQUFFLGdFQUFnRTtZQUM1RiwyQkFBMkIsRUFBRSx3RUFBd0U7U0FDeEc7UUFDRCxNQUFNLEVBQUUsRUFBRTtRQUNWLGNBQWMsRUFBRSxLQUFLO1FBQ3JCLElBQUksRUFBRSxZQUFZO0tBQ3JCO0lBQ0QsY0FBYyxFQUFFLEVBQUU7SUFFbEIsTUFBTSxDQUFDLE9BQU87UUFDVixPQUFPO1lBQ0gsZ0VBQWdFO1lBQ2hFLGtCQUFrQixFQUFFLENBQUMsSUFBbUIsRUFBRSxFQUFFO2dCQUN4QyxNQUFNLHFCQUFxQixHQUFHLElBQUEsOEJBQXNCLEVBQ2hELElBQW1DLENBQ3RDLENBQUM7Z0JBRUYsSUFBSSxxQkFBcUIsQ0FBQyx1QkFBdUIsRUFBRTtvQkFDL0MsT0FBTyxDQUFDLE1BQU0sQ0FBQzt3QkFDWCxJQUFJLEVBQUUsSUFBSTt3QkFDVixTQUFTLEVBQUUsNkJBQTZCO3FCQUMzQyxDQUFDLENBQUM7aUJBQ047Z0JBQ0QsSUFBSSxxQkFBcUIsQ0FBQyxzQkFBc0IsRUFBRTtvQkFDOUMsT0FBTyxDQUFDLE1BQU0sQ0FBQzt3QkFDWCxJQUFJLEVBQUUsSUFBSTt3QkFDVixTQUFTLEVBQUUsNEJBQTRCO3FCQUMxQyxDQUFDLENBQUM7aUJBQ047WUFDTCxDQUFDO1NBQ0osQ0FBQztJQUNOLENBQUM7Q0FDSixDQUFDLENBQUM7QUFFSCxrQkFBZSxJQUFJLENBQUMifQ==
|
package/dist/rules/index.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
declare const allRules: {
|
|
2
2
|
"api-property-matches-property-optionality": import("@typescript-eslint/experimental-utils/dist/ts-eslint/Rule").RuleModule<"shouldUseOptionalDecorator" | "shouldUseRequiredDecorator", never[], {
|
|
3
|
-
|
|
3
|
+
PropertyDefinition(node: import("@typescript-eslint/types/dist/ast-spec").PropertyDefinition): void;
|
|
4
4
|
}>;
|
|
5
5
|
"injectable-should-be-provided": import("@typescript-eslint/experimental-utils/dist/ts-eslint/Rule").RuleModule<"injectableInModule" | "controllersInModule", never[], {
|
|
6
6
|
ClassDeclaration(node: import("@typescript-eslint/types/dist/ast-spec").ClassDeclaration): void;
|
|
@@ -16,10 +16,10 @@ declare const allRules: {
|
|
|
16
16
|
MethodDefinition(node: import("@typescript-eslint/types/dist/ast-spec").MethodDefinition): void;
|
|
17
17
|
}>;
|
|
18
18
|
"api-enum-property-best-practices": import("@typescript-eslint/experimental-utils/dist/ts-eslint/Rule").RuleModule<"needsEnumNameAdded" | "needsTypeRemoved" | "enumNameShouldMatchType", never[], {
|
|
19
|
-
|
|
19
|
+
PropertyDefinition(node: import("@typescript-eslint/types/dist/ast-spec").Node): void;
|
|
20
20
|
}>;
|
|
21
21
|
"api-property-returning-array-should-set-array": import("@typescript-eslint/experimental-utils/dist/ts-eslint/Rule").RuleModule<"shouldSetArrayPropertyTrue" | "shouldSetArrayPropertyFalse", never[], {
|
|
22
|
-
|
|
22
|
+
PropertyDefinition: (node: import("@typescript-eslint/types/dist/ast-spec").Node) => void;
|
|
23
23
|
}>;
|
|
24
24
|
"should-specify-forbid-unknown-values": import("@typescript-eslint/experimental-utils/dist/ts-eslint/Rule").RuleModule<"shouldSpecifyForbidUnknownValues", never[], {
|
|
25
25
|
NewExpression(node: import("@typescript-eslint/types/dist/ast-spec").Node): void;
|
|
@@ -1,9 +1,3 @@
|
|
|
1
|
-
export declare const parameterNameCheckTestCases: {
|
|
2
|
-
moduleCode: string;
|
|
3
|
-
isParamNameNotMatchedInPathTriggered: boolean;
|
|
4
|
-
isParamNameIncludesColonTriggered: boolean;
|
|
5
|
-
message: string;
|
|
6
|
-
}[];
|
|
7
1
|
export declare const pathPartTestCases: {
|
|
8
2
|
moduleCode: string;
|
|
9
3
|
paths: string[];
|
|
@@ -1,58 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.responseParsingTestCases = exports.pathPartTestCases = exports.parameterNameCheckTestCases = void 0;
|
|
4
2
|
/* eslint-disable unicorn/filename-case */
|
|
5
|
-
exports
|
|
6
|
-
|
|
7
|
-
moduleCode: `
|
|
8
|
-
@ApiTags("Custom Bot")
|
|
9
|
-
@ApiBearerAuth()
|
|
10
|
-
@UseGuards(DefaultAuthGuard)
|
|
11
|
-
@Controller("custom-bot")
|
|
12
|
-
export class CustomBotController {
|
|
13
|
-
constructor(
|
|
14
|
-
) {}
|
|
15
|
-
|
|
16
|
-
@Get(":uuid")
|
|
17
|
-
@ApiOkResponse({ type: CustomBot })
|
|
18
|
-
findOne(
|
|
19
|
-
@Param() uuid: string,
|
|
20
|
-
@Request() request: RequestWithUser
|
|
21
|
-
): Promise<CustomBot> {
|
|
22
|
-
return this.customBotService.findOne(uuid, request.user.uuid);
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
}
|
|
26
|
-
`,
|
|
27
|
-
isParamNameNotMatchedInPathTriggered: false,
|
|
28
|
-
isParamNameIncludesColonTriggered: false,
|
|
29
|
-
message: "no param name provided - can't check anything",
|
|
30
|
-
},
|
|
31
|
-
{
|
|
32
|
-
moduleCode: `
|
|
33
|
-
@ApiTags("Custom Bot")
|
|
34
|
-
@ApiBearerAuth()
|
|
35
|
-
@UseGuards(DefaultAuthGuard)
|
|
36
|
-
@Controller("custom-bot/:uuid/my-controller")
|
|
37
|
-
export class CustomBotController {
|
|
38
|
-
constructor(
|
|
39
|
-
) {}
|
|
40
|
-
|
|
41
|
-
@Get()
|
|
42
|
-
@ApiOkResponse({ type: CustomBot })
|
|
43
|
-
findOne(
|
|
44
|
-
@Param(":uuid") uuid: string,
|
|
45
|
-
@Request() request: RequestWithUser
|
|
46
|
-
): Promise<CustomBot> {
|
|
47
|
-
return this.customBotService.findOne(uuid, request.user.uuid);
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
`,
|
|
51
|
-
isParamNameNotMatchedInPathTriggered: false,
|
|
52
|
-
isParamNameIncludesColonTriggered: true,
|
|
53
|
-
message: "This param name includes a colon - probably unintentional",
|
|
54
|
-
},
|
|
55
|
-
];
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.responseParsingTestCases = exports.pathPartTestCases = void 0;
|
|
56
5
|
exports.pathPartTestCases = [
|
|
57
6
|
{
|
|
58
7
|
moduleCode: `
|
|
@@ -173,4 +122,4 @@ exports.responseParsingTestCases = [
|
|
|
173
122
|
shouldResult: false,
|
|
174
123
|
},
|
|
175
124
|
];
|
|
176
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
125
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVsZS50ZXN0RGF0YS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9ydWxlcy9wYXJhbURlY29yYXRvck5hbWVNYXRjaGVzUm91dGVQYXJhbS9ydWxlLnRlc3REYXRhLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSwwQ0FBMEM7OztBQUU3QixRQUFBLGlCQUFpQixHQUFHO0lBQzdCO1FBQ0ksVUFBVSxFQUFFOzs7U0FHWDtRQUNELEtBQUssRUFBRSxDQUFDLFNBQVMsQ0FBQztRQUNsQixPQUFPLEVBQUUsOEJBQThCO0tBQzFDO0lBQ0Q7UUFDSSxVQUFVLEVBQUU7OztTQUdYO1FBQ0QsS0FBSyxFQUFFLENBQUMsa0NBQWtDLENBQUM7UUFDM0MsT0FBTyxFQUFFLGtDQUFrQztLQUM5QztJQUNEO1FBQ0ksVUFBVSxFQUFFOzs7U0FHWDtRQUNELEtBQUssRUFBRTtZQUNILGtDQUFrQztZQUNsQyxrQ0FBa0M7U0FDckM7UUFDRCxPQUFPLEVBQUUsb0NBQW9DO0tBQ2hEO0lBQ0Q7UUFDSSxVQUFVLEVBQUU7OztTQUdYO1FBQ0QsS0FBSyxFQUFFLENBQUMsU0FBUyxFQUFFLFNBQVMsQ0FBQztRQUM3QixPQUFPLEVBQUUsZ0NBQWdDO0tBQzVDO0lBQ0Q7UUFDSSxVQUFVLEVBQUU7OztTQUdYO1FBQ0QsS0FBSyxFQUFFLEVBQUU7UUFDVCxPQUFPLEVBQUUscUJBQXFCO0tBQ2pDO0lBQ0Q7UUFDSSxVQUFVLEVBQUU7OztTQUdYO1FBQ0QsS0FBSyxFQUFFLENBQUMsa0NBQWtDLENBQUM7UUFDM0MsT0FBTyxFQUFFLDRCQUE0QjtLQUN4QztDQUNKLENBQUM7QUFFVyxRQUFBLHdCQUF3QixHQUFHO0lBQ3BDO1FBQ0ksV0FBVyxFQUFFLE1BQU07UUFDbkIsS0FBSyxFQUFFLENBQUMsU0FBUyxDQUFDO1FBQ2xCLFlBQVksRUFBRSxJQUFJO0tBQ3JCO0lBQ0Q7UUFDSSxXQUFXLEVBQUUsS0FBSztRQUNsQixLQUFLLEVBQUUsQ0FBQyxTQUFTLENBQUM7UUFDbEIsWUFBWSxFQUFFLEtBQUs7S0FDdEI7SUFDRDtRQUNJLFdBQVcsRUFBRSxNQUFNO1FBQ25CLEtBQUssRUFBRSxDQUFDLHVCQUF1QixDQUFDO1FBQ2hDLFlBQVksRUFBRSxJQUFJO0tBQ3JCO0lBQ0Q7UUFDSSxXQUFXLEVBQUUsS0FBSztRQUNsQixLQUFLLEVBQUUsQ0FBQyx3QkFBd0IsQ0FBQztRQUNqQyxZQUFZLEVBQUUsS0FBSztLQUN0QjtJQUNEO1FBQ0ksV0FBVyxFQUFFLE1BQU07UUFDbkIsS0FBSyxFQUFFLENBQUMsd0JBQXdCLENBQUM7UUFDakMsWUFBWSxFQUFFLElBQUk7S0FDckI7SUFDRDtRQUNJLFdBQVcsRUFBRSxNQUFNO1FBQ25CLEtBQUssRUFBRSxDQUFDLHVCQUF1QixDQUFDO1FBQ2hDLFlBQVksRUFBRSxJQUFJO0tBQ3JCO0lBQ0Q7UUFDSSxXQUFXLEVBQUUsTUFBTTtRQUNuQixLQUFLLEVBQUUsQ0FBQyxzQkFBc0IsQ0FBQztRQUMvQixZQUFZLEVBQUUsSUFBSTtLQUNyQjtJQUNEO1FBQ0ksV0FBVyxFQUFFLE1BQU07UUFDbkIsS0FBSyxFQUFFLENBQUMsdUJBQXVCLENBQUM7UUFDaEMsWUFBWSxFQUFFLElBQUk7S0FDckI7SUFDRDtRQUNJLFdBQVcsRUFBRSxLQUFLO1FBQ2xCLEtBQUssRUFBRSxDQUFDLHVCQUF1QixDQUFDO1FBQ2hDLFlBQVksRUFBRSxLQUFLO0tBQ3RCO0lBQ0Q7UUFDSSxXQUFXLEVBQUUsTUFBTTtRQUNuQixLQUFLLEVBQUUsQ0FBQyxTQUFTLEVBQUUsWUFBWSxDQUFDO1FBQ2hDLFlBQVksRUFBRSxJQUFJO0tBQ3JCO0lBQ0Q7UUFDSSxXQUFXLEVBQUUsTUFBTTtRQUNuQixLQUFLLEVBQUUsQ0FBQyxZQUFZLENBQUM7UUFDckIsWUFBWSxFQUFFLEtBQUs7S0FDdEI7SUFDRDtRQUNJLFdBQVcsRUFBRSxNQUFNO1FBQ25CLEtBQUssRUFBRSxFQUFFO1FBQ1QsWUFBWSxFQUFFLEtBQUs7S0FDdEI7SUFDRDtRQUNJLFdBQVcsRUFBRSxNQUFNO1FBQ25CLEtBQUssRUFBRSxDQUFDLElBQUksRUFBRSxFQUFFLENBQUM7UUFDakIsWUFBWSxFQUFFLEtBQUs7S0FDdEI7Q0FDSixDQUFDIn0=
|
package/dist/rules/validate-non-primitves-needs-decorators/validateNonPrimitiveNeedsDecorators.d.ts
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { TSESTree } from "@typescript-eslint/types";
|
|
2
|
+
export declare const shouldTrigger: () => boolean;
|
|
3
|
+
declare const rule: import("@typescript-eslint/experimental-utils/dist/ts-eslint/Rule").RuleModule<"shouldUseValidateNested", never[], {
|
|
4
|
+
PropertyDefinition(node: TSESTree.PropertyDefinition): void;
|
|
5
|
+
}>;
|
|
6
|
+
export default rule;
|
package/dist/rules/validate-non-primitves-needs-decorators/validateNonPrimitiveNeedsDecorators.js
ADDED
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.shouldTrigger = void 0;
|
|
4
|
+
const createRule_1 = require("../../utils/createRule");
|
|
5
|
+
// const nestRequestMethodDecoratorNames = new Set([
|
|
6
|
+
// "Get",
|
|
7
|
+
// "Post",
|
|
8
|
+
// "Put",
|
|
9
|
+
// "Delete",
|
|
10
|
+
// "Patch",
|
|
11
|
+
// "Options",
|
|
12
|
+
// "Head",
|
|
13
|
+
// "All",
|
|
14
|
+
// ]);
|
|
15
|
+
const shouldTrigger = () => {
|
|
16
|
+
return false;
|
|
17
|
+
};
|
|
18
|
+
exports.shouldTrigger = shouldTrigger;
|
|
19
|
+
const rule = (0, createRule_1.createRule)({
|
|
20
|
+
name: "param-decorator-name-matches-route-param",
|
|
21
|
+
meta: {
|
|
22
|
+
docs: {
|
|
23
|
+
description: "Properties that are not primitive types should ValidateNested",
|
|
24
|
+
recommended: false,
|
|
25
|
+
requiresTypeChecking: false,
|
|
26
|
+
},
|
|
27
|
+
messages: {
|
|
28
|
+
shouldUseValidateNested: "A non-primitve type property with validation should use @ValidateNested",
|
|
29
|
+
},
|
|
30
|
+
schema: [],
|
|
31
|
+
hasSuggestions: false,
|
|
32
|
+
type: "suggestion",
|
|
33
|
+
},
|
|
34
|
+
defaultOptions: [],
|
|
35
|
+
create(context) {
|
|
36
|
+
return {
|
|
37
|
+
// eslint-disable-next-line @typescript-eslint/naming-convention
|
|
38
|
+
PropertyDefinition(node) {
|
|
39
|
+
// property is not a primitve type
|
|
40
|
+
// property has a validation decorator
|
|
41
|
+
// eslint-disable-next-line @typescript-eslint/naming-convention
|
|
42
|
+
const result = (0, exports.shouldTrigger)();
|
|
43
|
+
if (result) {
|
|
44
|
+
context.report({
|
|
45
|
+
node: node,
|
|
46
|
+
messageId: "shouldUseValidateNested",
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
},
|
|
50
|
+
};
|
|
51
|
+
},
|
|
52
|
+
});
|
|
53
|
+
exports.default = rule;
|
|
54
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFsaWRhdGVOb25QcmltaXRpdmVOZWVkc0RlY29yYXRvcnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvcnVsZXMvdmFsaWRhdGUtbm9uLXByaW1pdHZlcy1uZWVkcy1kZWNvcmF0b3JzL3ZhbGlkYXRlTm9uUHJpbWl0aXZlTmVlZHNEZWNvcmF0b3JzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUVBLHVEQUFrRDtBQUVsRCxvREFBb0Q7QUFDcEQsYUFBYTtBQUNiLGNBQWM7QUFDZCxhQUFhO0FBQ2IsZ0JBQWdCO0FBQ2hCLGVBQWU7QUFDZixpQkFBaUI7QUFDakIsY0FBYztBQUNkLGFBQWE7QUFDYixNQUFNO0FBRUMsTUFBTSxhQUFhLEdBQUcsR0FBWSxFQUFFO0lBQ3ZDLE9BQU8sS0FBSyxDQUFDO0FBQ2pCLENBQUMsQ0FBQztBQUZXLFFBQUEsYUFBYSxpQkFFeEI7QUFFRixNQUFNLElBQUksR0FBRyxJQUFBLHVCQUFVLEVBQUM7SUFDcEIsSUFBSSxFQUFFLDBDQUEwQztJQUNoRCxJQUFJLEVBQUU7UUFDRixJQUFJLEVBQUU7WUFDRixXQUFXLEVBQ1AsK0RBQStEO1lBQ25FLFdBQVcsRUFBRSxLQUFLO1lBQ2xCLG9CQUFvQixFQUFFLEtBQUs7U0FDOUI7UUFDRCxRQUFRLEVBQUU7WUFDTix1QkFBdUIsRUFDbkIseUVBQXlFO1NBQ2hGO1FBQ0QsTUFBTSxFQUFFLEVBQUU7UUFDVixjQUFjLEVBQUUsS0FBSztRQUNyQixJQUFJLEVBQUUsWUFBWTtLQUNyQjtJQUNELGNBQWMsRUFBRSxFQUFFO0lBRWxCLE1BQU0sQ0FBQyxPQUFPO1FBQ1YsT0FBTztZQUNILGdFQUFnRTtZQUNoRSxrQkFBa0IsQ0FBQyxJQUFpQztnQkFDaEQsa0NBQWtDO2dCQUNsQyxzQ0FBc0M7Z0JBRXRDLGdFQUFnRTtnQkFDaEUsTUFBTSxNQUFNLEdBQUcsSUFBQSxxQkFBYSxHQUFFLENBQUM7Z0JBRS9CLElBQUksTUFBTSxFQUFFO29CQUNSLE9BQU8sQ0FBQyxNQUFNLENBQUM7d0JBQ1gsSUFBSSxFQUFFLElBQUk7d0JBQ1YsU0FBUyxFQUFFLHlCQUF5QjtxQkFDdkMsQ0FBQyxDQUFDO2lCQUNOO1lBQ0wsQ0FBQztTQUNKLENBQUM7SUFDTixDQUFDO0NBQ0osQ0FBQyxDQUFDO0FBRUgsa0JBQWUsSUFBSSxDQUFDIn0=
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function getFixturesRootDirectory(): string;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.getFixturesRootDirectory = void 0;
|
|
7
|
+
const path_1 = __importDefault(require("path"));
|
|
8
|
+
function getFixturesRootDirectory() {
|
|
9
|
+
// eslint-disable-next-line unicorn/prefer-module
|
|
10
|
+
return path_1.default.join(__dirname, "..", "fixtures");
|
|
11
|
+
}
|
|
12
|
+
exports.getFixturesRootDirectory = getFixturesRootDirectory;
|
|
13
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZml4dHVyZVNldHVwLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3Rlc3RpbmcvZml4dHVyZVNldHVwLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLGdEQUF3QjtBQUV4QixTQUFnQix3QkFBd0I7SUFDcEMsaURBQWlEO0lBQ2pELE9BQU8sY0FBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsSUFBSSxFQUFFLFVBQVUsQ0FBQyxDQUFDO0FBQ2xELENBQUM7QUFIRCw0REFHQyJ9
|
|
@@ -1,6 +1,13 @@
|
|
|
1
|
-
import { TSESTree } from "@typescript-eslint/experimental-utils";
|
|
1
|
+
import { ParserServices, TSESTree } from "@typescript-eslint/experimental-utils";
|
|
2
2
|
import { RuleContext } from "@typescript-eslint/experimental-utils/dist/ts-eslint";
|
|
3
|
+
import ts from "typescript";
|
|
3
4
|
export declare const typedTokenHelpers: {
|
|
5
|
+
decoratorsThatCouldMeanTheDevIsValidatingAnArray: string[];
|
|
6
|
+
isTypeArrayTypeOrUnionOfArrayTypes(node: TSESTree.Node, parserService: ParserServices, checker: ts.TypeChecker): boolean;
|
|
7
|
+
getNodeType(node: TSESTree.Node, parserService: ParserServices, checker: ts.TypeChecker): ts.Type;
|
|
8
|
+
expressionNodeIsArrayType(node: TSESTree.Expression, parserService: ParserServices, checker: ts.TypeChecker): boolean;
|
|
9
|
+
getPropertyValueEqualsExpected(firstArgument: TSESTree.ObjectExpression, propertyName: string, expectedValue: string | number | bigint | boolean | RegExp | null): boolean;
|
|
10
|
+
getConstrainedTypeAtLocation(checker: ts.TypeChecker, node: ts.Node): ts.Type;
|
|
4
11
|
nodeHasDecoratorsNamed(n: TSESTree.ClassDeclaration | TSESTree.PropertyDefinition | TSESTree.MethodDefinition, decoratorNames: string[]): boolean;
|
|
5
12
|
getDecoratorsNamed(n: TSESTree.ClassDeclaration | TSESTree.PropertyDefinition | TSESTree.MethodDefinition, decoratorNames: string[]): TSESTree.Decorator[];
|
|
6
13
|
parseStringToAst(code: string, path: string, context: Readonly<RuleContext<never, never[]>>): TSESTree.Program;
|
|
@@ -3,7 +3,51 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.typedTokenHelpers = void 0;
|
|
4
4
|
const experimental_utils_1 = require("@typescript-eslint/experimental-utils");
|
|
5
5
|
const parser_1 = require("@typescript-eslint/parser");
|
|
6
|
+
const tsutils_1 = require("tsutils");
|
|
6
7
|
exports.typedTokenHelpers = {
|
|
8
|
+
decoratorsThatCouldMeanTheDevIsValidatingAnArray: [
|
|
9
|
+
"IsArray",
|
|
10
|
+
"ArrayMinSize",
|
|
11
|
+
"ArrayMinSize",
|
|
12
|
+
"ArrayContains",
|
|
13
|
+
"ArrayNotContains",
|
|
14
|
+
"ArrayNotEmpty",
|
|
15
|
+
"ArrayUnique",
|
|
16
|
+
],
|
|
17
|
+
isTypeArrayTypeOrUnionOfArrayTypes(node, parserService, checker) {
|
|
18
|
+
const nodeType = this.getNodeType(node, parserService, checker);
|
|
19
|
+
for (const t of (0, tsutils_1.unionTypeParts)(nodeType)) {
|
|
20
|
+
if (!checker.isArrayType(t)) {
|
|
21
|
+
return false;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
return true;
|
|
25
|
+
},
|
|
26
|
+
getNodeType(node, parserService, checker) {
|
|
27
|
+
const tsNode = parserService.esTreeNodeToTSNodeMap.get(node);
|
|
28
|
+
return exports.typedTokenHelpers.getConstrainedTypeAtLocation(checker, tsNode);
|
|
29
|
+
},
|
|
30
|
+
expressionNodeIsArrayType(node, parserService, checker) {
|
|
31
|
+
const nodeType = this.getNodeType(node, parserService, checker);
|
|
32
|
+
return checker.isArrayType(nodeType);
|
|
33
|
+
},
|
|
34
|
+
getPropertyValueEqualsExpected(firstArgument, propertyName, expectedValue) {
|
|
35
|
+
let didMatchExpectedValues = false;
|
|
36
|
+
if (firstArgument !== undefined) {
|
|
37
|
+
const foundPropertyOfName = firstArgument.properties.find((p) => p.key
|
|
38
|
+
.name === propertyName);
|
|
39
|
+
didMatchExpectedValues =
|
|
40
|
+
foundPropertyOfName !== undefined &&
|
|
41
|
+
foundPropertyOfName
|
|
42
|
+
.value.value === expectedValue;
|
|
43
|
+
}
|
|
44
|
+
return didMatchExpectedValues;
|
|
45
|
+
},
|
|
46
|
+
getConstrainedTypeAtLocation(checker, node) {
|
|
47
|
+
const nodeType = checker.getTypeAtLocation(node);
|
|
48
|
+
const constrained = checker.getBaseConstraintOfType(nodeType);
|
|
49
|
+
return constrained !== null && constrained !== void 0 ? constrained : nodeType;
|
|
50
|
+
},
|
|
7
51
|
nodeHasDecoratorsNamed(n, decoratorNames) {
|
|
8
52
|
const decorators = this.getDecoratorsNamed(n, decoratorNames);
|
|
9
53
|
return decorators.length > 0;
|
|
@@ -30,4 +74,4 @@ exports.typedTokenHelpers = {
|
|
|
30
74
|
return isOptionalPropertyValue;
|
|
31
75
|
},
|
|
32
76
|
};
|
|
33
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
77
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZWRUb2tlbkhlbHBlcnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdXRpbHMvdHlwZWRUb2tlbkhlbHBlcnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsOEVBSStDO0FBRS9DLHNEQUFnRDtBQUVoRCxxQ0FBdUM7QUFFMUIsUUFBQSxpQkFBaUIsR0FBRztJQUM3QixnREFBZ0QsRUFBRTtRQUM5QyxTQUFTO1FBQ1QsY0FBYztRQUNkLGNBQWM7UUFDZCxlQUFlO1FBQ2Ysa0JBQWtCO1FBQ2xCLGVBQWU7UUFDZixhQUFhO0tBQ2hCO0lBQ0Qsa0NBQWtDLENBQzlCLElBQW1CLEVBQ25CLGFBQTZCLEVBQzdCLE9BQXVCO1FBRXZCLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLGFBQWEsRUFBRSxPQUFPLENBQUMsQ0FBQztRQUNoRSxLQUFLLE1BQU0sQ0FBQyxJQUFJLElBQUEsd0JBQWMsRUFBQyxRQUFRLENBQUMsRUFBRTtZQUN0QyxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsRUFBRTtnQkFDekIsT0FBTyxLQUFLLENBQUM7YUFDaEI7U0FDSjtRQUVELE9BQU8sSUFBSSxDQUFDO0lBQ2hCLENBQUM7SUFDRCxXQUFXLENBQ1AsSUFBbUIsRUFDbkIsYUFBNkIsRUFDN0IsT0FBdUI7UUFFdkIsTUFBTSxNQUFNLEdBQUcsYUFBYSxDQUFDLHFCQUFxQixDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM3RCxPQUFPLHlCQUFpQixDQUFDLDRCQUE0QixDQUFDLE9BQU8sRUFBRSxNQUFNLENBQUMsQ0FBQztJQUMzRSxDQUFDO0lBQ0QseUJBQXlCLENBQ3JCLElBQXlCLEVBQ3pCLGFBQTZCLEVBQzdCLE9BQXVCO1FBRXZCLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLGFBQWEsRUFBRSxPQUFPLENBQUMsQ0FBQztR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
|
package/package.json
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@darraghor/eslint-plugin-nestjs-typed",
|
|
3
|
-
"version": "3.
|
|
3
|
+
"version": "3.4.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",
|
|
10
|
+
"test": "export NODE_OPTIONS=\"--max-old-space-size=8192\" && npx jest --runInBand --color --reporters=default --no-cache --coverage=false --silent=false",
|
|
11
11
|
"pre-commit": "npx lint-staged",
|
|
12
12
|
"prettier": "prettier --write src/*",
|
|
13
13
|
"prepare": "husky install",
|
|
@@ -1,137 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.testCases = void 0;
|
|
4
|
-
/* eslint-disable unicorn/filename-case */
|
|
5
|
-
exports.testCases = [
|
|
6
|
-
{
|
|
7
|
-
moduleCode: `enum MyEnum{
|
|
8
|
-
ValA,
|
|
9
|
-
ValB
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
class MyClass {
|
|
13
|
-
@ApiProperty({
|
|
14
|
-
type: MyEnum,
|
|
15
|
-
enum: MyEnum,
|
|
16
|
-
})
|
|
17
|
-
public myProperty!:MyEnum
|
|
18
|
-
}`,
|
|
19
|
-
needsEnumProperty: false,
|
|
20
|
-
needsEnumNameProperty: true,
|
|
21
|
-
needsTypeRemoved: true,
|
|
22
|
-
needsEnumNameToMatchEnumType: false,
|
|
23
|
-
isEnumType: true,
|
|
24
|
-
message: "type is present, no enum name prop",
|
|
25
|
-
},
|
|
26
|
-
{
|
|
27
|
-
moduleCode: `enum MyEnum{
|
|
28
|
-
ValA,
|
|
29
|
-
ValB
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
class MyClass {
|
|
33
|
-
@ApiProperty({
|
|
34
|
-
enumName: "MyEnum",
|
|
35
|
-
enum: MyEnum,
|
|
36
|
-
})
|
|
37
|
-
public myProperty!:MyEnum
|
|
38
|
-
}`,
|
|
39
|
-
needsEnumProperty: false,
|
|
40
|
-
needsEnumNameProperty: false,
|
|
41
|
-
needsTypeRemoved: false,
|
|
42
|
-
needsEnumNameToMatchEnumType: false,
|
|
43
|
-
isEnumType: true,
|
|
44
|
-
message: "perfect",
|
|
45
|
-
},
|
|
46
|
-
{
|
|
47
|
-
moduleCode: `enum MyEnum{
|
|
48
|
-
ValA,
|
|
49
|
-
ValB
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
class MyClass {
|
|
53
|
-
@ApiProperty({
|
|
54
|
-
enum: MyEnum,
|
|
55
|
-
})
|
|
56
|
-
public myProperty!:MyEnum
|
|
57
|
-
}`,
|
|
58
|
-
needsEnumProperty: false,
|
|
59
|
-
needsEnumNameProperty: true,
|
|
60
|
-
needsTypeRemoved: false,
|
|
61
|
-
needsEnumNameToMatchEnumType: false,
|
|
62
|
-
isEnumType: true,
|
|
63
|
-
message: "missing enum name, no type present",
|
|
64
|
-
},
|
|
65
|
-
{
|
|
66
|
-
moduleCode: `enum MyEnum{
|
|
67
|
-
ValA,
|
|
68
|
-
ValB
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
class MyClass {
|
|
72
|
-
@ApiProperty({
|
|
73
|
-
type: MyEnum,
|
|
74
|
-
})
|
|
75
|
-
public myProperty!:MyEnum
|
|
76
|
-
}`,
|
|
77
|
-
needsEnumProperty: true,
|
|
78
|
-
needsEnumNameProperty: true,
|
|
79
|
-
needsTypeRemoved: true,
|
|
80
|
-
needsEnumNameToMatchEnumType: false,
|
|
81
|
-
isEnumType: true,
|
|
82
|
-
message: "has type, missing everything else",
|
|
83
|
-
},
|
|
84
|
-
{
|
|
85
|
-
moduleCode: `enum MyEnum{
|
|
86
|
-
ValA,
|
|
87
|
-
ValB
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
class MyClass {
|
|
91
|
-
@ApiProperty()
|
|
92
|
-
public myProperty!:Object
|
|
93
|
-
}`,
|
|
94
|
-
needsEnumProperty: false,
|
|
95
|
-
needsEnumNameProperty: false,
|
|
96
|
-
needsTypeRemoved: false,
|
|
97
|
-
needsEnumNameToMatchEnumType: false,
|
|
98
|
-
isEnumType: false,
|
|
99
|
-
message: "not an enum at all",
|
|
100
|
-
},
|
|
101
|
-
{
|
|
102
|
-
moduleCode: `enum MyEnum{
|
|
103
|
-
ValA,
|
|
104
|
-
ValB
|
|
105
|
-
}
|
|
106
|
-
|
|
107
|
-
class MyClass {
|
|
108
|
-
@ApiProperty({})
|
|
109
|
-
public myProperty!:MyEnum
|
|
110
|
-
}`,
|
|
111
|
-
needsEnumProperty: true,
|
|
112
|
-
needsEnumNameProperty: true,
|
|
113
|
-
needsTypeRemoved: false,
|
|
114
|
-
needsEnumNameToMatchEnumType: false,
|
|
115
|
-
isEnumType: true,
|
|
116
|
-
message: "missing all but still has property",
|
|
117
|
-
},
|
|
118
|
-
{
|
|
119
|
-
moduleCode: `enum MyEnum{
|
|
120
|
-
ValA,
|
|
121
|
-
ValB
|
|
122
|
-
}
|
|
123
|
-
|
|
124
|
-
class MyClass {
|
|
125
|
-
@ApiProperty({enumName: "MyEnumTYPO",
|
|
126
|
-
enum: MyEnum,})
|
|
127
|
-
public myProperty!:MyEnum
|
|
128
|
-
}`,
|
|
129
|
-
needsEnumProperty: false,
|
|
130
|
-
needsEnumNameProperty: false,
|
|
131
|
-
needsTypeRemoved: false,
|
|
132
|
-
needsEnumNameToMatchEnumType: true,
|
|
133
|
-
isEnumType: true,
|
|
134
|
-
message: "enum name doesn't match enum type",
|
|
135
|
-
},
|
|
136
|
-
];
|
|
137
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBpRW51bVByb3BlcnR5QmVzdFByYWN0aWNlcy50ZXN0RGF0YS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9ydWxlcy9hcGlFbnVtUHJvcGVydHlCZXN0UHJhY3RpY2VzL2FwaUVudW1Qcm9wZXJ0eUJlc3RQcmFjdGljZXMudGVzdERhdGEudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsMENBQTBDO0FBQzdCLFFBQUEsU0FBUyxHQUFHO0lBQ3JCO1FBQ0ksVUFBVSxFQUFFOzs7Ozs7Ozs7OztVQVdWO1FBQ0YsaUJBQWlCLEVBQUUsS0FBSztRQUN4QixxQkFBcUIsRUFBRSxJQUFJO1FBQzNCLGdCQUFnQixFQUFFLElBQUk7UUFDdEIsNEJBQTRCLEVBQUUsS0FBSztRQUNuQyxVQUFVLEVBQUUsSUFBSTtRQUNoQixPQUFPLEVBQUUsb0NBQW9DO0tBQ2hEO0lBQ0Q7UUFDSSxVQUFVLEVBQUU7Ozs7Ozs7Ozs7O1VBV1Y7UUFDRixpQkFBaUIsRUFBRSxLQUFLO1FBQ3hCLHFCQUFxQixFQUFFLEtBQUs7UUFDNUIsZ0JBQWdCLEVBQUUsS0FBSztRQUN2Qiw0QkFBNEIsRUFBRSxLQUFLO1FBQ25DLFVBQVUsRUFBRSxJQUFJO1FBQ2hCLE9BQU8sRUFBRSxTQUFTO0tBQ3JCO0lBQ0Q7UUFDSSxVQUFVLEVBQUU7Ozs7Ozs7Ozs7VUFVVjtRQUNGLGlCQUFpQixFQUFFLEtBQUs7UUFDeEIscUJBQXFCLEVBQUUsSUFBSTtRQUMzQixnQkFBZ0IsRUFBRSxLQUFLO1FBQ3ZCLDRCQUE0QixFQUFFLEtBQUs7UUFDbkMsVUFBVSxFQUFFLElBQUk7UUFDaEIsT0FBTyxFQUFFLG9DQUFvQztLQUNoRDtJQUNEO1FBQ0ksVUFBVSxFQUFFOzs7Ozs7Ozs7O1VBVVY7UUFDRixpQkFBaUIsRUFBRSxJQUFJO1FBQ3ZCLHFCQUFxQixFQUFFLElBQUk7UUFDM0IsZ0JBQWdCLEVBQUUsSUFBSTtRQUN0Qiw0QkFBNEIsRUFBRSxLQUFLO1FBQ25DLFVBQVUsRUFBRSxJQUFJO1FBQ2hCLE9BQU8sRUFBRSxtQ0FBbUM7S0FDL0M7SUFDRDtRQUNJLFVBQVUsRUFBRTs7Ozs7Ozs7VUFRVjtRQUNGLGlCQUFpQixFQUFFLEtBQUs7UUFDeEIscUJBQXFCLEVBQUUsS0FBSztRQUM1QixnQkFBZ0IsRUFBRSxLQUFLO1FBQ3ZCLDRCQUE0QixFQUFFLEtBQUs7UUFDbkMsVUFBVSxFQUFFLEtBQUs7UUFDakIsT0FBTyxFQUFFLG9CQUFvQjtLQUNoQztJQUNEO1FBQ0ksVUFBVSxFQUFFOzs7Ozs7OztVQVFWO1FBQ0YsaUJBQWlCLEVBQUUsSUFBSTtRQUN2QixxQkFBcUIsRUFBRSxJQUFJO1FBQzNCLGdCQUFnQixFQUFFLEtBQUs7UUFDdkIsNEJBQTRCLEVBQUUsS0FBSztRQUNuQyxVQUFVLEVBQUUsSUFBSTtRQUNoQixPQUFPLEVBQUUsb0NBQW9DO0tBQ2hEO0lBQ0Q7UUFDSSxVQUFVLEVBQUU7Ozs7Ozs7OztVQVNWO1FBQ0YsaUJBQWlCLEVBQUUsS0FBSztRQUN4QixxQkFBcUIsRUFBRSxLQUFLO1FBQzVCLGdCQUFnQixFQUFFLEtBQUs7UUFDdkIsNEJBQTRCLEVBQUUsSUFBSTtRQUNsQyxVQUFVLEVBQUUsSUFBSTtRQUNoQixPQUFPLEVBQUUsbUNBQW1DO0tBQy9DO0NBQ0osQ0FBQyJ9
|
package/dist/rules/apiMethodsShouldSpecifyApiResponse/apiMethodsShouldSpecifyApiResponse.testData.js
DELETED
|
@@ -1,48 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.testCases = void 0;
|
|
4
|
-
exports.testCases = [
|
|
5
|
-
{
|
|
6
|
-
moduleCode: `class TestClass {
|
|
7
|
-
@Get()
|
|
8
|
-
@ApiOkResponse({ type: String, isArray: true })
|
|
9
|
-
@ApiBadRequestResponse({ description: "Bad Request" })
|
|
10
|
-
public getAll(): Promise<string[]> {
|
|
11
|
-
return [];
|
|
12
|
-
}
|
|
13
|
-
}`,
|
|
14
|
-
shouldUseDecorator: false,
|
|
15
|
-
message: "all good",
|
|
16
|
-
},
|
|
17
|
-
{
|
|
18
|
-
moduleCode: `class TestClass {
|
|
19
|
-
@Get()
|
|
20
|
-
@ApiResponse({ status: 200, type: String })
|
|
21
|
-
public getAll(): Promise<string[]> {
|
|
22
|
-
return [];
|
|
23
|
-
}
|
|
24
|
-
}`,
|
|
25
|
-
shouldUseDecorator: false,
|
|
26
|
-
message: "all good",
|
|
27
|
-
},
|
|
28
|
-
{
|
|
29
|
-
moduleCode: `class TestClass {
|
|
30
|
-
@Get()
|
|
31
|
-
public getAll(): Promise<string[]> {
|
|
32
|
-
return [];
|
|
33
|
-
}
|
|
34
|
-
}`,
|
|
35
|
-
shouldUseDecorator: true,
|
|
36
|
-
message: "no api respones decorator",
|
|
37
|
-
},
|
|
38
|
-
{
|
|
39
|
-
moduleCode: `class TestClass {
|
|
40
|
-
public getAll(): Promise<string[]> {
|
|
41
|
-
return [];
|
|
42
|
-
}
|
|
43
|
-
}`,
|
|
44
|
-
shouldUseDecorator: false,
|
|
45
|
-
message: "not an http method",
|
|
46
|
-
},
|
|
47
|
-
];
|
|
48
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBpTWV0aG9kc1Nob3VsZFNwZWNpZnlBcGlSZXNwb25zZS50ZXN0RGF0YS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9ydWxlcy9hcGlNZXRob2RzU2hvdWxkU3BlY2lmeUFwaVJlc3BvbnNlL2FwaU1ldGhvZHNTaG91bGRTcGVjaWZ5QXBpUmVzcG9uc2UudGVzdERhdGEudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQWEsUUFBQSxTQUFTLEdBQUc7SUFDckI7UUFDSSxVQUFVLEVBQUU7Ozs7Ozs7VUFPVjtRQUNGLGtCQUFrQixFQUFFLEtBQUs7UUFDekIsT0FBTyxFQUFFLFVBQVU7S0FDdEI7SUFDRDtRQUNJLFVBQVUsRUFBRTs7Ozs7O1VBTVY7UUFDRixrQkFBa0IsRUFBRSxLQUFLO1FBQ3pCLE9BQU8sRUFBRSxVQUFVO0tBQ3RCO0lBQ0Q7UUFDSSxVQUFVLEVBQUU7Ozs7O1VBS1Y7UUFDRixrQkFBa0IsRUFBRSxJQUFJO1FBQ3hCLE9BQU8sRUFBRSwyQkFBMkI7S0FDdkM7SUFDRDtRQUNJLFVBQVUsRUFBRTs7OztVQUlWO1FBQ0Ysa0JBQWtCLEVBQUUsS0FBSztRQUN6QixPQUFPLEVBQUUsb0JBQW9CO0tBQ2hDO0NBQ0osQ0FBQyJ9
|
|
@@ -1,55 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.testCases = void 0;
|
|
4
|
-
exports.testCases = [
|
|
5
|
-
{
|
|
6
|
-
moduleCode: `class TestClass {
|
|
7
|
-
@Expose()
|
|
8
|
-
@ApiPropertyOptional()
|
|
9
|
-
thisIsAStringProp?: string;}`,
|
|
10
|
-
shouldUseOptionalDecorator: false,
|
|
11
|
-
shouldUseRequiredDecorator: false,
|
|
12
|
-
message: "optional everywhere",
|
|
13
|
-
},
|
|
14
|
-
{
|
|
15
|
-
moduleCode: `class TestClass {@Expose()
|
|
16
|
-
@ApiPropertyOptional()
|
|
17
|
-
thisIsAStringProp: string;}`,
|
|
18
|
-
shouldUseOptionalDecorator: false,
|
|
19
|
-
shouldUseRequiredDecorator: true,
|
|
20
|
-
message: "optional decorator, required prop",
|
|
21
|
-
},
|
|
22
|
-
{
|
|
23
|
-
moduleCode: `class TestClass {@Expose()
|
|
24
|
-
@ApiPropertyOptional()
|
|
25
|
-
thisIsAStringProp!: string;}`,
|
|
26
|
-
shouldUseOptionalDecorator: false,
|
|
27
|
-
shouldUseRequiredDecorator: true,
|
|
28
|
-
message: "optional decorator, required prop",
|
|
29
|
-
},
|
|
30
|
-
{
|
|
31
|
-
moduleCode: `class TestClass {@Expose()
|
|
32
|
-
@ApiProperty()
|
|
33
|
-
thisIsAStringProp?: string;}`,
|
|
34
|
-
shouldUseOptionalDecorator: true,
|
|
35
|
-
shouldUseRequiredDecorator: false,
|
|
36
|
-
message: "required decorator, optional prop",
|
|
37
|
-
},
|
|
38
|
-
{
|
|
39
|
-
moduleCode: `class TestClass {@Expose()
|
|
40
|
-
@ApiProperty()
|
|
41
|
-
thisIsAStringProp: string | undefined;}`,
|
|
42
|
-
shouldUseOptionalDecorator: true,
|
|
43
|
-
shouldUseRequiredDecorator: false,
|
|
44
|
-
message: "required decorator, optional prop",
|
|
45
|
-
},
|
|
46
|
-
{
|
|
47
|
-
moduleCode: `class TestClass {@Expose()
|
|
48
|
-
@ApiPropertyOptional()
|
|
49
|
-
thisIsAStringProp: string | undefined;}`,
|
|
50
|
-
shouldUseOptionalDecorator: false,
|
|
51
|
-
shouldUseRequiredDecorator: false,
|
|
52
|
-
message: "optional decorator, optional prop",
|
|
53
|
-
},
|
|
54
|
-
];
|
|
55
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBpUHJvcGVydHlNYXRjaGVzUHJvcGVydHlPcHRpb25hbGl0eS50ZXN0RGF0YS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9ydWxlcy9hcGlQcm9wZXJ0eU1hdGNoZXNQcm9wZXJ0eU9wdGlvbmFsaXR5L2FwaVByb3BlcnR5TWF0Y2hlc1Byb3BlcnR5T3B0aW9uYWxpdHkudGVzdERhdGEudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQWEsUUFBQSxTQUFTLEdBQUc7SUFDckI7UUFDSSxVQUFVLEVBQUU7OztxQ0FHaUI7UUFDN0IsMEJBQTBCLEVBQUUsS0FBSztRQUNqQywwQkFBMEIsRUFBRSxLQUFLO1FBQ2pDLE9BQU8sRUFBRSxxQkFBcUI7S0FDakM7SUFDRDtRQUNJLFVBQVUsRUFBRTs7b0NBRWdCO1FBQzVCLDBCQUEwQixFQUFFLEtBQUs7UUFDakMsMEJBQTBCLEVBQUUsSUFBSTtRQUNoQyxPQUFPLEVBQUUsbUNBQW1DO0tBQy9DO0lBQ0Q7UUFDSSxVQUFVLEVBQUU7O3FDQUVpQjtRQUM3QiwwQkFBMEIsRUFBRSxLQUFLO1FBQ2pDLDBCQUEwQixFQUFFLElBQUk7UUFDaEMsT0FBTyxFQUFFLG1DQUFtQztLQUMvQztJQUNEO1FBQ0ksVUFBVSxFQUFFOztxQ0FFaUI7UUFDN0IsMEJBQTBCLEVBQUUsSUFBSTtRQUNoQywwQkFBMEIsRUFBRSxLQUFLO1FBQ2pDLE9BQU8sRUFBRSxtQ0FBbUM7S0FDL0M7SUFDRDtRQUNJLFVBQVUsRUFBRTs7Z0RBRTRCO1FBQ3hDLDBCQUEwQixFQUFFLElBQUk7UUFDaEMsMEJBQTBCLEVBQUUsS0FBSztRQUNqQyxPQUFPLEVBQUUsbUNBQW1DO0tBQy9DO0lBQ0Q7UUFDSSxVQUFVLEVBQUU7O2dEQUU0QjtRQUN4QywwQkFBMEIsRUFBRSxLQUFLO1FBQ2pDLDBCQUEwQixFQUFFLEtBQUs7UUFDakMsT0FBTyxFQUFFLG1DQUFtQztLQUMvQztDQUNKLENBQUMifQ==
|
|
@@ -1,51 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.testCases = void 0;
|
|
4
|
-
exports.testCases = [
|
|
5
|
-
{
|
|
6
|
-
moduleCode: `class TestClass {
|
|
7
|
-
@Expose()
|
|
8
|
-
@ApiPropertyOptional({isArray:true})
|
|
9
|
-
thisIsAStringProp?: string[];}`,
|
|
10
|
-
shouldSetIsArrayFalse: false,
|
|
11
|
-
shouldSetIsArrayTrue: false,
|
|
12
|
-
message: "set ok",
|
|
13
|
-
},
|
|
14
|
-
{
|
|
15
|
-
moduleCode: `class TestClass {
|
|
16
|
-
@Expose()
|
|
17
|
-
@ApiPropertyOptional({isArray:true})
|
|
18
|
-
thisIsAStringProp?: Array<string>;}`,
|
|
19
|
-
shouldSetIsArrayFalse: false,
|
|
20
|
-
shouldSetIsArrayTrue: false,
|
|
21
|
-
message: "set ok",
|
|
22
|
-
},
|
|
23
|
-
{
|
|
24
|
-
moduleCode: `class TestClass {
|
|
25
|
-
@Expose()
|
|
26
|
-
@ApiPropertyOptional({isArray:false})
|
|
27
|
-
thisIsAStringProp?: Array<string>;}`,
|
|
28
|
-
shouldSetIsArrayFalse: false,
|
|
29
|
-
shouldSetIsArrayTrue: true,
|
|
30
|
-
message: "mismatch is array prop",
|
|
31
|
-
},
|
|
32
|
-
{
|
|
33
|
-
moduleCode: `class TestClass {
|
|
34
|
-
@Expose()
|
|
35
|
-
@ApiPropertyOptional()
|
|
36
|
-
thisIsAStringProp?: Array<string>;}`,
|
|
37
|
-
shouldSetIsArrayFalse: false,
|
|
38
|
-
shouldSetIsArrayTrue: true,
|
|
39
|
-
message: "should set tue",
|
|
40
|
-
},
|
|
41
|
-
{
|
|
42
|
-
moduleCode: `class TestClass {
|
|
43
|
-
@Expose()
|
|
44
|
-
@ApiPropertyOptional({isArray:true})
|
|
45
|
-
thisIsAStringProp?: string;}`,
|
|
46
|
-
shouldSetIsArrayFalse: true,
|
|
47
|
-
shouldSetIsArrayTrue: false,
|
|
48
|
-
message: "mismatch not array prop",
|
|
49
|
-
},
|
|
50
|
-
];
|
|
51
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBpUHJvcGVydHlSZXR1cm5pbmdBcnJheVNob3VsZFNldEFycmF5LnRlc3REYXRhLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3J1bGVzL2FwaVByb3BlcnR5UmV0dXJuaW5nQXJyYXlTaG91bGRTZXRBcnJheS9hcGlQcm9wZXJ0eVJldHVybmluZ0FycmF5U2hvdWxkU2V0QXJyYXkudGVzdERhdGEudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQWEsUUFBQSxTQUFTLEdBQUc7SUFDckI7UUFDSSxVQUFVLEVBQUU7Ozt1Q0FHbUI7UUFDL0IscUJBQXFCLEVBQUUsS0FBSztRQUM1QixvQkFBb0IsRUFBRSxLQUFLO1FBQzNCLE9BQU8sRUFBRSxRQUFRO0tBQ3BCO0lBQ0Q7UUFDSSxVQUFVLEVBQUU7Ozs0Q0FHd0I7UUFDcEMscUJBQXFCLEVBQUUsS0FBSztRQUM1QixvQkFBb0IsRUFBRSxLQUFLO1FBQzNCLE9BQU8sRUFBRSxRQUFRO0tBQ3BCO0lBQ0Q7UUFDSSxVQUFVLEVBQUU7Ozs0Q0FHd0I7UUFDcEMscUJBQXFCLEVBQUUsS0FBSztRQUM1QixvQkFBb0IsRUFBRSxJQUFJO1FBQzFCLE9BQU8sRUFBRSx3QkFBd0I7S0FDcEM7SUFDRDtRQUNJLFVBQVUsRUFBRTs7OzRDQUd3QjtRQUNwQyxxQkFBcUIsRUFBRSxLQUFLO1FBQzVCLG9CQUFvQixFQUFFLElBQUk7UUFDMUIsT0FBTyxFQUFFLGdCQUFnQjtLQUM1QjtJQUNEO1FBQ0ksVUFBVSxFQUFFOzs7cUNBR2lCO1FBQzdCLHFCQUFxQixFQUFFLElBQUk7UUFDM0Isb0JBQW9CLEVBQUUsS0FBSztRQUMzQixPQUFPLEVBQUUseUJBQXlCO0tBQ3JDO0NBQ0osQ0FBQyJ9
|
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.testCases = void 0;
|
|
4
|
-
exports.testCases = [
|
|
5
|
-
{
|
|
6
|
-
moduleCode: `
|
|
7
|
-
@ApiTags("my-tag")
|
|
8
|
-
@Controller("my-controller")
|
|
9
|
-
class TestClass {
|
|
10
|
-
}`,
|
|
11
|
-
shouldUseApiTagsDecorator: false,
|
|
12
|
-
message: "all good state",
|
|
13
|
-
},
|
|
14
|
-
{
|
|
15
|
-
moduleCode: `
|
|
16
|
-
@Controller("my-controller")
|
|
17
|
-
class TestClass {
|
|
18
|
-
}`,
|
|
19
|
-
shouldUseApiTagsDecorator: true,
|
|
20
|
-
message: "missing tag",
|
|
21
|
-
},
|
|
22
|
-
{
|
|
23
|
-
moduleCode: `
|
|
24
|
-
class TestClass {
|
|
25
|
-
}`,
|
|
26
|
-
shouldUseApiTagsDecorator: false,
|
|
27
|
-
message: "not a controller",
|
|
28
|
-
},
|
|
29
|
-
];
|
|
30
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udHJvbGxlckRlY29yYXRlZEhhc0FwaVRhZ3MudGVzdERhdGEuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvcnVsZXMvY29udHJvbGxlckRlY29yYXRlZEhhc0FwaVRhZ3MvY29udHJvbGxlckRlY29yYXRlZEhhc0FwaVRhZ3MudGVzdERhdGEudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQWEsUUFBQSxTQUFTLEdBQUc7SUFDckI7UUFDSSxVQUFVLEVBQUU7Ozs7UUFJWjtRQUNBLHlCQUF5QixFQUFFLEtBQUs7UUFDaEMsT0FBTyxFQUFFLGdCQUFnQjtLQUM1QjtJQUNEO1FBQ0ksVUFBVSxFQUFFOzs7UUFHWjtRQUNBLHlCQUF5QixFQUFFLElBQUk7UUFDL0IsT0FBTyxFQUFFLGFBQWE7S0FDekI7SUFDRDtRQUNJLFVBQVUsRUFBRTs7UUFFWjtRQUNBLHlCQUF5QixFQUFFLEtBQUs7UUFDaEMsT0FBTyxFQUFFLGtCQUFrQjtLQUM5QjtDQUNKLENBQUMifQ==
|
package/dist/rules/providerInjectedShouldMatchFactory/ProviderInjectedShouldMatchFactory.testData.js
DELETED
|
@@ -1,82 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.testCases = void 0;
|
|
4
|
-
exports.testCases = [
|
|
5
|
-
{
|
|
6
|
-
moduleCode: `export const MyOtherInjectableProvider: Provider = {
|
|
7
|
-
provide: MyOtherInjectable,
|
|
8
|
-
useFactory: async (
|
|
9
|
-
config: MyService
|
|
10
|
-
): Promise<MyOtherInjectable> => {
|
|
11
|
-
return new MyOtherInjectable()
|
|
12
|
-
},
|
|
13
|
-
inject: [MyService],
|
|
14
|
-
};`,
|
|
15
|
-
hasMismatch: false,
|
|
16
|
-
message: "one injected, one param",
|
|
17
|
-
},
|
|
18
|
-
{
|
|
19
|
-
moduleCode: `export const MyOtherInjectableProvider: NotAProvider = {
|
|
20
|
-
provide: MyOtherInjectable,
|
|
21
|
-
useFactory: async (
|
|
22
|
-
config: MyService
|
|
23
|
-
): Promise<MyOtherInjectable> => {
|
|
24
|
-
return new MyOtherInjectable()
|
|
25
|
-
},
|
|
26
|
-
inject: [MyService],
|
|
27
|
-
};`,
|
|
28
|
-
hasMismatch: false,
|
|
29
|
-
message: "not a nest provider",
|
|
30
|
-
},
|
|
31
|
-
{
|
|
32
|
-
moduleCode: `export const MyOtherInjectableProvider: Provider = {
|
|
33
|
-
provide: MyOtherInjectable,
|
|
34
|
-
useFactory: async (
|
|
35
|
-
): Promise<MyOtherInjectable> => {
|
|
36
|
-
return new MyOtherInjectable()
|
|
37
|
-
},
|
|
38
|
-
inject: [],
|
|
39
|
-
};`,
|
|
40
|
-
hasMismatch: false,
|
|
41
|
-
message: "empty inject, no params",
|
|
42
|
-
},
|
|
43
|
-
{
|
|
44
|
-
moduleCode: `export const MyOtherInjectableProvider: Provider = {
|
|
45
|
-
provide: MyOtherInjectable,
|
|
46
|
-
useFactory: async (
|
|
47
|
-
): Promise<MyOtherInjectable> => {
|
|
48
|
-
return new MyOtherInjectable()
|
|
49
|
-
}
|
|
50
|
-
};`,
|
|
51
|
-
hasMismatch: false,
|
|
52
|
-
message: "no inject, no params",
|
|
53
|
-
},
|
|
54
|
-
{
|
|
55
|
-
moduleCode: `export const MyOtherInjectableProvider: Provider = {
|
|
56
|
-
provide: MyOtherInjectable,
|
|
57
|
-
useFactory: async (
|
|
58
|
-
config: MyService
|
|
59
|
-
): Promise<MyOtherInjectable> => {
|
|
60
|
-
return new MyOtherInjectable()
|
|
61
|
-
},
|
|
62
|
-
inject: [MyService,SecondService],
|
|
63
|
-
};`,
|
|
64
|
-
hasMismatch: true,
|
|
65
|
-
message: "two injected, one param",
|
|
66
|
-
},
|
|
67
|
-
{
|
|
68
|
-
moduleCode: `export const MyOtherInjectableProvider: Provider = {
|
|
69
|
-
provide: MyOtherInjectable,
|
|
70
|
-
useFactory: async (
|
|
71
|
-
config: MyService,
|
|
72
|
-
configTwo: MySecondService
|
|
73
|
-
): Promise<MyOtherInjectable> => {
|
|
74
|
-
return new MyOtherInjectable()
|
|
75
|
-
},
|
|
76
|
-
inject: [MyService],
|
|
77
|
-
};`,
|
|
78
|
-
hasMismatch: true,
|
|
79
|
-
message: "one injected, two param",
|
|
80
|
-
},
|
|
81
|
-
];
|
|
82
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUHJvdmlkZXJJbmplY3RlZFNob3VsZE1hdGNoRmFjdG9yeS50ZXN0RGF0YS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9ydWxlcy9wcm92aWRlckluamVjdGVkU2hvdWxkTWF0Y2hGYWN0b3J5L1Byb3ZpZGVySW5qZWN0ZWRTaG91bGRNYXRjaEZhY3RvcnkudGVzdERhdGEudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQWEsUUFBQSxTQUFTLEdBQUc7SUFDckI7UUFDSSxVQUFVLEVBQUU7Ozs7Ozs7O09BUWI7UUFDQyxXQUFXLEVBQUUsS0FBSztRQUNsQixPQUFPLEVBQUUseUJBQXlCO0tBQ3JDO0lBQ0Q7UUFDSSxVQUFVLEVBQUU7Ozs7Ozs7O09BUWI7UUFDQyxXQUFXLEVBQUUsS0FBSztRQUNsQixPQUFPLEVBQUUscUJBQXFCO0tBQ2pDO0lBQ0Q7UUFDSSxVQUFVLEVBQUU7Ozs7Ozs7T0FPYjtRQUNDLFdBQVcsRUFBRSxLQUFLO1FBQ2xCLE9BQU8sRUFBRSx5QkFBeUI7S0FDckM7SUFFRDtRQUNJLFVBQVUsRUFBRTs7Ozs7O09BTWI7UUFDQyxXQUFXLEVBQUUsS0FBSztRQUNsQixPQUFPLEVBQUUsc0JBQXNCO0tBQ2xDO0lBQ0Q7UUFDSSxVQUFVLEVBQUU7Ozs7Ozs7O09BUWI7UUFDQyxXQUFXLEVBQUUsSUFBSTtRQUNqQixPQUFPLEVBQUUseUJBQXlCO0tBQ3JDO0lBQ0Q7UUFDSSxVQUFVLEVBQUU7Ozs7Ozs7OztPQVNiO1FBQ0MsV0FBVyxFQUFFLElBQUk7UUFDakIsT0FBTyxFQUFFLHlCQUF5QjtLQUNyQztDQUNKLENBQUMifQ==
|
|
@@ -1,138 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.testCases = void 0;
|
|
4
|
-
/* eslint-disable unicorn/filename-case */
|
|
5
|
-
exports.testCases = [
|
|
6
|
-
{
|
|
7
|
-
moduleCode: `
|
|
8
|
-
const options = {
|
|
9
|
-
forbidNonWhitelisted: true,
|
|
10
|
-
forbidUnknownValues: true,
|
|
11
|
-
} as ValidationPipeOptions;
|
|
12
|
-
|
|
13
|
-
const validationPipeA = new ValidationPipe(options);
|
|
14
|
-
|
|
15
|
-
const validationPipeB = new ValidationPipe({
|
|
16
|
-
transform: true,
|
|
17
|
-
skipMissingProperties: false,
|
|
18
|
-
whitelist: true,
|
|
19
|
-
forbidNonWhitelisted: true,
|
|
20
|
-
forbidUnknownValues: true,
|
|
21
|
-
});
|
|
22
|
-
`,
|
|
23
|
-
isNewExpressionTriggered: false,
|
|
24
|
-
isVariableExpressionTriggered: false,
|
|
25
|
-
message: "property is present in both scenarios",
|
|
26
|
-
},
|
|
27
|
-
{
|
|
28
|
-
moduleCode: `
|
|
29
|
-
const options = {
|
|
30
|
-
forbidNonWhitelisted: true,
|
|
31
|
-
} as ValidationPipeOptions;
|
|
32
|
-
|
|
33
|
-
const validationPipeA = new ValidationPipe(options);
|
|
34
|
-
|
|
35
|
-
const validationPipeB = new ValidationPipe({
|
|
36
|
-
transform: true,
|
|
37
|
-
skipMissingProperties: false,
|
|
38
|
-
whitelist: true,
|
|
39
|
-
forbidNonWhitelisted: true,
|
|
40
|
-
forbidUnknownValues: true,
|
|
41
|
-
});
|
|
42
|
-
`,
|
|
43
|
-
isNewExpressionTriggered: false,
|
|
44
|
-
isVariableExpressionTriggered: true,
|
|
45
|
-
message: "property is missing in options object variable",
|
|
46
|
-
},
|
|
47
|
-
{
|
|
48
|
-
moduleCode: `
|
|
49
|
-
const options = {
|
|
50
|
-
forbidNonWhitelisted: true,
|
|
51
|
-
} as ThisIsNotAValidationPipeOptionsClass;
|
|
52
|
-
|
|
53
|
-
const validationPipeA = new ValidationPipe(options);
|
|
54
|
-
|
|
55
|
-
const validationPipeB = new ValidationPipe({
|
|
56
|
-
transform: true,
|
|
57
|
-
skipMissingProperties: false,
|
|
58
|
-
whitelist: true,
|
|
59
|
-
forbidNonWhitelisted: true,
|
|
60
|
-
forbidUnknownValues: true,
|
|
61
|
-
});
|
|
62
|
-
`,
|
|
63
|
-
isNewExpressionTriggered: false,
|
|
64
|
-
isVariableExpressionTriggered: false,
|
|
65
|
-
message: "not a validation options class",
|
|
66
|
-
},
|
|
67
|
-
{
|
|
68
|
-
moduleCode: `
|
|
69
|
-
const options = {
|
|
70
|
-
forbidNonWhitelisted: true,
|
|
71
|
-
forbidUnknownValues: true,
|
|
72
|
-
} as ValidationPipeOptions;
|
|
73
|
-
|
|
74
|
-
const validationPipeA = new ValidationPipe(options);
|
|
75
|
-
|
|
76
|
-
const validationPipeB = new ValidationPipe({
|
|
77
|
-
transform: true,
|
|
78
|
-
skipMissingProperties: false,
|
|
79
|
-
whitelist: true,
|
|
80
|
-
forbidNonWhitelisted: true
|
|
81
|
-
});
|
|
82
|
-
`,
|
|
83
|
-
isNewExpressionTriggered: true,
|
|
84
|
-
isVariableExpressionTriggered: false,
|
|
85
|
-
message: "property is missing in parameter declaration",
|
|
86
|
-
},
|
|
87
|
-
{
|
|
88
|
-
moduleCode: `
|
|
89
|
-
const options = {
|
|
90
|
-
forbidNonWhitelisted: true,
|
|
91
|
-
forbidUnknownValues: true,
|
|
92
|
-
} as ValidationPipeOptions;
|
|
93
|
-
|
|
94
|
-
const validationPipeA = new ValidationPipe(options);
|
|
95
|
-
|
|
96
|
-
const validationPipeB = new ThisIsNotAValidationPipeClass({
|
|
97
|
-
transform: true,
|
|
98
|
-
skipMissingProperties: false,
|
|
99
|
-
whitelist: true,
|
|
100
|
-
forbidNonWhitelisted: true
|
|
101
|
-
});
|
|
102
|
-
`,
|
|
103
|
-
isNewExpressionTriggered: false,
|
|
104
|
-
isVariableExpressionTriggered: false,
|
|
105
|
-
message: "not the right class to trigger the rule",
|
|
106
|
-
},
|
|
107
|
-
{
|
|
108
|
-
moduleCode: `
|
|
109
|
-
const options = {
|
|
110
|
-
forbidNonWhitelisted: true,
|
|
111
|
-
forbidUnknownValues: true,
|
|
112
|
-
} as ValidationPipeOptions;
|
|
113
|
-
|
|
114
|
-
const validationPipeA = new ValidationPipe(options);
|
|
115
|
-
|
|
116
|
-
const validationPipeB = new ValidationPipe({});
|
|
117
|
-
`,
|
|
118
|
-
isNewExpressionTriggered: true,
|
|
119
|
-
isVariableExpressionTriggered: false,
|
|
120
|
-
message: "empty options object should trigger",
|
|
121
|
-
},
|
|
122
|
-
{
|
|
123
|
-
moduleCode: `
|
|
124
|
-
const options = {
|
|
125
|
-
forbidNonWhitelisted: true,
|
|
126
|
-
forbidUnknownValues: true,
|
|
127
|
-
} as ValidationPipeOptions;
|
|
128
|
-
|
|
129
|
-
const validationPipeA = new ValidationPipe(options);
|
|
130
|
-
|
|
131
|
-
const validationPipeB = new ValidationPipe();
|
|
132
|
-
`,
|
|
133
|
-
isNewExpressionTriggered: false,
|
|
134
|
-
isVariableExpressionTriggered: false,
|
|
135
|
-
message: "empty constructor should not trigger the rule",
|
|
136
|
-
},
|
|
137
|
-
];
|
|
138
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVsZS50ZXN0RGF0YS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9ydWxlcy9zaG91bGRTcGVjaWZ5Rm9yYmlkVW5rbm93blZhbHVlcy9ydWxlLnRlc3REYXRhLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLDBDQUEwQztBQUM3QixRQUFBLFNBQVMsR0FBRztJQUNyQjtRQUNJLFVBQVUsRUFBRTs7Ozs7Ozs7Ozs7Ozs7O1NBZVg7UUFDRCx3QkFBd0IsRUFBRSxLQUFLO1FBQy9CLDZCQUE2QixFQUFFLEtBQUs7UUFDcEMsT0FBTyxFQUFFLHVDQUF1QztLQUNuRDtJQUNEO1FBQ0ksVUFBVSxFQUFFOzs7Ozs7Ozs7Ozs7OztTQWNYO1FBQ0Qsd0JBQXdCLEVBQUUsS0FBSztRQUMvQiw2QkFBNkIsRUFBRSxJQUFJO1FBQ25DLE9BQU8sRUFBRSxnREFBZ0Q7S0FDNUQ7SUFDRDtRQUNJLFVBQVUsRUFBRTs7Ozs7Ozs7Ozs7Ozs7U0FjWDtRQUNELHdCQUF3QixFQUFFLEtBQUs7UUFDL0IsNkJBQTZCLEVBQUUsS0FBSztRQUNwQyxPQUFPLEVBQUUsZ0NBQWdDO0tBQzVDO0lBQ0Q7UUFDSSxVQUFVLEVBQUU7Ozs7Ozs7Ozs7Ozs7O1NBY1g7UUFDRCx3QkFBd0IsRUFBRSxJQUFJO1FBQzlCLDZCQUE2QixFQUFFLEtBQUs7UUFDcEMsT0FBTyxFQUFFLDhDQUE4QztLQUMxRDtJQUNEO1FBQ0ksVUFBVSxFQUFFOzs7Ozs7Ozs7Ozs7OztTQWNYO1FBQ0Qsd0JBQXdCLEVBQUUsS0FBSztRQUMvQiw2QkFBNkIsRUFBRSxLQUFLO1FBQ3BDLE9BQU8sRUFBRSx5Q0FBeUM7S0FDckQ7SUFDRDtRQUNJLFVBQVUsRUFBRTs7Ozs7Ozs7O1NBU1g7UUFDRCx3QkFBd0IsRUFBRSxJQUFJO1FBQzlCLDZCQUE2QixFQUFFLEtBQUs7UUFDcEMsT0FBTyxFQUFFLHFDQUFxQztLQUNqRDtJQUNEO1FBQ0ksVUFBVSxFQUFFOzs7Ozs7Ozs7U0FTWDtRQUNELHdCQUF3QixFQUFFLEtBQUs7UUFDL0IsNkJBQTZCLEVBQUUsS0FBSztRQUNwQyxPQUFPLEVBQUUsK0NBQStDO0tBQzNEO0NBQ0osQ0FBQyJ9
|