@darraghor/eslint-plugin-nestjs-typed 3.7.0 → 3.8.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 +40 -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 +2 -1
- package/dist/rules/{noWhitelistedProperties/noWhitelistedProperties.d.ts → allPropertiesAreWhitelisted/allPropertiesAreWhitelisted.d.ts} +0 -0
- package/dist/rules/{noWhitelistedProperties/noWhitelistedProperties.js → allPropertiesAreWhitelisted/allPropertiesAreWhitelisted.js} +4 -4
- package/dist/rules/index.d.ts +1 -1
- package/dist/rules/index.js +3 -3
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -28,6 +28,7 @@ Preventing bugs
|
|
|
28
28
|
- param-decorator-name-matches-route-param
|
|
29
29
|
- validate-nested-of-array-should-set-each
|
|
30
30
|
- validated-non-primitive-property-needs-type-decorator
|
|
31
|
+
- all-properties-are-whitelisted
|
|
31
32
|
|
|
32
33
|
Security
|
|
33
34
|
|
|
@@ -114,6 +115,45 @@ Disable a single rule with the full name e.g. in your eslint configuration...
|
|
|
114
115
|
|
|
115
116
|
## Rule Details
|
|
116
117
|
|
|
118
|
+
### Rule: all-properties-are-whitelisted
|
|
119
|
+
|
|
120
|
+
You should forbid non-whitelisted properties in your DTOs.
|
|
121
|
+
|
|
122
|
+
If you have a DTO that has one property with a class-validator decorator, it's very unlikely that the same DTO will have any properties without a decorator - i.e. ALL DTO properties should be validated or explicitly whitelisted with `@Allow()`.
|
|
123
|
+
|
|
124
|
+
This rule will flag any properties that are not whitelisted as expected because it's probably a mistake.
|
|
125
|
+
|
|
126
|
+
This PASSES - all properties are decorated
|
|
127
|
+
|
|
128
|
+
```ts
|
|
129
|
+
export class CreateOrganisationDto {
|
|
130
|
+
@ApiProperty({type: Person, isArray: true})
|
|
131
|
+
@ValidateNested({each: true})
|
|
132
|
+
members!: MyClass[];
|
|
133
|
+
|
|
134
|
+
@ApiProperty()
|
|
135
|
+
@Allow()
|
|
136
|
+
otherProperty!: MyClass;
|
|
137
|
+
|
|
138
|
+
@ApiProperty()
|
|
139
|
+
@IsString()
|
|
140
|
+
someStringProperty!: string;
|
|
141
|
+
}
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
This FAILS - one property here is missing a validation decorator. This is likely a mistake.
|
|
145
|
+
|
|
146
|
+
```ts
|
|
147
|
+
export class CreateOrganisationDto {
|
|
148
|
+
@ApiProperty({type: Person, isArray: true})
|
|
149
|
+
@ValidateNested({each: true})
|
|
150
|
+
members!: MyClass[];
|
|
151
|
+
|
|
152
|
+
@ApiProperty()
|
|
153
|
+
otherProperty!: MyClass;
|
|
154
|
+
}
|
|
155
|
+
```
|
|
156
|
+
|
|
117
157
|
### Rule: validate-nested-of-array-should-set-each
|
|
118
158
|
|
|
119
159
|
If you use the `@ValidateNested` decorator you should specify the `{each: true}` option if the property is an array.
|
package/dist/configs/index.d.ts
CHANGED
|
@@ -19,6 +19,7 @@ declare const allConfigs: {
|
|
|
19
19
|
"@darraghor/nestjs-typed/param-decorator-name-matches-route-param": string;
|
|
20
20
|
"@darraghor/nestjs-typed/validated-non-primitive-property-needs-type-decorator": string;
|
|
21
21
|
"@darraghor/nestjs-typed/validate-nested-of-array-should-set-each": string;
|
|
22
|
+
"@darraghor/nestjs-typed/all-properties-are-whitelisted": string;
|
|
22
23
|
};
|
|
23
24
|
};
|
|
24
25
|
"no-swagger": {
|
|
@@ -18,6 +18,7 @@ declare const _default: {
|
|
|
18
18
|
"@darraghor/nestjs-typed/param-decorator-name-matches-route-param": string;
|
|
19
19
|
"@darraghor/nestjs-typed/validated-non-primitive-property-needs-type-decorator": string;
|
|
20
20
|
"@darraghor/nestjs-typed/validate-nested-of-array-should-set-each": string;
|
|
21
|
+
"@darraghor/nestjs-typed/all-properties-are-whitelisted": string;
|
|
21
22
|
};
|
|
22
23
|
};
|
|
23
24
|
export = _default;
|
|
@@ -21,6 +21,7 @@ module.exports = {
|
|
|
21
21
|
"@darraghor/nestjs-typed/param-decorator-name-matches-route-param": "error",
|
|
22
22
|
"@darraghor/nestjs-typed/validated-non-primitive-property-needs-type-decorator": "error",
|
|
23
23
|
"@darraghor/nestjs-typed/validate-nested-of-array-should-set-each": "error",
|
|
24
|
+
"@darraghor/nestjs-typed/all-properties-are-whitelisted": "error",
|
|
24
25
|
},
|
|
25
26
|
};
|
|
26
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
27
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVjb21tZW5kZWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY29uZmlncy9yZWNvbW1lbmRlZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsaUJBQVM7SUFDTCxNQUFNLEVBQUUsMkJBQTJCO0lBQ25DLGFBQWEsRUFBRSxFQUFDLFVBQVUsRUFBRSxRQUFRLEVBQUM7SUFDckMsS0FBSyxFQUFFO1FBQ0gsMkRBQTJEO1FBQzNELDJFQUEyRSxFQUN2RSxPQUFPO1FBQ1gsdURBQXVELEVBQUU7WUFDckQsT0FBTztZQUNQO2dCQUNJLEdBQUcsRUFBRSxDQUFDLGFBQWEsQ0FBQztnQkFDcEIsZUFBZSxFQUFFLENBQUMsY0FBYyxFQUFFLFFBQVEsRUFBRSxRQUFRLENBQUM7YUFDeEQ7U0FDSjtRQUNELG1FQUFtRSxFQUMvRCxPQUFPO1FBQ1gsZ0VBQWdFLEVBQzVELE9BQU87UUFDWCw0REFBNEQsRUFBRSxPQUFPO1FBQ3JFLDBEQUEwRCxFQUFFLE9BQU87UUFDbkUsdUVBQXVFLEVBQ25FLE9BQU87UUFDWCw4REFBOEQsRUFBRSxPQUFPO1FBQ3ZFLGtFQUFrRSxFQUM5RCxPQUFPO1FBQ1gsK0VBQStFLEVBQzNFLE9BQU87UUFDWCxrRUFBa0UsRUFDOUQsT0FBTztRQUNYLHdEQUF3RCxFQUFFLE9BQU87S0FDcEU7Q0FDSixDQUFDIn0=
|
package/dist/index.d.ts
CHANGED
|
@@ -35,7 +35,7 @@ declare const configuration: {
|
|
|
35
35
|
"validate-nested-of-array-should-set-each": import("@typescript-eslint/experimental-utils/dist/ts-eslint/Rule").RuleModule<"shouldSetEachPropertyTrue" | "shouldSetEachPropertyFalse", never[], {
|
|
36
36
|
PropertyDefinition: (node: import("@typescript-eslint/types/dist/ast-spec").Node) => void;
|
|
37
37
|
}>;
|
|
38
|
-
"
|
|
38
|
+
"all-properties-are-whitelisted": import("@typescript-eslint/experimental-utils/dist/ts-eslint/Rule").RuleModule<"missing-property-decorator", never[], {
|
|
39
39
|
ClassDeclaration(node: import("@typescript-eslint/types/dist/ast-spec").ClassDeclaration): void;
|
|
40
40
|
}>;
|
|
41
41
|
};
|
|
@@ -60,6 +60,7 @@ declare const configuration: {
|
|
|
60
60
|
"@darraghor/nestjs-typed/param-decorator-name-matches-route-param": string;
|
|
61
61
|
"@darraghor/nestjs-typed/validated-non-primitive-property-needs-type-decorator": string;
|
|
62
62
|
"@darraghor/nestjs-typed/validate-nested-of-array-should-set-each": string;
|
|
63
|
+
"@darraghor/nestjs-typed/all-properties-are-whitelisted": string;
|
|
63
64
|
};
|
|
64
65
|
};
|
|
65
66
|
"no-swagger": {
|
|
File without changes
|
|
@@ -24,15 +24,15 @@ const classValidator = __importStar(require("class-validator"));
|
|
|
24
24
|
const createRule_1 = require("../../utils/createRule");
|
|
25
25
|
const CLASS_VALIDATOR_DECORATOR_NAMES = new Set(Object.keys(classValidator));
|
|
26
26
|
const rule = (0, createRule_1.createRule)({
|
|
27
|
-
name: "
|
|
27
|
+
name: "all-properties-are-whitelisted",
|
|
28
28
|
meta: {
|
|
29
29
|
docs: {
|
|
30
|
-
description: "Enforce
|
|
30
|
+
description: "Enforce all properties are whitelisted",
|
|
31
31
|
recommended: "error",
|
|
32
32
|
requiresTypeChecking: false,
|
|
33
33
|
},
|
|
34
34
|
messages: {
|
|
35
|
-
"missing-property-decorator": "Property has no class-validator decorator (use @Allow
|
|
35
|
+
"missing-property-decorator": "Property has no class-validator decorator (use @Allow() if you don't need a validation)",
|
|
36
36
|
},
|
|
37
37
|
type: "problem",
|
|
38
38
|
schema: {},
|
|
@@ -74,4 +74,4 @@ const rule = (0, createRule_1.createRule)({
|
|
|
74
74
|
},
|
|
75
75
|
});
|
|
76
76
|
exports.default = rule;
|
|
77
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
77
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWxsUHJvcGVydGllc0FyZVdoaXRlbGlzdGVkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3J1bGVzL2FsbFByb3BlcnRpZXNBcmVXaGl0ZWxpc3RlZC9hbGxQcm9wZXJ0aWVzQXJlV2hpdGVsaXN0ZWQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsOEVBQXFFO0FBRXJFLGdFQUFrRDtBQUNsRCx1REFBa0Q7QUFFbEQsTUFBTSwrQkFBK0IsR0FBRyxJQUFJLEdBQUcsQ0FDM0MsTUFBTSxDQUFDLElBQUksQ0FBQyxjQUF3QixDQUFDLENBQ3hDLENBQUM7QUFFRixNQUFNLElBQUksR0FBRyxJQUFBLHVCQUFVLEVBQUM7SUFDcEIsSUFBSSxFQUFFLGdDQUFnQztJQUN0QyxJQUFJLEVBQUU7UUFDRixJQUFJLEVBQUU7WUFDRixXQUFXLEVBQUUsd0NBQXdDO1lBQ3JELFdBQVcsRUFBRSxPQUFPO1lBQ3BCLG9CQUFvQixFQUFFLEtBQUs7U0FDOUI7UUFDRCxRQUFRLEVBQUU7WUFDTiw0QkFBNEIsRUFDeEIseUZBQXlGO1NBQ2hHO1FBQ0QsSUFBSSxFQUFFLFNBQVM7UUFDZixNQUFNLEVBQUUsRUFBRTtLQUNiO0lBQ0QsY0FBYyxFQUFFLEVBQUU7SUFDbEIsTUFBTSxFQUFFLFVBQVUsT0FBTztRQUNyQixPQUFPO1lBQ0gsZ0VBQWdFO1lBQ2hFLGdCQUFnQixDQUFDLElBQUk7O2dCQUNqQixNQUFNLGFBQWEsR0FBeUIsRUFBRSxDQUFDO2dCQUMvQyxNQUFNLGdCQUFnQixHQUF5QixFQUFFLENBQUM7Z0JBQ2xELEtBQUssTUFBTSxPQUFPLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUU7b0JBQ2xDLElBQUksT0FBTyxDQUFDLElBQUksS0FBSyxtQ0FBYyxDQUFDLGtCQUFrQixFQUFFO3dCQUNwRCxTQUFTO3FCQUNaO29CQUNELE1BQU0sWUFBWSxHQUFHLE1BQUEsT0FBTyxDQUFDLFVBQVUsMENBQUUsSUFBSSxDQUN6QyxDQUFDLFNBQVMsRUFBRSxFQUFFLENBQ1YsU0FBUyxDQUFDLFVBQVUsQ0FBQyxJQUFJO3dCQUNyQixtQ0FBYyxDQUFDLGNBQWM7d0JBQ2pDLFNBQVMsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLElBQUk7NEJBQzVCLG1DQUFjLENBQUMsVUFBVTt3QkFDN0IsK0JBQStCLENBQUMsR0FBRyxDQUMvQixTQUFTLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQ25DLENBQ1IsQ0FBQztvQkFDRixJQUFJLFlBQVksRUFBRTt3QkFDZCxhQUFhLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO3FCQUMvQjt5QkFBTTt3QkFDSCxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7cUJBQ2xDO2lCQUNKO2dCQUNELElBQUksYUFBYSxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksZ0JBQWdCLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtvQkFDekQsS0FBSyxNQUFNLE9BQU8sSUFBSSxnQkFBZ0IsRUFBRTt3QkFDcEMsT0FBTyxDQUFDLE1BQU0sQ0FBQzs0QkFDWCxJQUFJLEVBQUUsT0FBTzs0QkFDYixTQUFTLEVBQUUsNEJBQTRCO3lCQUMxQyxDQUFDLENBQUM7cUJBQ047aUJBQ0o7WUFDTCxDQUFDO1NBQ0osQ0FBQztJQUNOLENBQUM7Q0FDSixDQUFDLENBQUM7QUFFSCxrQkFBZSxJQUFJLENBQUMifQ==
|
package/dist/rules/index.d.ts
CHANGED
|
@@ -34,7 +34,7 @@ declare const allRules: {
|
|
|
34
34
|
"validate-nested-of-array-should-set-each": import("@typescript-eslint/experimental-utils/dist/ts-eslint/Rule").RuleModule<"shouldSetEachPropertyTrue" | "shouldSetEachPropertyFalse", never[], {
|
|
35
35
|
PropertyDefinition: (node: import("@typescript-eslint/types/dist/ast-spec").Node) => void;
|
|
36
36
|
}>;
|
|
37
|
-
"
|
|
37
|
+
"all-properties-are-whitelisted": import("@typescript-eslint/experimental-utils/dist/ts-eslint/Rule").RuleModule<"missing-property-decorator", never[], {
|
|
38
38
|
ClassDeclaration(node: import("@typescript-eslint/types/dist/ast-spec").ClassDeclaration): void;
|
|
39
39
|
}>;
|
|
40
40
|
};
|
package/dist/rules/index.js
CHANGED
|
@@ -14,7 +14,7 @@ const shouldSpecifyForbidUnknownValuesRule_1 = __importDefault(require("./should
|
|
|
14
14
|
const paramDecoratorNameMatchesRouteParam_1 = __importDefault(require("./paramDecoratorNameMatchesRouteParam/paramDecoratorNameMatchesRouteParam"));
|
|
15
15
|
const validateNonPrimitiveNeedsDecorators_1 = __importDefault(require("./validate-non-primitves-needs-type-decorator/validateNonPrimitiveNeedsDecorators"));
|
|
16
16
|
const validateNestedOfArrayShouldSetEach_1 = __importDefault(require("./validateNestedOfArrayShouldSetEach/validateNestedOfArrayShouldSetEach"));
|
|
17
|
-
const
|
|
17
|
+
const allPropertiesAreWhitelisted_1 = __importDefault(require("./allPropertiesAreWhitelisted/allPropertiesAreWhitelisted"));
|
|
18
18
|
const allRules = {
|
|
19
19
|
"api-property-matches-property-optionality": apiPropertyMatchesPropertyOptionality_1.default,
|
|
20
20
|
"injectable-should-be-provided": injectableShouldBeProvided_1.default,
|
|
@@ -27,7 +27,7 @@ const allRules = {
|
|
|
27
27
|
"param-decorator-name-matches-route-param": paramDecoratorNameMatchesRouteParam_1.default,
|
|
28
28
|
"validated-non-primitive-property-needs-type-decorator": validateNonPrimitiveNeedsDecorators_1.default,
|
|
29
29
|
"validate-nested-of-array-should-set-each": validateNestedOfArrayShouldSetEach_1.default,
|
|
30
|
-
"
|
|
30
|
+
"all-properties-are-whitelisted": allPropertiesAreWhitelisted_1.default,
|
|
31
31
|
};
|
|
32
32
|
exports.default = allRules;
|
|
33
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
33
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcnVsZXMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSwwSEFBa0c7QUFDbEcsaUpBQW1JO0FBQ25JLDBKQUFrSTtBQUNsSSxrSUFBMEc7QUFDMUcsaUpBQXlIO0FBQ3pILCtIQUF1RztBQUN2RyxnS0FBd0k7QUFDeEksbUpBQXVIO0FBQ3ZILG9KQUFnSTtBQUNoSSw0SkFBb0k7QUFDcEksaUpBQXlIO0FBQ3pILDRIQUFvRztBQUVwRyxNQUFNLFFBQVEsR0FBRztJQUNiLDJDQUEyQyxFQUN2QywrQ0FBcUM7SUFDekMsK0JBQStCLEVBQUUsb0NBQTBCO0lBQzNELG1EQUFtRCxFQUMvQyw0Q0FBNEM7SUFDaEQsb0NBQW9DLEVBQUUsdUNBQTZCO0lBQ25FLHdDQUF3QyxFQUNwQyw0Q0FBa0M7SUFDdEMsa0NBQWtDLEVBQUUsc0NBQTRCO0lBQ2hFLCtDQUErQyxFQUMzQyxpREFBdUM7SUFDM0Msc0NBQXNDLEVBQUUsOENBQWdDO0lBQ3hFLDBDQUEwQyxFQUN0Qyw2Q0FBdUM7SUFDM0MsdURBQXVELEVBQ25ELDZDQUFtQztJQUN2QywwQ0FBMEMsRUFDdEMsNENBQWtDO0lBQ3RDLGdDQUFnQyxFQUFFLHFDQUEyQjtDQUNoRSxDQUFDO0FBRUYsa0JBQWUsUUFBUSxDQUFDIn0=
|