@darraghor/eslint-plugin-nestjs-typed 3.6.1 → 3.9.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 +4 -0
- package/dist/rules/allPropertiesAreWhitelisted/allPropertiesAreWhitelisted.d.ts +4 -0
- package/dist/rules/allPropertiesAreWhitelisted/allPropertiesAreWhitelisted.js +77 -0
- package/dist/rules/index.d.ts +3 -0
- package/dist/rules/index.js +3 -1
- package/dist/rules/validate-non-primitves-needs-type-decorator/validateNonPrimitiveNeedsDecorators.js +16 -6
- package/dist/utils/typedTokenHelpers.js +8 -1
- package/package.json +3 -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,6 +35,9 @@ 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
|
+
"all-properties-are-whitelisted": import("@typescript-eslint/experimental-utils/dist/ts-eslint/Rule").RuleModule<"missing-property-decorator", never[], {
|
|
39
|
+
ClassDeclaration(node: import("@typescript-eslint/types/dist/ast-spec").ClassDeclaration): void;
|
|
40
|
+
}>;
|
|
38
41
|
};
|
|
39
42
|
configs: {
|
|
40
43
|
recommended: {
|
|
@@ -57,6 +60,7 @@ declare const configuration: {
|
|
|
57
60
|
"@darraghor/nestjs-typed/param-decorator-name-matches-route-param": string;
|
|
58
61
|
"@darraghor/nestjs-typed/validated-non-primitive-property-needs-type-decorator": string;
|
|
59
62
|
"@darraghor/nestjs-typed/validate-nested-of-array-should-set-each": string;
|
|
63
|
+
"@darraghor/nestjs-typed/all-properties-are-whitelisted": string;
|
|
60
64
|
};
|
|
61
65
|
};
|
|
62
66
|
"no-swagger": {
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
|
|
5
|
+
}) : (function(o, m, k, k2) {
|
|
6
|
+
if (k2 === undefined) k2 = k;
|
|
7
|
+
o[k2] = m[k];
|
|
8
|
+
}));
|
|
9
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
10
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
11
|
+
}) : function(o, v) {
|
|
12
|
+
o["default"] = v;
|
|
13
|
+
});
|
|
14
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
15
|
+
if (mod && mod.__esModule) return mod;
|
|
16
|
+
var result = {};
|
|
17
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
18
|
+
__setModuleDefault(result, mod);
|
|
19
|
+
return result;
|
|
20
|
+
};
|
|
21
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
22
|
+
const experimental_utils_1 = require("@typescript-eslint/experimental-utils");
|
|
23
|
+
const classValidator = __importStar(require("class-validator"));
|
|
24
|
+
const createRule_1 = require("../../utils/createRule");
|
|
25
|
+
const CLASS_VALIDATOR_DECORATOR_NAMES = new Set(Object.keys(classValidator));
|
|
26
|
+
const rule = (0, createRule_1.createRule)({
|
|
27
|
+
name: "all-properties-are-whitelisted",
|
|
28
|
+
meta: {
|
|
29
|
+
docs: {
|
|
30
|
+
description: "Enforce all properties are whitelisted",
|
|
31
|
+
recommended: "error",
|
|
32
|
+
requiresTypeChecking: false,
|
|
33
|
+
},
|
|
34
|
+
messages: {
|
|
35
|
+
"missing-property-decorator": "Property has no class-validator decorator (use @Allow() if you don't need a validation)",
|
|
36
|
+
},
|
|
37
|
+
type: "problem",
|
|
38
|
+
schema: {},
|
|
39
|
+
},
|
|
40
|
+
defaultOptions: [],
|
|
41
|
+
create: function (context) {
|
|
42
|
+
return {
|
|
43
|
+
// eslint-disable-next-line @typescript-eslint/naming-convention
|
|
44
|
+
ClassDeclaration(node) {
|
|
45
|
+
var _a;
|
|
46
|
+
const withDecorator = [];
|
|
47
|
+
const withoutDecorator = [];
|
|
48
|
+
for (const element of node.body.body) {
|
|
49
|
+
if (element.type !== experimental_utils_1.AST_NODE_TYPES.PropertyDefinition) {
|
|
50
|
+
continue;
|
|
51
|
+
}
|
|
52
|
+
const hasDecorator = (_a = element.decorators) === null || _a === void 0 ? void 0 : _a.some((decorator) => decorator.expression.type ===
|
|
53
|
+
experimental_utils_1.AST_NODE_TYPES.CallExpression &&
|
|
54
|
+
decorator.expression.callee.type ===
|
|
55
|
+
experimental_utils_1.AST_NODE_TYPES.Identifier &&
|
|
56
|
+
CLASS_VALIDATOR_DECORATOR_NAMES.has(decorator.expression.callee.name));
|
|
57
|
+
if (hasDecorator) {
|
|
58
|
+
withDecorator.push(element);
|
|
59
|
+
}
|
|
60
|
+
else {
|
|
61
|
+
withoutDecorator.push(element);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
if (withDecorator.length > 0 && withoutDecorator.length > 0) {
|
|
65
|
+
for (const element of withoutDecorator) {
|
|
66
|
+
context.report({
|
|
67
|
+
node: element,
|
|
68
|
+
messageId: "missing-property-decorator",
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
},
|
|
73
|
+
};
|
|
74
|
+
},
|
|
75
|
+
});
|
|
76
|
+
exports.default = rule;
|
|
77
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWxsUHJvcGVydGllc0FyZVdoaXRlbGlzdGVkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3J1bGVzL2FsbFByb3BlcnRpZXNBcmVXaGl0ZWxpc3RlZC9hbGxQcm9wZXJ0aWVzQXJlV2hpdGVsaXN0ZWQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsOEVBQXFFO0FBRXJFLGdFQUFrRDtBQUNsRCx1REFBa0Q7QUFFbEQsTUFBTSwrQkFBK0IsR0FBRyxJQUFJLEdBQUcsQ0FDM0MsTUFBTSxDQUFDLElBQUksQ0FBQyxjQUF3QixDQUFDLENBQ3hDLENBQUM7QUFFRixNQUFNLElBQUksR0FBRyxJQUFBLHVCQUFVLEVBQUM7SUFDcEIsSUFBSSxFQUFFLGdDQUFnQztJQUN0QyxJQUFJLEVBQUU7UUFDRixJQUFJLEVBQUU7WUFDRixXQUFXLEVBQUUsd0NBQXdDO1lBQ3JELFdBQVcsRUFBRSxPQUFPO1lBQ3BCLG9CQUFvQixFQUFFLEtBQUs7U0FDOUI7UUFDRCxRQUFRLEVBQUU7WUFDTiw0QkFBNEIsRUFDeEIseUZBQXlGO1NBQ2hHO1FBQ0QsSUFBSSxFQUFFLFNBQVM7UUFDZixNQUFNLEVBQUUsRUFBRTtLQUNiO0lBQ0QsY0FBYyxFQUFFLEVBQUU7SUFDbEIsTUFBTSxFQUFFLFVBQVUsT0FBTztRQUNyQixPQUFPO1lBQ0gsZ0VBQWdFO1lBQ2hFLGdCQUFnQixDQUFDLElBQUk7O2dCQUNqQixNQUFNLGFBQWEsR0FBeUIsRUFBRSxDQUFDO2dCQUMvQyxNQUFNLGdCQUFnQixHQUF5QixFQUFFLENBQUM7Z0JBQ2xELEtBQUssTUFBTSxPQUFPLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUU7b0JBQ2xDLElBQUksT0FBTyxDQUFDLElBQUksS0FBSyxtQ0FBYyxDQUFDLGtCQUFrQixFQUFFO3dCQUNwRCxTQUFTO3FCQUNaO29CQUNELE1BQU0sWUFBWSxHQUFHLE1BQUEsT0FBTyxDQUFDLFVBQVUsMENBQUUsSUFBSSxDQUN6QyxDQUFDLFNBQVMsRUFBRSxFQUFFLENBQ1YsU0FBUyxDQUFDLFVBQVUsQ0FBQyxJQUFJO3dCQUNyQixtQ0FBYyxDQUFDLGNBQWM7d0JBQ2pDLFNBQVMsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLElBQUk7NEJBQzVCLG1DQUFjLENBQUMsVUFBVTt3QkFDN0IsK0JBQStCLENBQUMsR0FBRyxDQUMvQixTQUFTLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQ25DLENBQ1IsQ0FBQztvQkFDRixJQUFJLFlBQVksRUFBRTt3QkFDZCxhQUFhLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO3FCQUMvQjt5QkFBTTt3QkFDSCxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7cUJBQ2xDO2lCQUNKO2dCQUNELElBQUksYUFBYSxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksZ0JBQWdCLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtvQkFDekQsS0FBSyxNQUFNLE9BQU8sSUFBSSxnQkFBZ0IsRUFBRTt3QkFDcEMsT0FBTyxDQUFDLE1BQU0sQ0FBQzs0QkFDWCxJQUFJLEVBQUUsT0FBTzs0QkFDYixTQUFTLEVBQUUsNEJBQTRCO3lCQUMxQyxDQUFDLENBQUM7cUJBQ047aUJBQ0o7WUFDTCxDQUFDO1NBQ0osQ0FBQztJQUNOLENBQUM7Q0FDSixDQUFDLENBQUM7QUFFSCxrQkFBZSxJQUFJLENBQUMifQ==
|
package/dist/rules/index.d.ts
CHANGED
|
@@ -34,5 +34,8 @@ 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
|
+
"all-properties-are-whitelisted": import("@typescript-eslint/experimental-utils/dist/ts-eslint/Rule").RuleModule<"missing-property-decorator", never[], {
|
|
38
|
+
ClassDeclaration(node: import("@typescript-eslint/types/dist/ast-spec").ClassDeclaration): void;
|
|
39
|
+
}>;
|
|
37
40
|
};
|
|
38
41
|
export default allRules;
|
package/dist/rules/index.js
CHANGED
|
@@ -14,6 +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 allPropertiesAreWhitelisted_1 = __importDefault(require("./allPropertiesAreWhitelisted/allPropertiesAreWhitelisted"));
|
|
17
18
|
const allRules = {
|
|
18
19
|
"api-property-matches-property-optionality": apiPropertyMatchesPropertyOptionality_1.default,
|
|
19
20
|
"injectable-should-be-provided": injectableShouldBeProvided_1.default,
|
|
@@ -26,6 +27,7 @@ const allRules = {
|
|
|
26
27
|
"param-decorator-name-matches-route-param": paramDecoratorNameMatchesRouteParam_1.default,
|
|
27
28
|
"validated-non-primitive-property-needs-type-decorator": validateNonPrimitiveNeedsDecorators_1.default,
|
|
28
29
|
"validate-nested-of-array-should-set-each": validateNestedOfArrayShouldSetEach_1.default,
|
|
30
|
+
"all-properties-are-whitelisted": allPropertiesAreWhitelisted_1.default,
|
|
29
31
|
};
|
|
30
32
|
exports.default = allRules;
|
|
31
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
33
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcnVsZXMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSwwSEFBa0c7QUFDbEcsaUpBQW1JO0FBQ25JLDBKQUFrSTtBQUNsSSxrSUFBMEc7QUFDMUcsaUpBQXlIO0FBQ3pILCtIQUF1RztBQUN2RyxnS0FBd0k7QUFDeEksbUpBQXVIO0FBQ3ZILG9KQUFnSTtBQUNoSSw0SkFBb0k7QUFDcEksaUpBQXlIO0FBQ3pILDRIQUFvRztBQUVwRyxNQUFNLFFBQVEsR0FBRztJQUNiLDJDQUEyQyxFQUN2QywrQ0FBcUM7SUFDekMsK0JBQStCLEVBQUUsb0NBQTBCO0lBQzNELG1EQUFtRCxFQUMvQyw0Q0FBNEM7SUFDaEQsb0NBQW9DLEVBQUUsdUNBQTZCO0lBQ25FLHdDQUF3QyxFQUNwQyw0Q0FBa0M7SUFDdEMsa0NBQWtDLEVBQUUsc0NBQTRCO0lBQ2hFLCtDQUErQyxFQUMzQyxpREFBdUM7SUFDM0Msc0NBQXNDLEVBQUUsOENBQWdDO0lBQ3hFLDBDQUEwQyxFQUN0Qyw2Q0FBdUM7SUFDM0MsdURBQXVELEVBQ25ELDZDQUFtQztJQUN2QywwQ0FBMEMsRUFDdEMsNENBQWtDO0lBQ3RDLGdDQUFnQyxFQUFFLHFDQUEyQjtDQUNoRSxDQUFDO0FBRUYsa0JBQWUsUUFBUSxDQUFDIn0=
|
|
@@ -7,7 +7,6 @@ const createRule_1 = require("../../utils/createRule");
|
|
|
7
7
|
const typedTokenHelpers_1 = require("../../utils/typedTokenHelpers");
|
|
8
8
|
const eslint_utils_1 = require("@typescript-eslint/experimental-utils/dist/eslint-utils");
|
|
9
9
|
const classValidatorDecorators_1 = require("../../utils/classValidatorDecorators");
|
|
10
|
-
//import util from "util";
|
|
11
10
|
const primitiveTypes = new Set([
|
|
12
11
|
types_1.AST_NODE_TYPES.TSStringKeyword,
|
|
13
12
|
types_1.AST_NODE_TYPES.TSBooleanKeyword,
|
|
@@ -39,15 +38,26 @@ const rule = (0, createRule_1.createRule)({
|
|
|
39
38
|
return {
|
|
40
39
|
// eslint-disable-next-line @typescript-eslint/naming-convention
|
|
41
40
|
PropertyDefinition(node) {
|
|
42
|
-
var _a, _b, _c, _d, _e, _f;
|
|
41
|
+
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k;
|
|
43
42
|
// if it's an array get the element type
|
|
44
43
|
let mainType;
|
|
45
44
|
const isAnArray = typedTokenHelpers_1.typedTokenHelpers.isTypeArrayTypeOrUnionOfArrayTypes(node, parserServices, typeChecker);
|
|
45
|
+
// this is getting very messy
|
|
46
46
|
if (isAnArray) {
|
|
47
|
-
|
|
47
|
+
const mainTypeInShortArray = (_c = (_b = (_a = node.typeAnnotation) === null || _a === void 0 ? void 0 : _a.typeAnnotation) === null || _b === void 0 ? void 0 : _b.elementType) === null || _c === void 0 ? void 0 : _c.type;
|
|
48
|
+
if (!mainTypeInShortArray) {
|
|
49
|
+
// try to get the type of Array<type> syntax
|
|
50
|
+
const foundParams = (_f = (_e = (_d = node.typeAnnotation) === null || _d === void 0 ? void 0 : _d.typeAnnotation) === null || _e === void 0 ? void 0 : _e.typeParameters) === null || _f === void 0 ? void 0 : _f.params;
|
|
51
|
+
if (foundParams && foundParams.length === 1) {
|
|
52
|
+
mainType = foundParams[0].type;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
else {
|
|
56
|
+
mainType = mainTypeInShortArray;
|
|
57
|
+
}
|
|
48
58
|
}
|
|
49
59
|
else {
|
|
50
|
-
mainType = (
|
|
60
|
+
mainType = (_h = (_g = node.typeAnnotation) === null || _g === void 0 ? void 0 : _g.typeAnnotation) === null || _h === void 0 ? void 0 : _h.type;
|
|
51
61
|
}
|
|
52
62
|
// if this couldn't be found we don't understand the AST
|
|
53
63
|
if (!mainType) {
|
|
@@ -60,7 +70,7 @@ const rule = (0, createRule_1.createRule)({
|
|
|
60
70
|
}
|
|
61
71
|
// property is a union with primitive type - no need to validate
|
|
62
72
|
const isNodeAUnionWithAPrimitive = mainType === types_1.AST_NODE_TYPES.TSUnionType &&
|
|
63
|
-
((
|
|
73
|
+
((_k = ((_j = node.typeAnnotation) === null || _j === void 0 ? void 0 : _j.typeAnnotation).types) === null || _k === void 0 ? void 0 : _k.some((x) => primitiveTypes.has(x.type)));
|
|
64
74
|
if (isNodeAUnionWithAPrimitive) {
|
|
65
75
|
return;
|
|
66
76
|
}
|
|
@@ -92,4 +102,4 @@ const rule = (0, createRule_1.createRule)({
|
|
|
92
102
|
},
|
|
93
103
|
});
|
|
94
104
|
exports.default = rule;
|
|
95
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
105
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFsaWRhdGVOb25QcmltaXRpdmVOZWVkc0RlY29yYXRvcnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvcnVsZXMvdmFsaWRhdGUtbm9uLXByaW1pdHZlcy1uZWVkcy10eXBlLWRlY29yYXRvci92YWxpZGF0ZU5vblByaW1pdGl2ZU5lZWRzRGVjb3JhdG9ycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxrREFBa0Q7QUFDbEQsb0RBQWtFO0FBQ2xFLHVEQUFrRDtBQUNsRCxxRUFBZ0U7QUFDaEUsMEZBQTBGO0FBQzFGLG1GQUE4RTtBQUU5RSxNQUFNLGNBQWMsR0FBRyxJQUFJLEdBQUcsQ0FBQztJQUMzQixzQkFBYyxDQUFDLGVBQWU7SUFDOUIsc0JBQWMsQ0FBQyxnQkFBZ0I7SUFDL0Isc0JBQWMsQ0FBQyxlQUFlO0NBQ2pDLENBQUMsQ0FBQztBQUNJLE1BQU0sYUFBYSxHQUFHLEdBQVksRUFBRTtJQUN2QyxPQUFPLElBQUksQ0FBQztBQUNoQixDQUFDLENBQUM7QUFGVyxRQUFBLGFBQWEsaUJBRXhCO0FBRUYsTUFBTSxJQUFJLEdBQUcsSUFBQSx1QkFBVSxFQUFDO0lBQ3BCLElBQUksRUFBRSx1REFBdUQ7SUFDN0QsSUFBSSxFQUFFO1FBQ0YsSUFBSSxFQUFFO1lBQ0YsV0FBVyxFQUNQLCtFQUErRTtZQUNuRixXQUFXLEVBQUUsS0FBSztZQUNsQixvQkFBb0IsRUFBRSxLQUFLO1NBQzlCO1FBQ0QsUUFBUSxFQUFFO1lBQ04sc0JBQXNCLEVBQ2xCLCtFQUErRTtTQUN0RjtRQUNELE1BQU0sRUFBRSxFQUFFO1FBQ1YsY0FBYyxFQUFFLEtBQUs7UUFDckIsSUFBSSxFQUFFLFlBQVk7S0FDckI7SUFDRCxjQUFjLEVBQUUsRUFBRTtJQUVsQixNQUFNLENBQUMsT0FBTztRQUNWLE1BQU0sY0FBYyxHQUFHLElBQUEsZ0NBQWlCLEVBQUMsT0FBTyxDQUFDLENBQUM7UUFDbEQsTUFBTSxXQUFXLEdBQUcsY0FBYyxD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
|
|
@@ -39,7 +39,14 @@ exports.typedTokenHelpers = {
|
|
|
39
39
|
"ArrayUnique",
|
|
40
40
|
],
|
|
41
41
|
isTypeArrayTypeOrUnionOfArrayTypes(node, parserService, checker) {
|
|
42
|
+
var _a, _b, _c;
|
|
43
|
+
if (((_c = (_b = (_a = node) === null || _a === void 0 ? void 0 : _a.typeAnnotation) === null || _b === void 0 ? void 0 : _b.typeAnnotation) === null || _c === void 0 ? void 0 : _c.type) === experimental_utils_1.TSESTree.AST_NODE_TYPES.TSArrayType) {
|
|
44
|
+
return true;
|
|
45
|
+
}
|
|
42
46
|
const nodeType = this.getNodeType(node, parserService, checker);
|
|
47
|
+
if (checker.isArrayType(nodeType)) {
|
|
48
|
+
return true;
|
|
49
|
+
}
|
|
43
50
|
for (const t of (0, tsutils_1.unionTypeParts)(nodeType)) {
|
|
44
51
|
if (!checker.isArrayType(t)) {
|
|
45
52
|
return false;
|
|
@@ -116,4 +123,4 @@ exports.typedTokenHelpers = {
|
|
|
116
123
|
return isOptionalPropertyValue;
|
|
117
124
|
},
|
|
118
125
|
};
|
|
119
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
126
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZWRUb2tlbkhlbHBlcnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdXRpbHMvdHlwZWRUb2tlbkhlbHBlcnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLDhFQUkrQztBQUUvQyxzREFBZ0Q7QUFDaEQsNERBQTRCO0FBQzVCLHFDQUF1QztBQUN2QyxpREFBbUM7QUFDdEIsUUFBQSxpQkFBaUIsR0FBRztJQUM3QixnREFBZ0QsRUFBRTtRQUM5QyxTQUFTO1FBQ1QsY0FBYztRQUNkLGNBQWM7UUFDZCxlQUFlO1FBQ2Ysa0JBQWtCO1FBQ2xCLGVBQWU7UUFDZixhQUFhO0tBQ2hCO0lBQ0Qsa0NBQWtDLENBQzlCLElBQW1CLEVBQ25CLGFBQTZCLEVBQzdCLE9BQXVCOztRQUV2QixJQUNJLENBQUEsTUFBQSxNQUFBLE1BQUMsSUFBb0MsMENBQUUsY0FBYywwQ0FDL0MsY0FBYywwQ0FBRSxJQUFJLE1BQUssNkJBQVEsQ0FBQyxjQUFjLENBQUMsV0FBVyxFQUNwRTtZQUNFLE9BQU8sSUFBSSxDQUFDO1NBQ2Y7UUFFRCxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksRUFBRSxhQUFhLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDaEUsSUFBSSxPQUFPLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxFQUFFO1lBQy9CLE9BQU8sSUFBSSxDQUFDO1NBQ2Y7UUFDRCxLQUFLLE1BQU0sQ0FBQyxJQUFJLElBQUEsd0JBQWMsRUFBQyxRQUFRLENBQUMsRUFBRTtZQUN0QyxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsRUFBRTtnQkFDekIsT0FBTyxLQUFLLENBQUM7YUFDaEI7U0FDSjtRQUVELE9BQU8sSUFBSSxDQUFDO0lBQ2hCLENBQUM7SUFDRCxXQUFXLENBQ1AsSUFBbUIsRUFDbkIsYUFBNkIsRUFDN0IsT0FBdUI7UUFFdkIsTUFBTSxN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
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@darraghor/eslint-plugin-nestjs-typed",
|
|
3
|
-
"version": "3.
|
|
3
|
+
"version": "3.9.0",
|
|
4
4
|
"description": "Eslint rules for nestjs projects",
|
|
5
5
|
"scripts": {
|
|
6
6
|
"clean": "rm -Rf ./dist/",
|
|
@@ -55,6 +55,7 @@
|
|
|
55
55
|
"@types/node": "16.11.11",
|
|
56
56
|
"@typescript-eslint/eslint-plugin": "5.5.0",
|
|
57
57
|
"@typescript-eslint/parser": "5.5.0",
|
|
58
|
+
"class-validator": "^0.13.2",
|
|
58
59
|
"eslint": "8.3.0",
|
|
59
60
|
"eslint-config-prettier": "8.3.0",
|
|
60
61
|
"eslint-plugin-import": "2.25.3",
|
|
@@ -73,6 +74,7 @@
|
|
|
73
74
|
},
|
|
74
75
|
"peerDependencies": {
|
|
75
76
|
"@typescript-eslint/parser": "^5.0.0",
|
|
77
|
+
"class-validator": "*",
|
|
76
78
|
"eslint": "^8.0.0"
|
|
77
79
|
},
|
|
78
80
|
"keywords": [
|