@darraghor/eslint-plugin-nestjs-typed 3.16.1 → 3.17.1
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/dist/index.d.ts +1 -1
- package/dist/rules/index.d.ts +1 -1
- package/dist/rules/validateNonPrimitvesNeedsTypeDecorator/validateNonPrimitiveNeedsDecorators.d.ts +1 -1
- package/dist/rules/validateNonPrimitvesNeedsTypeDecorator/validateNonPrimitiveNeedsDecorators.js +55 -8
- package/package.json +1 -1
package/dist/index.d.ts
CHANGED
|
@@ -35,7 +35,7 @@ declare const configuration: {
|
|
|
35
35
|
"param-decorator-name-matches-route-param": import("@typescript-eslint/utils/dist/ts-eslint/Rule").RuleModule<"paramIdentifierDoesntNeedColon" | "paramIdentifierShouldMatch", never[], {
|
|
36
36
|
Decorator(node: import("@typescript-eslint/types/dist/generated/ast-spec").Decorator): void;
|
|
37
37
|
}>;
|
|
38
|
-
"validated-non-primitive-property-needs-type-decorator": import("@typescript-eslint/utils/dist/ts-eslint/Rule").RuleModule<"shouldUseTypeDecorator", import("./rules/validateNonPrimitvesNeedsTypeDecorator/validateNonPrimitiveNeedsDecorators").ValidateNonPrimitivePropertyTypeDecoratorOptions, {
|
|
38
|
+
"validated-non-primitive-property-needs-type-decorator": import("@typescript-eslint/utils/dist/ts-eslint/Rule").RuleModule<"autofixWithTypeDecorator" | "shouldUseTypeDecorator", import("./rules/validateNonPrimitvesNeedsTypeDecorator/validateNonPrimitiveNeedsDecorators").ValidateNonPrimitivePropertyTypeDecoratorOptions, {
|
|
39
39
|
PropertyDefinition(node: import("@typescript-eslint/types/dist/generated/ast-spec").PropertyDefinition): void;
|
|
40
40
|
}>;
|
|
41
41
|
"validate-nested-of-array-should-set-each": import("@typescript-eslint/utils/dist/ts-eslint/Rule").RuleModule<"shouldSetEachPropertyTrue" | "shouldSetEachPropertyFalse", never[], {
|
package/dist/rules/index.d.ts
CHANGED
|
@@ -34,7 +34,7 @@ declare const allRules: {
|
|
|
34
34
|
"param-decorator-name-matches-route-param": import("@typescript-eslint/utils/dist/ts-eslint/Rule").RuleModule<"paramIdentifierDoesntNeedColon" | "paramIdentifierShouldMatch", never[], {
|
|
35
35
|
Decorator(node: import("@typescript-eslint/types/dist/generated/ast-spec").Decorator): void;
|
|
36
36
|
}>;
|
|
37
|
-
"validated-non-primitive-property-needs-type-decorator": import("@typescript-eslint/utils/dist/ts-eslint/Rule").RuleModule<"shouldUseTypeDecorator", import("./validateNonPrimitvesNeedsTypeDecorator/validateNonPrimitiveNeedsDecorators").ValidateNonPrimitivePropertyTypeDecoratorOptions, {
|
|
37
|
+
"validated-non-primitive-property-needs-type-decorator": import("@typescript-eslint/utils/dist/ts-eslint/Rule").RuleModule<"autofixWithTypeDecorator" | "shouldUseTypeDecorator", import("./validateNonPrimitvesNeedsTypeDecorator/validateNonPrimitiveNeedsDecorators").ValidateNonPrimitivePropertyTypeDecoratorOptions, {
|
|
38
38
|
PropertyDefinition(node: import("@typescript-eslint/types/dist/generated/ast-spec").PropertyDefinition): void;
|
|
39
39
|
}>;
|
|
40
40
|
"validate-nested-of-array-should-set-each": import("@typescript-eslint/utils/dist/ts-eslint/Rule").RuleModule<"shouldSetEachPropertyTrue" | "shouldSetEachPropertyFalse", never[], {
|
package/dist/rules/validateNonPrimitvesNeedsTypeDecorator/validateNonPrimitiveNeedsDecorators.d.ts
CHANGED
|
@@ -5,7 +5,7 @@ export declare type ValidateNonPrimitivePropertyTypeDecoratorOptions = [
|
|
|
5
5
|
}
|
|
6
6
|
];
|
|
7
7
|
export declare const shouldTrigger: () => boolean;
|
|
8
|
-
declare const rule: TSESLint.RuleModule<"shouldUseTypeDecorator", ValidateNonPrimitivePropertyTypeDecoratorOptions, {
|
|
8
|
+
declare const rule: TSESLint.RuleModule<"autofixWithTypeDecorator" | "shouldUseTypeDecorator", ValidateNonPrimitivePropertyTypeDecoratorOptions, {
|
|
9
9
|
PropertyDefinition(node: TSESTree.PropertyDefinition): void;
|
|
10
10
|
}>;
|
|
11
11
|
export default rule;
|
package/dist/rules/validateNonPrimitvesNeedsTypeDecorator/validateNonPrimitiveNeedsDecorators.js
CHANGED
|
@@ -9,6 +9,7 @@ const primitiveTypes = new Set([
|
|
|
9
9
|
utils_1.AST_NODE_TYPES.TSStringKeyword,
|
|
10
10
|
utils_1.AST_NODE_TYPES.TSBooleanKeyword,
|
|
11
11
|
utils_1.AST_NODE_TYPES.TSNumberKeyword,
|
|
12
|
+
utils_1.AST_NODE_TYPES.TSNullKeyword,
|
|
12
13
|
]);
|
|
13
14
|
const shouldTrigger = () => {
|
|
14
15
|
return true;
|
|
@@ -23,6 +24,7 @@ const rule = (0, createRule_1.createRule)({
|
|
|
23
24
|
requiresTypeChecking: false,
|
|
24
25
|
},
|
|
25
26
|
messages: {
|
|
27
|
+
autofixWithTypeDecorator: "Add @Type(() => {{ typeIdentifier }}) decorator before class property.",
|
|
26
28
|
shouldUseTypeDecorator: "A non-primitive property with validation should probably use a @Type decorator. If this is an enum use @IsEnum(). If this is a plain object use @IsObject().",
|
|
27
29
|
},
|
|
28
30
|
schema: [
|
|
@@ -40,7 +42,7 @@ const rule = (0, createRule_1.createRule)({
|
|
|
40
42
|
},
|
|
41
43
|
},
|
|
42
44
|
],
|
|
43
|
-
hasSuggestions:
|
|
45
|
+
hasSuggestions: true,
|
|
44
46
|
type: "suggestion",
|
|
45
47
|
},
|
|
46
48
|
defaultOptions: [{ additionalTypeDecorators: new Array() }],
|
|
@@ -53,7 +55,7 @@ const rule = (0, createRule_1.createRule)({
|
|
|
53
55
|
return {
|
|
54
56
|
// eslint-disable-next-line @typescript-eslint/naming-convention
|
|
55
57
|
PropertyDefinition(node) {
|
|
56
|
-
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k;
|
|
58
|
+
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p;
|
|
57
59
|
// if it's an array get the element type
|
|
58
60
|
let mainType;
|
|
59
61
|
const isAnArray = typedTokenHelpers_1.typedTokenHelpers.isTypeArrayTypeOrUnionOfArrayTypes(node, parserServices, typeChecker);
|
|
@@ -74,7 +76,6 @@ const rule = (0, createRule_1.createRule)({
|
|
|
74
76
|
else {
|
|
75
77
|
mainType = (_h = (_g = node.typeAnnotation) === null || _g === void 0 ? void 0 : _g.typeAnnotation) === null || _h === void 0 ? void 0 : _h.type;
|
|
76
78
|
}
|
|
77
|
-
// if this couldn't be found we don't understand the AST
|
|
78
79
|
if (!mainType) {
|
|
79
80
|
return;
|
|
80
81
|
}
|
|
@@ -124,14 +125,60 @@ const rule = (0, createRule_1.createRule)({
|
|
|
124
125
|
// ok so does the property have Type decorator or custom type decorator? it probably should
|
|
125
126
|
const foundTypeDecorator = typedTokenHelpers_1.typedTokenHelpers.getDecoratorsNamed(node, typeDecorators);
|
|
126
127
|
if (foundTypeDecorator.length === 0) {
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
128
|
+
const typeAnnotationNode = (_l = node.typeAnnotation) === null || _l === void 0 ? void 0 : _l.typeAnnotation;
|
|
129
|
+
let typeIdentifier;
|
|
130
|
+
if (typeAnnotationNode) {
|
|
131
|
+
if (typeAnnotationNode.type ===
|
|
132
|
+
utils_1.AST_NODE_TYPES.TSTypeReference &&
|
|
133
|
+
typeAnnotationNode.typeName.type === "Identifier") {
|
|
134
|
+
typeIdentifier = typeAnnotationNode.typeName.name;
|
|
135
|
+
if (typeAnnotationNode.typeName.name === "Array") {
|
|
136
|
+
const foundParams = (_p = (_o = (_m = node.typeAnnotation) === null || _m === void 0 ? void 0 : _m.typeAnnotation) === null || _o === void 0 ? void 0 : _o.typeParameters) === null || _p === void 0 ? void 0 : _p.params;
|
|
137
|
+
if (foundParams && foundParams.length === 1) {
|
|
138
|
+
const typeName = foundParams[0].typeName;
|
|
139
|
+
if (typeName.type ===
|
|
140
|
+
utils_1.AST_NODE_TYPES.Identifier) {
|
|
141
|
+
typeIdentifier = typeName.name;
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
else if (typeAnnotationNode.type ===
|
|
147
|
+
utils_1.AST_NODE_TYPES.TSArrayType) {
|
|
148
|
+
const elementTypeNode = typeAnnotationNode.elementType;
|
|
149
|
+
if (elementTypeNode.type ===
|
|
150
|
+
utils_1.AST_NODE_TYPES.TSTypeReference &&
|
|
151
|
+
elementTypeNode.typeName.type ===
|
|
152
|
+
utils_1.AST_NODE_TYPES.Identifier) {
|
|
153
|
+
typeIdentifier = elementTypeNode.typeName.name;
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
if (typeIdentifier) {
|
|
158
|
+
context.report({
|
|
159
|
+
node: node,
|
|
160
|
+
messageId: "shouldUseTypeDecorator",
|
|
161
|
+
suggest: [
|
|
162
|
+
{
|
|
163
|
+
data: { typeIdentifier },
|
|
164
|
+
messageId: "autofixWithTypeDecorator",
|
|
165
|
+
fix: (fixer) => {
|
|
166
|
+
return fixer.insertTextBefore(node, `@Type(() => ${typeIdentifier})`);
|
|
167
|
+
},
|
|
168
|
+
},
|
|
169
|
+
],
|
|
170
|
+
});
|
|
171
|
+
}
|
|
172
|
+
else {
|
|
173
|
+
context.report({
|
|
174
|
+
node: node,
|
|
175
|
+
messageId: "shouldUseTypeDecorator",
|
|
176
|
+
});
|
|
177
|
+
}
|
|
131
178
|
}
|
|
132
179
|
},
|
|
133
180
|
};
|
|
134
181
|
},
|
|
135
182
|
});
|
|
136
183
|
exports.default = rule;
|
|
137
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
184
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFsaWRhdGVOb25QcmltaXRpdmVOZWVkc0RlY29yYXRvcnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvcnVsZXMvdmFsaWRhdGVOb25QcmltaXR2ZXNOZWVkc1R5cGVEZWNvcmF0b3IvdmFsaWRhdGVOb25QcmltaXRpdmVOZWVkc0RlY29yYXRvcnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsa0RBQWtEO0FBQ2xELG9EQUtrQztBQUNsQyx1REFBa0Q7QUFDbEQscUVBQWdFO0FBRWhFLE1BQU0sY0FBYyxHQUFHLElBQUksR0FBRyxDQUFDO0lBQzNCLHNCQUFjLENBQUMsZUFBZTtJQUM5QixzQkFBYyxDQUFDLGdCQUFnQjtJQUMvQixzQkFBYyxDQUFDLGVBQWU7SUFDOUIsc0JBQWMsQ0FBQyxhQUFhO0NBQy9CLENBQUMsQ0FBQztBQU1JLE1BQU0sYUFBYSxHQUFHLEdBQVksRUFBRTtJQUN2QyxPQUFPLElBQUksQ0FBQztBQUNoQixDQUFDLENBQUM7QUFGVyxRQUFBLGFBQWEsaUJBRXhCO0FBRUYsTUFBTSxJQUFJLEdBQUcsSUFBQSx1QkFBVSxFQUFDO0lBQ3BCLElBQUksRUFBRSx1REFBdUQ7SUFDN0QsSUFBSSxFQUFFO1FBQ0YsSUFBSSxFQUFFO1lBQ0YsV0FBVyxFQUNQLGdGQUFnRjtZQUNwRixXQUFXLEVBQUUsS0FBSztZQUNsQixvQkFBb0IsRUFBRSxLQUFLO1NBQzlCO1FBQ0QsUUFBUSxFQUFFO1lBQ04sd0JBQXdCLEVBQ3BCLHdFQUF3RTtZQUM1RSxzQkFBc0IsRUFDbEIsOEpBQThKO1NBQ3JLO1FBQ0QsTUFBTSxFQUFFO1lBQ0o7Z0JBQ0ksVUFBVSxFQUFFO29CQUNSLHdCQUF3QixFQUFFO3dCQUN0QixXQUFXLEVBQ1Asc0VBQXNFO3dCQUMxRSxJQUFJLEVBQUUsT0FBTzt3QkFDYixRQUFRLEVBQUUsQ0FBQzt3QkFDWCxLQUFLLEVBQUU7NEJBQ0gsSUFBSSxFQUFFLFFBQVE7NEJBQ2QsU0FBUyxF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
|