@darraghor/eslint-plugin-nestjs-typed 3.22.6 → 4.0.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/README.md +46 -35
- package/dist/fixtures/example.controller.js +3 -4
- package/dist/fixtures/example.module.js +3 -4
- package/dist/fixtures/file.js +2 -1
- package/dist/fixtures/providerArray.module.js +3 -4
- package/dist/rules/allPropertiesAreWhitelisted/allPropertiesAreWhitelisted.js +3 -5
- package/dist/rules/allPropertiesHaveExplicitDefined/allPropertiesHaveExplicitDefined.js +6 -8
- package/dist/rules/apiEnumPropertyBestPractices/apiEnumPropertyBestPractices.js +1 -2
- package/dist/rules/apiMethodsShouldBeGuarded/apiMethodsShouldBeGuarded.js +3 -3
- package/dist/rules/apiMethodsShouldSpecifyApiOperation/apiMethodsShouldSpecifyApiOperation.js +1 -2
- package/dist/rules/apiMethodsShouldSpecifyApiResponse/apiMethodsShouldSpecifyApiResponse.js +1 -2
- package/dist/rules/apiPropertyMatchesPropertyOptionality/apiPropertyMatchesPropertyOptionality.js +1 -2
- package/dist/rules/apiPropertyReturningArrayShouldSetArray/apiPropertyReturningArrayShouldSetArray.js +5 -6
- package/dist/rules/controllerDecoratedHasApiTags/controllerDecoratedHasApiTags.js +1 -2
- package/dist/rules/injectablesShouldBeProvided/injectableShouldBeProvided.js +18 -11
- package/dist/rules/paramDecoratorNameMatchesRouteParam/paramDecoratorNameMatchesRouteParam.js +25 -26
- package/dist/rules/providerInjectedShouldMatchFactory/ProviderInjectedShouldMatchFactory.js +7 -7
- package/dist/rules/shouldSpecifyForbidUnknownValues/shouldSpecifyForbidUnknownValuesRule.js +16 -15
- package/dist/rules/sortModuleMetadataArrays/sortModuleMetadataArrays.js +20 -12
- package/dist/rules/validateNestedOfArrayShouldSetEach/validateNestedOfArrayShouldSetEach.js +5 -7
- package/dist/rules/validateNonPrimitiveNeedsTypeDecorator/validateNonPrimitiveNeedsDecorators.js +15 -10
- package/dist/utils/files/fileEnumerationWrapper.js +1 -1
- package/dist/utils/files/isFilteredPath.js +2 -2
- package/dist/utils/nestModules/nestModuleAstParser.js +6 -12
- package/dist/utils/nestModules/nestProvidedInjectableMapper.js +6 -2
- package/dist/utils/nestModules/nestProviderAstParser.js +3 -5
- package/dist/utils/typedTokenHelpers.js +16 -21
- package/package.json +20 -21
- package/dist/configs/index.d.ts +0 -44
- package/dist/configs/noSwagger.d.ts +0 -15
- package/dist/configs/recommended.d.ts +0 -28
- package/dist/fixtures/Controller.stub.d.ts +0 -1
- package/dist/fixtures/Injectable.stub.d.ts +0 -1
- package/dist/fixtures/Module.stub.d.ts +0 -1
- package/dist/fixtures/NonFactoryDecorator.stub.d.ts +0 -1
- package/dist/fixtures/example.controller.d.ts +0 -2
- package/dist/fixtures/example.customprovider.d.ts +0 -5
- package/dist/fixtures/example.module.d.ts +0 -2
- package/dist/fixtures/example.providedClass.provider.d.ts +0 -3
- package/dist/fixtures/example.provider.d.ts +0 -3
- package/dist/fixtures/file.d.ts +0 -0
- package/dist/fixtures/providerArray.module.d.ts +0 -2
- package/dist/index.d.ts +0 -103
- package/dist/rules/allPropertiesAreWhitelisted/allPropertiesAreWhitelisted.d.ts +0 -5
- package/dist/rules/allPropertiesHaveExplicitDefined/allPropertiesHaveExplicitDefined.d.ts +0 -5
- package/dist/rules/apiEnumPropertyBestPractices/apiEnumPropertyBestPractices.d.ts +0 -8
- package/dist/rules/apiEnumPropertyBestPractices/enumTestResultModel.d.ts +0 -7
- package/dist/rules/apiMethodsShouldBeGuarded/apiMethodsShouldBeGuarded.d.ts +0 -6
- package/dist/rules/apiMethodsShouldSpecifyApiOperation/apiMethodsShouldSpecifyApiOperation.d.ts +0 -6
- package/dist/rules/apiMethodsShouldSpecifyApiResponse/apiMethodsShouldSpecifyApiResponse.d.ts +0 -6
- package/dist/rules/apiPropertyMatchesPropertyOptionality/apiPropertyMatchesPropertyOptionality.d.ts +0 -7
- package/dist/rules/apiPropertyReturningArrayShouldSetArray/apiPropertyReturningArrayShouldSetArray.d.ts +0 -7
- package/dist/rules/apiPropertyReturningArrayShouldSetArray/arraySetResultModel.d.ts +0 -5
- package/dist/rules/controllerDecoratedHasApiTags/controllerDecoratedHasApiTags.d.ts +0 -6
- package/dist/rules/index.d.ts +0 -58
- package/dist/rules/injectablesShouldBeProvided/injectableShouldBeProvided.d.ts +0 -12
- package/dist/rules/paramDecoratorNameMatchesRouteParam/paramDecoratorNameMatchesRouteParam.d.ts +0 -23
- package/dist/rules/paramDecoratorNameMatchesRouteParam/rule.testData.d.ts +0 -10
- package/dist/rules/providerInjectedShouldMatchFactory/ProviderInjectedShouldMatchFactory.d.ts +0 -6
- package/dist/rules/shouldSpecifyForbidUnknownValues/shouldSpecifyForbidUnknownValuesRule.d.ts +0 -10
- package/dist/rules/sortModuleMetadataArrays/sortModuleMetadataArrays.d.ts +0 -10
- package/dist/rules/validateNestedOfArrayShouldSetEach/arraySetResultModel.d.ts +0 -5
- package/dist/rules/validateNestedOfArrayShouldSetEach/validateNestedOfArrayShouldSetEach.d.ts +0 -7
- package/dist/rules/validateNonPrimitiveNeedsTypeDecorator/validateNonPrimitiveNeedsDecorators.d.ts +0 -12
- package/dist/testing/fixtureSetup.d.ts +0 -1
- package/dist/testing/preRun.d.ts +0 -1
- package/dist/utils/ast.d.ts +0 -2
- package/dist/utils/createRule.d.ts +0 -2
- package/dist/utils/files/fileEnumerationWrapper.d.ts +0 -6
- package/dist/utils/files/isFilteredPath.d.ts +0 -4
- package/dist/utils/nestModules/models/NestProvidedInjectablesMap.d.ts +0 -5
- package/dist/utils/nestModules/nestModuleAstParser.d.ts +0 -7
- package/dist/utils/nestModules/nestProvidedInjectableMapper.d.ts +0 -12
- package/dist/utils/nestModules/nestProvidedInjectableMapper.testData.d.ts +0 -7
- package/dist/utils/nestModules/nestProviderAstParser.d.ts +0 -7
- package/dist/utils/typedTokenHelpers.d.ts +0 -59
- package/dist/utils/wellKnownSelectors.d.ts +0 -1
|
@@ -20,12 +20,11 @@ const findModuleMapping = (classNAme, propertyName, nestModuleMap) => {
|
|
|
20
20
|
};
|
|
21
21
|
// super fragile types but whatevs
|
|
22
22
|
const checkNode = (node, decoratorName, propertyName, messageId, context) => {
|
|
23
|
-
var _a;
|
|
24
23
|
if (nestProvidedInjectableMapper_1.default.isNestInjectableThatIsNeverProvided(node)) {
|
|
25
24
|
return;
|
|
26
25
|
}
|
|
27
26
|
if (typedTokenHelpers_1.typedTokenHelpers.nodeHasDecoratorsNamed(node, [decoratorName])) {
|
|
28
|
-
const name =
|
|
27
|
+
const name = node.id?.name;
|
|
29
28
|
if (!name) {
|
|
30
29
|
return;
|
|
31
30
|
}
|
|
@@ -45,12 +44,17 @@ function initializeModuleMappings(sourcePath, filterFromPaths, context) {
|
|
|
45
44
|
listOfPotentialNestModuleFiles = fileEnumerationWrapper_1.default.enumerateFiles(mappedSourceDirectory, [".ts"], filterFromPaths);
|
|
46
45
|
nestModuleMap = nestProvidedInjectableMapper_1.default.parseFileList(listOfPotentialNestModuleFiles, context);
|
|
47
46
|
}
|
|
47
|
+
const defaultOptions = [
|
|
48
|
+
{
|
|
49
|
+
src: ["src/**/*.ts"],
|
|
50
|
+
filterFromPaths: ["dist", "node_modules", ".test.", ".spec."],
|
|
51
|
+
},
|
|
52
|
+
];
|
|
48
53
|
const rule = (0, createRule_1.createRule)({
|
|
49
54
|
name: "injectable-should-be-provided",
|
|
50
55
|
meta: {
|
|
51
56
|
docs: {
|
|
52
57
|
description: "Public api methods should have documentation",
|
|
53
|
-
recommended: false,
|
|
54
58
|
requiresTypeChecking: false,
|
|
55
59
|
},
|
|
56
60
|
messages: {
|
|
@@ -59,6 +63,7 @@ const rule = (0, createRule_1.createRule)({
|
|
|
59
63
|
},
|
|
60
64
|
schema: [
|
|
61
65
|
{
|
|
66
|
+
type: "object",
|
|
62
67
|
properties: {
|
|
63
68
|
src: {
|
|
64
69
|
description: "files/paths to be analyzed (only for provided injectable or controller)",
|
|
@@ -83,13 +88,15 @@ const rule = (0, createRule_1.createRule)({
|
|
|
83
88
|
],
|
|
84
89
|
type: "problem",
|
|
85
90
|
},
|
|
86
|
-
defaultOptions:
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
91
|
+
defaultOptions: defaultOptions,
|
|
92
|
+
create(contextWithoutDefaults) {
|
|
93
|
+
const context = contextWithoutDefaults.options &&
|
|
94
|
+
contextWithoutDefaults.options.length > 0
|
|
95
|
+
? contextWithoutDefaults
|
|
96
|
+
: // only apply the defaults when the user provides no config
|
|
97
|
+
Object.setPrototypeOf({
|
|
98
|
+
options: defaultOptions,
|
|
99
|
+
}, contextWithoutDefaults);
|
|
93
100
|
const { src, filterFromPaths,
|
|
94
101
|
// ignoreExports = [],
|
|
95
102
|
// missingExports,
|
|
@@ -117,4 +124,4 @@ const rule = (0, createRule_1.createRule)({
|
|
|
117
124
|
},
|
|
118
125
|
});
|
|
119
126
|
exports.default = rule;
|
|
120
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
127
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5qZWN0YWJsZVNob3VsZEJlUHJvdmlkZWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvcnVsZXMvaW5qZWN0YWJsZXNTaG91bGRCZVByb3ZpZGVkL2luamVjdGFibGVTaG91bGRCZVByb3ZpZGVkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQ0EsdURBQWtEO0FBQ2xELHNHQUE2RTtBQUM3RSx3SEFBZ0c7QUFFaEcscUVBQWdFO0FBSWhFLDhEQUE4RDtBQUM5RCxJQUFJLDhCQUEwQyxDQUFDO0FBQy9DLElBQUksYUFBc0QsQ0FBQztBQVMzRCxNQUFNLGlCQUFpQixHQUFHLENBQ3RCLFNBQWlCLEVBQ2pCLFlBQXlDLEVBQ3pDLGFBQXNELEVBQ2hCLEVBQUU7SUFDeEMsS0FBSyxNQUFNLEtBQUssSUFBSSxhQUFhLENBQUMsTUFBTSxFQUFFLEVBQUU7UUFDeEMsSUFBSSxLQUFLLENBQUMsWUFBWSxDQUFDLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxFQUFFO1lBQ3BDLE9BQU8sS0FBSyxDQUFDO1NBQ2hCO0tBQ0o7SUFDRCxPQUFPLFNBQVMsQ0FBQztBQUNyQixDQUFDLENBQUM7QUFFRixrQ0FBa0M7QUFDbEMsTUFBTSxTQUFTLEdBQUcsQ0FDZCxJQUErQixFQUMvQixhQUEwQyxFQUMxQyxZQUF5QyxFQUN6QyxTQUF1RCxFQUN2RCxPQUtDLEVBQ0gsRUFBRTtJQUNBLElBQ0ksc0NBQTRCLENBQUMsbUNBQW1DLENBQUMsSUFBSSxDQUFDLEVBQ3hFO1FBQ0UsT0FBTztLQUNWO0lBQ0QsSUFBSSxxQ0FBaUIsQ0FBQyxzQkFBc0IsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxhQUFhLENBQUMsQ0FBQyxFQUFFO1FBQ2pFLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDO1FBQzNCLElBQUksQ0FBQyxJQUFJLEVBQUU7WUFDUCxPQUFPO1NBQ1Y7UUFDRCxNQUFNLFFBQVEsR0FBRyxpQkFBaUIsQ0FBQyxJQUFJLEVBQUUsWUFBWSxFQUFFLGFBQWEsQ0FBQyxDQUFDO1FBQ3RFLElBQUksUUFBUSxFQUFFO1lBQ1YsT0FBTztTQUNWO1FBQ0QsNkJBQTZCO1FBQzdCLE9BQU8sQ0FBQyxNQUFNLENBQUM7WUFDWCxJQUFJLEVBQUUsSUFBSTtZQUNWLFNBQVMsRUFBRSxTQUFTO1NBQ3ZCLENBQUMsQ0FBQztLQUNOO0FBQ0wsQ0FBQyxDQUFDO0FBRUYsU0FBUyx3QkFBd0IsQ0FDN0IsVUFBa0IsRUFDbEIsZUFBeUIsRUFDekIsT0FBdUQ7SUFFdkQsTUFBTSxxQkFBcUIsR0FDdkIsc0NBQTRCLENBQUMsNkJBQTZCLENBQ3RELFVBQVUsRUFDVixPQUFPLENBQUMsR0FBRyxFQUFFLENBQ2hCLENBQUM7SUFDTiw4QkFBOEIsR0FBRyxnQ0FBcUIsQ0FBQyxjQUFjLENBQ2pFLHFCQUFxQixFQUNyQixDQUFDLEtBQUssQ0FBQyxFQUNQLGVBQWUsQ0FDbEIsQ0FBQztJQUVGLGFBQWEsR0FBRyxzQ0FBNEIsQ0FBQyxhQUFhLENBQ3RELDhCQUE4QixFQUM5QixPQUFPLENBQ1YsQ0FBQztBQUNOLENBQUM7QUFDRCxNQUFNLGNBQWMsR0FBRztJQUNuQjtRQUNJLEdBQUcsRUFBRSxDQUFDLGFBQWEsQ0FBQztRQUNwQixlQUFlLEVBQUUsQ0FBQyxNQUFNLEVBQUUsY0FBYyxFQUFFLFFBQVEsRUFBRSxRQUFRLENBQUM7S0FDaEU7Q0FDTyxDQUFDO0FBQ2IsTUFBTSxJQUFJLEdBQUcsSUFBQSx1QkFBVSxFQUF3RDtJQUMzRSxJQUFJLEVBQUUsK0JBQStCO0lBQ3JDLElBQUksRUFBRTtRQUNGLElBQUksRUFBRTtZQUNGLFdBQVcsRUFBRSw4Q0FBOEM7WUFFM0Qsb0JBQW9CLEVBQUUsS0FBSztTQUM5QjtRQUNELFFBQVEsRUFBRTtZQUNOLGtCQUFrQixFQUFFLHVOQUF1TjtZQUMzTyxtQkFBbUIsRUFBRSx5TkFBeU47U0FDalA7UUFDRCxNQUFNLEVBQUU7WUFDSjtnQkFDSSxJQUFJLEVBQUUsUUFBK0I7Z0JBQ3JDLFVBQVUsRUFBRTtvQkFDUixHQUFHLEVBQUU7d0JBQ0QsV0FBVyxFQUNQLHlFQUF5RTt3QkFDN0UsSUFBSSxFQUFFLE9BQThCO3dCQUNwQyxRQUFRLEVBQUUsQ0FBQzt3QkFDWCxLQUFLLEVBQUU7NEJBQ0gsSUFBSSxFQUFFLFFBQStCOzRCQUNyQyxTQUFTLEVBQUUsQ0FBQzt5QkFDZjtxQkFDSjtvQkFDRCxlQUFlLEVBQUU7d0JBQ2IsV0FBVyxFQUNQLDZFQUE2RTt3QkFDakYsSUFBSSxFQUFFLE9BQThCO3dCQUNwQyxRQUFRLEVBQUUsQ0FBQzt3QkFDWCxLQUFLLEVBQUU7NEJBQ0gsSUFBSSxFQUFFLFFBQStCOzRCQUNyQyxTQUFTLEVBQUUsQ0FBQzt5QkFDZjtxQkFDSjtpQkFDSjthQUNKO1NBQ0o7UUFDRCxJQUFJLEVBQUUsU0FBUztLQUNsQjtJQUNELGNBQWMsRUFBRSxjQUFjO0lBRTlCLE1BQU0sQ0FBQyxzQkFBc0I7UUFDekIsTUFBTSxPQUFPLEdBQ1Qsc0JBQXNCLENBQUMsT0FBTztZQUM5QixzQkFBc0IsQ0FBQyxPQUFPLENBQUMsTUFBTSxHQUFHLENBQUM7WUFDckMsQ0FBQyxDQUFDLHNCQUFzQjtZQUN4QixDQUFDLENBQUMsMkRBQTJEO2dCQUMxRCxNQUFNLENBQUMsY0FBYyxDQUNsQjtvQkFDSSxPQUFPLEVBQUUsY0FBYztpQkFDMUIsRUFDRCxzQkFBc0IsQ0FNeEIsQ0FBQztRQUViLE1BQU0sRUFDRixHQUFHLEVBQ0gsZUFBZTtRQUNmLHNCQUFzQjtRQUN0QixrQkFBa0I7UUFDbEIsaUJBQWlCO1VBQ3BCLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7UUFFN0IsSUFBSSxhQUFhLEtBQUssU0FBUyxJQUFJLGFBQWEsQ0FBQyxJQUFJLEtBQUssQ0FBQyxFQUFFO1lBQ3pELHdCQUF3QixDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxlQUFlLEVBQUUsT0FBTyxDQUFDLENBQUM7U0FDOUQ7UUFFRCxPQUFPO1lBQ0gsZ0VBQWdFO1lBQ2hFLGdCQUFnQixDQUFDLElBQStCO2dCQUM1QyxTQUFTLENBQ0wsSUFBSSxFQUNKLFlBQVksRUFDWixXQUFXLEVBQ1gsb0JBQW9CLEVBQ3BCLE9BQU8sQ0FDVixDQUFDO2dCQUNGLFNBQVMsQ0FDTCxJQUFJLEVBQ0osWUFBWSxFQUNaLGFBQWEsRUFDYixxQkFBcUIsRUFDckIsT0FBTyxDQUNWLENBQUM7WUFDTixDQUFDO1lBQ0QsZ0VBQWdFO1lBQ2hFLGNBQWM7Z0JBQ1Ysb0NBQW9DO2dCQUNwQyw2Q0FBNkM7Z0JBQzdDLE1BQU0seUJBQXlCLEdBQzNCLHNDQUE0QixDQUFDLHlCQUF5QixDQUNsRCxPQUFPLENBQUMsYUFBYSxFQUFFLENBQUMsR0FBRyxFQUMzQixPQUFPLENBQUMsV0FBVyxFQUFFLENBQ3hCLENBQUM7Z0JBQ04sSUFBSSx5QkFBeUIsS0FBSyxJQUFJLEVBQUU7b0JBQ3BDLGFBQWEsQ0FBQyxHQUFHLENBQ2IseUJBQXlCLENBQUMsQ0FBQyxDQUFXLEVBQ3RDLHlCQUF5QixDQUFDLENBQUMsQ0FBK0IsQ0FDN0QsQ0FBQztpQkFDTDtZQUNMLENBQUM7U0FDSixDQUFDO0lBQ04sQ0FBQztDQUNKLENBQUMsQ0FBQztBQUVILGtCQUFlLElBQUksQ0FBQyJ9
|
package/dist/rules/paramDecoratorNameMatchesRouteParam/paramDecoratorNameMatchesRouteParam.js
CHANGED
|
@@ -15,24 +15,22 @@ const nestRequestMethodDecoratorNames = new Set([
|
|
|
15
15
|
"All",
|
|
16
16
|
]);
|
|
17
17
|
const parsePathParts = (decorator) => {
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
if (
|
|
21
|
-
|
|
18
|
+
const decoratorArgument = decorator?.expression
|
|
19
|
+
?.arguments[0];
|
|
20
|
+
if (decoratorArgument?.type === utils_1.TSESTree.AST_NODE_TYPES.TemplateLiteral ||
|
|
21
|
+
decoratorArgument?.type === utils_1.TSESTree.AST_NODE_TYPES.Identifier) {
|
|
22
22
|
return ["dareslint__skip"];
|
|
23
23
|
}
|
|
24
|
-
if (
|
|
24
|
+
if (decoratorArgument?.type === utils_1.TSESTree.AST_NODE_TYPES.Literal) {
|
|
25
25
|
return [decoratorArgument.raw];
|
|
26
26
|
}
|
|
27
|
-
if (
|
|
27
|
+
if (decoratorArgument?.type === utils_1.TSESTree.AST_NODE_TYPES.ArrayExpression) {
|
|
28
28
|
return decoratorArgument.elements.map((x) => x.raw);
|
|
29
29
|
}
|
|
30
|
-
if (
|
|
30
|
+
if (decoratorArgument?.type === utils_1.TSESTree.AST_NODE_TYPES.ObjectExpression) {
|
|
31
31
|
return decoratorArgument.properties
|
|
32
|
-
.filter((x) =>
|
|
33
|
-
|
|
34
|
-
return ((_a = x === null || x === void 0 ? void 0 : x.key) === null || _a === void 0 ? void 0 : _a.name) === "path";
|
|
35
|
-
})
|
|
32
|
+
.filter((x) => x?.key
|
|
33
|
+
?.name === "path")
|
|
36
34
|
.map((x) => x.value.raw);
|
|
37
35
|
}
|
|
38
36
|
return [];
|
|
@@ -72,7 +70,6 @@ const isParameterNameIncludedInAPathPart = (paramName, pathPartsToCheck) => {
|
|
|
72
70
|
};
|
|
73
71
|
exports.isParameterNameIncludedInAPathPart = isParameterNameIncludedInAPathPart;
|
|
74
72
|
const shouldTrigger = (decorator) => {
|
|
75
|
-
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l;
|
|
76
73
|
if (!decorator) {
|
|
77
74
|
return {
|
|
78
75
|
hasColonInName: false,
|
|
@@ -80,7 +77,8 @@ const shouldTrigger = (decorator) => {
|
|
|
80
77
|
};
|
|
81
78
|
}
|
|
82
79
|
// grab the param name
|
|
83
|
-
const paramName =
|
|
80
|
+
const paramName = decorator.expression
|
|
81
|
+
?.arguments[0]?.value;
|
|
84
82
|
// if there's no param name get out of here
|
|
85
83
|
if (!paramName || paramName === "") {
|
|
86
84
|
return {
|
|
@@ -97,18 +95,20 @@ const shouldTrigger = (decorator) => {
|
|
|
97
95
|
}
|
|
98
96
|
let pathPartsToCheck = [];
|
|
99
97
|
// grab any controller path parts
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
98
|
+
// eslint-disable-next-line @typescript-eslint/non-nullable-type-assertion-style
|
|
99
|
+
const controllerDecorator = decorator.parent?.parent?.parent?.parent
|
|
100
|
+
?.parent?.decorators?.find((d) => {
|
|
101
|
+
return (d.expression
|
|
102
|
+
.callee?.name === "Controller");
|
|
104
103
|
});
|
|
105
104
|
pathPartsToCheck = pathPartsToCheck.concat((0, exports.parsePathParts)(controllerDecorator));
|
|
106
105
|
// grab any api method path parts from method decorator
|
|
107
|
-
const methodDefinition =
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
106
|
+
const methodDefinition = decorator.parent?.parent
|
|
107
|
+
?.parent;
|
|
108
|
+
// eslint-disable-next-line @typescript-eslint/non-nullable-type-assertion-style
|
|
109
|
+
const methodDecorator = methodDefinition?.decorators?.find((d) => {
|
|
110
|
+
return nestRequestMethodDecoratorNames.has(d.expression
|
|
111
|
+
.callee?.name);
|
|
112
112
|
});
|
|
113
113
|
pathPartsToCheck = pathPartsToCheck.concat((0, exports.parsePathParts)(methodDecorator));
|
|
114
114
|
const shouldIgnoreThisSetOfRoutes =
|
|
@@ -133,7 +133,6 @@ const rule = (0, createRule_1.createRule)({
|
|
|
133
133
|
meta: {
|
|
134
134
|
docs: {
|
|
135
135
|
description: 'Param decorators with a name parameter e.g. Param("myvar") should match a specified route parameter - e.g. Get(":myvar")',
|
|
136
|
-
recommended: false,
|
|
137
136
|
requiresTypeChecking: false,
|
|
138
137
|
},
|
|
139
138
|
messages: {
|
|
@@ -149,8 +148,8 @@ const rule = (0, createRule_1.createRule)({
|
|
|
149
148
|
return {
|
|
150
149
|
// eslint-disable-next-line @typescript-eslint/naming-convention
|
|
151
150
|
Decorator(node) {
|
|
152
|
-
|
|
153
|
-
|
|
151
|
+
if (node.expression
|
|
152
|
+
?.callee?.name !== "Param") {
|
|
154
153
|
return;
|
|
155
154
|
}
|
|
156
155
|
// eslint-disable-next-line @typescript-eslint/naming-convention
|
|
@@ -172,4 +171,4 @@ const rule = (0, createRule_1.createRule)({
|
|
|
172
171
|
},
|
|
173
172
|
});
|
|
174
173
|
exports.default = rule;
|
|
175
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
174
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFyYW1EZWNvcmF0b3JOYW1lTWF0Y2hlc1JvdXRlUGFyYW0uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvcnVsZXMvcGFyYW1EZWNvcmF0b3JOYW1lTWF0Y2hlc1JvdXRlUGFyYW0vcGFyYW1EZWNvcmF0b3JOYW1lTWF0Y2hlc1JvdXRlUGFyYW0udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsa0RBQWtEO0FBQ2xELG9EQUFrRDtBQUNsRCx1REFBa0Q7QUFPbEQsTUFBTSwrQkFBK0IsR0FBRyxJQUFJLEdBQUcsQ0FBQztJQUM1QyxLQUFLO0lBQ0wsTUFBTTtJQUNOLEtBQUs7SUFDTCxRQUFRO0lBQ1IsT0FBTztJQUNQLFNBQVM7SUFDVCxNQUFNO0lBQ04sS0FBSztDQUNSLENBQUMsQ0FBQztBQUVJLE1BQU0sY0FBYyxHQUFHLENBQUMsU0FBNkIsRUFBWSxFQUFFO0lBQ3RFLE1BQU0saUJBQWlCLEdBQUksU0FBUyxFQUFFLFVBQXNDO1FBQ3hFLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBRW5CLElBQ0ksaUJBQWlCLEVBQUUsSUFBSSxLQUFLLGdCQUFRLENBQUMsY0FBYyxDQUFDLGVBQWU7UUFDbkUsaUJBQWlCLEVBQUUsSUFBSSxLQUFLLGdCQUFRLENBQUMsY0FBYyxDQUFDLFVBQVUsRUFDaEU7UUFDRSxPQUFPLENBQUMsaUJBQWlCLENBQUMsQ0FBQztLQUM5QjtJQUVELElBQUksaUJBQWlCLEVBQUUsSUFBSSxLQUFLLGdCQUFRLENBQUMsY0FBYyxDQUFDLE9BQU8sRUFBRTtRQUM3RCxPQUFPLENBQUMsaUJBQWlCLENBQUMsR0FBRyxDQUFDLENBQUM7S0FDbEM7SUFDRCxJQUFJLGlCQUFpQixFQUFFLElBQUksS0FBSyxnQkFBUSxDQUFDLGNBQWMsQ0FBQyxlQUFlLEVBQUU7UUFDckUsT0FBTyxpQkFBaUIsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUNqQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUUs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
|
|
@@ -6,22 +6,23 @@ const createRule_1 = require("../../utils/createRule");
|
|
|
6
6
|
//import util from "util";
|
|
7
7
|
const nestProviderAstParser_1 = require("../../utils/nestModules/nestProviderAstParser");
|
|
8
8
|
const hasMismatchedInjected = (node) => {
|
|
9
|
-
var _a, _b, _c, _d, _e, _f, _g;
|
|
10
9
|
// should be a nest provider - note this doesn't check the Provider used is an import actually from nest. Assumes nest Provider. Will change if this is annoying:)
|
|
11
10
|
// edit 03/06/2023 - it was annoying and someone complained on github so I added a check for a "useFactory" property on the Provider declaration
|
|
12
|
-
const isNestProvider =
|
|
11
|
+
const isNestProvider = node.id.typeAnnotation
|
|
12
|
+
?.typeAnnotation
|
|
13
13
|
// prettier-ignore
|
|
14
14
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
15
|
-
|
|
15
|
+
?.typeName?.name === "Provider" &&
|
|
16
16
|
// and there is a useFactory property in the declaration
|
|
17
17
|
nestProviderAstParser_1.nestProviderAstParser.findProvideProperty(node, "useFactory");
|
|
18
18
|
if (!isNestProvider) {
|
|
19
19
|
return false;
|
|
20
20
|
}
|
|
21
21
|
// count number of factory params
|
|
22
|
-
const factoryParameterCount =
|
|
22
|
+
const factoryParameterCount = nestProviderAstParser_1.nestProviderAstParser.findProvideProperty(node, "useFactory")
|
|
23
|
+
?.value?.params?.length;
|
|
23
24
|
// Count number of injected params
|
|
24
|
-
const injectedParameter =
|
|
25
|
+
const injectedParameter = nestProviderAstParser_1.nestProviderAstParser.findProvideProperty(node, "inject")?.value;
|
|
25
26
|
const injectedParameterCount = injectedParameter
|
|
26
27
|
? injectedParameter.elements.length
|
|
27
28
|
: 0;
|
|
@@ -34,7 +35,6 @@ const rule = (0, createRule_1.createRule)({
|
|
|
34
35
|
meta: {
|
|
35
36
|
docs: {
|
|
36
37
|
description: "The injected items in a provider should typically match the parameters to the factory method used",
|
|
37
|
-
recommended: false,
|
|
38
38
|
requiresTypeChecking: false,
|
|
39
39
|
},
|
|
40
40
|
messages: {
|
|
@@ -59,4 +59,4 @@ const rule = (0, createRule_1.createRule)({
|
|
|
59
59
|
},
|
|
60
60
|
});
|
|
61
61
|
exports.default = rule;
|
|
62
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
62
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUHJvdmlkZXJJbmplY3RlZFNob3VsZE1hdGNoRmFjdG9yeS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9ydWxlcy9wcm92aWRlckluamVjdGVkU2hvdWxkTWF0Y2hGYWN0b3J5L1Byb3ZpZGVySW5qZWN0ZWRTaG91bGRNYXRjaEZhY3RvcnkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQ0EsdURBQWtEO0FBQ2xELGdEQUFnRDtBQUNoRCwwQkFBMEI7QUFDMUIseUZBQW9GO0FBRTdFLE1BQU0scUJBQXFCLEdBQUcsQ0FDakMsSUFBaUMsRUFDMUIsRUFBRTtJQUNULGtLQUFrSztJQUNsSyxnSkFBZ0o7SUFDaEosTUFBTSxjQUFjLEdBR1osSUFBSSxDQUFDLEVBQUUsQ0FBQyxjQUFjO1FBQ2xCLEVBQUUsY0FBMEM7SUFDdEQsa0JBQWtCO0lBQ2xCLDhEQUE4RDtJQUMzRCxFQUFFLFFBQ0YsRUFBRSxJQUFJLEtBQUssVUFBVTtRQUN0Qix3REFBd0Q7UUFDeEQsNkNBQXFCLENBQUMsbUJBQW1CLENBQUMsSUFBSSxFQUFFLFlBQVksQ0FBQyxDQUFDO0lBRWxFLElBQUksQ0FBQyxjQUFjLEVBQUU7UUFDakIsT0FBTyxLQUFLLENBQUM7S0FDaEI7SUFFRCxpQ0FBaUM7SUFDakMsTUFBTSxxQkFBcUIsR0FDdkIsNkNBQXFCLENBQUMsbUJBQW1CLENBQUMsSUFBSSxFQUFFLFlBQVksQ0FBQztRQUN6RCxFQUFFLEtBQ1QsRUFBRSxNQUFNLEVBQUUsTUFBTSxDQUFDO0lBRWxCLGtDQUFrQztJQUNsQyxNQUFNLGlCQUFpQixHQUFHLDZDQUFxQixDQUFDLG1CQUFtQixDQUMvRCxJQUFJLEVBQ0osUUFBUSxDQUNYLEVBQUUsS0FBNEMsQ0FBQztJQUVoRCxNQUFNLHNCQUFzQixHQUFHLGlCQUFpQjtRQUM1QyxDQUFDLENBQUMsaUJBQWlCLENBQUMsUUFBUSxDQUFDLE1BQU07UUFDbkMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUVSLHVCQUF1QjtJQUN2QixPQUFPLHNCQUFzQixLQUFLLHFCQUFxQixDQUFDO0FBQzVELENBQUMsQ0FBQztBQXZDVyxRQUFBLHFCQUFxQix5QkF1Q2hDO0FBRUYsTUFBTSxJQUFJLEdBQUcsSUFBQSx1QkFBVSxFQUFvQjtJQUN2QyxJQUFJLEVBQUUsbURBQW1EO0lBQ3pELElBQUksRUFBRTtRQUNGLElBQUksRUFBRTtZQUNGLFdBQVcsRUFDUCxtR0FBbUc7WUFFdkcsb0JBQW9CLEVBQUUsS0FBSztTQUM5QjtRQUNELFFBQVEsRUFBRTtZQUNOLFdBQVcsRUFBRSwwRkFBMEY7U0FDMUc7UUFDRCxNQUFNLEVBQUUsRUFBRTtRQUNWLElBQUksRUFBRSxTQUFTO0tBQ2xCO0lBQ0QsY0FBYyxFQUFFLEVBQUU7SUFFbEIsTUFBTSxDQUFDLE9BQU87UUFDVixPQUFPO1lBQ0gsZ0VBQWdFO1lBQ2hFLGtCQUFrQixDQUFDLElBQWlDO2dCQUNoRCxJQUFJLElBQUEsNkJBQXFCLEVBQUMsSUFBSSxDQUFDLEVBQUU7b0JBQzdCLE9BQU8sQ0FBQyxNQUFNLENBQUM7d0JBQ1gsSUFBSSxFQUFFLElBQUk7d0JBQ1YsU0FBUyxFQUFFLGFBQWE7cUJBQzNCLENBQUMsQ0FBQztpQkFDTjtZQUNMLENBQUM7U0FDSixDQUFDO0lBQ04sQ0FBQztDQUNKLENBQUMsQ0FBQztBQUVILGtCQUFlLElBQUksQ0FBQyJ9
|
|
@@ -3,10 +3,10 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.shouldTriggerForVariableDecleratorExpression = exports.shouldTriggerNewExpressionHasProperty = exports.checkObjectExpression = exports.isValidationPipeNewExpression = void 0;
|
|
4
4
|
const utils_1 = require("@typescript-eslint/utils");
|
|
5
5
|
const createRule_1 = require("../../utils/createRule");
|
|
6
|
-
const
|
|
6
|
+
const utils_2 = require("@typescript-eslint/utils");
|
|
7
7
|
const isValidationPipeNewExpression = (node) => {
|
|
8
8
|
const newExpression = node;
|
|
9
|
-
const callee = newExpression
|
|
9
|
+
const callee = newExpression?.callee;
|
|
10
10
|
if (callee && callee.name === "ValidationPipe") {
|
|
11
11
|
return true;
|
|
12
12
|
}
|
|
@@ -14,17 +14,19 @@ const isValidationPipeNewExpression = (node) => {
|
|
|
14
14
|
};
|
|
15
15
|
exports.isValidationPipeNewExpression = isValidationPipeNewExpression;
|
|
16
16
|
const checkObjectExpression = (os) => {
|
|
17
|
-
var _a;
|
|
18
17
|
if (!os) {
|
|
19
18
|
return false;
|
|
20
19
|
}
|
|
21
|
-
|
|
20
|
+
// eslint-disable-next-line @typescript-eslint/non-nullable-type-assertion-style
|
|
21
|
+
const forbidUnknownValuesProperty = os?.properties
|
|
22
|
+
?.filter(utils_2.ASTUtils.isNodeOfType(utils_1.TSESTree.AST_NODE_TYPES.Property))
|
|
23
|
+
.find((p) => p.key.name === "forbidUnknownValues");
|
|
22
24
|
// property is not present. this is wrong.
|
|
23
25
|
if (os && !forbidUnknownValuesProperty) {
|
|
24
26
|
return true;
|
|
25
27
|
}
|
|
26
28
|
// property is explicitly false. this is wrong.
|
|
27
|
-
const isPropertyValueExplicitlyFalse = (forbidUnknownValuesProperty
|
|
29
|
+
const isPropertyValueExplicitlyFalse = (forbidUnknownValuesProperty?.value).raw ===
|
|
28
30
|
"false";
|
|
29
31
|
if (isPropertyValueExplicitlyFalse) {
|
|
30
32
|
return true;
|
|
@@ -34,7 +36,6 @@ const checkObjectExpression = (os) => {
|
|
|
34
36
|
};
|
|
35
37
|
exports.checkObjectExpression = checkObjectExpression;
|
|
36
38
|
const shouldTriggerNewExpressionHasProperty = (node) => {
|
|
37
|
-
var _a;
|
|
38
39
|
// only look at ValidationPipe expressions
|
|
39
40
|
if (!(0, exports.isValidationPipeNewExpression)(node)) {
|
|
40
41
|
return false;
|
|
@@ -43,21 +44,22 @@ const shouldTriggerNewExpressionHasProperty = (node) => {
|
|
|
43
44
|
// the default new ValidationPipe() seems to prevent the attack so we ignore calls with no parameters
|
|
44
45
|
// we also ignore parameters that are not explicit object expressions
|
|
45
46
|
// or if the properties are spread
|
|
46
|
-
if (
|
|
47
|
-
newExpression.arguments[0].type !==
|
|
48
|
-
|
|
47
|
+
if (newExpression.arguments?.length === 0 ||
|
|
48
|
+
newExpression.arguments[0].type !==
|
|
49
|
+
utils_1.TSESTree.AST_NODE_TYPES.ObjectExpression ||
|
|
50
|
+
newExpression.arguments[0].properties.some(utils_2.ASTUtils.isNodeOfType(utils_1.TSESTree.AST_NODE_TYPES.SpreadElement))) {
|
|
49
51
|
return false;
|
|
50
52
|
}
|
|
51
|
-
const argument = newExpression
|
|
53
|
+
const argument = newExpression?.arguments[0];
|
|
52
54
|
return (0, exports.checkObjectExpression)(argument);
|
|
53
55
|
};
|
|
54
56
|
exports.shouldTriggerNewExpressionHasProperty = shouldTriggerNewExpressionHasProperty;
|
|
55
57
|
const shouldTriggerForVariableDecleratorExpression = (node) => {
|
|
56
58
|
// if the developer hasn't annotated the object we can't continue to check these rules correctly (we don't know if anonymous objects need to have any props)
|
|
57
59
|
const variableDeclarator = node;
|
|
58
|
-
const asExpression = variableDeclarator
|
|
59
|
-
const typeAnnotation = asExpression
|
|
60
|
-
const typeName = typeAnnotation
|
|
60
|
+
const asExpression = variableDeclarator?.init;
|
|
61
|
+
const typeAnnotation = asExpression?.typeAnnotation;
|
|
62
|
+
const typeName = typeAnnotation?.typeName;
|
|
61
63
|
if (typeName === undefined || typeName.name !== "ValidationPipeOptions") {
|
|
62
64
|
return false;
|
|
63
65
|
}
|
|
@@ -70,7 +72,6 @@ const rule = (0, createRule_1.createRule)({
|
|
|
70
72
|
meta: {
|
|
71
73
|
docs: {
|
|
72
74
|
description: "ValidationPipe should use forbidUnknownValues: true to prevent attacks. See https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2019-18413",
|
|
73
|
-
recommended: false,
|
|
74
75
|
requiresTypeChecking: false,
|
|
75
76
|
},
|
|
76
77
|
messages: {
|
|
@@ -109,4 +110,4 @@ const rule = (0, createRule_1.createRule)({
|
|
|
109
110
|
},
|
|
110
111
|
});
|
|
111
112
|
exports.default = rule;
|
|
112
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
113
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2hvdWxkU3BlY2lmeUZvcmJpZFVua25vd25WYWx1ZXNSdWxlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3J1bGVzL3Nob3VsZFNwZWNpZnlGb3JiaWRVbmtub3duVmFsdWVzL3Nob3VsZFNwZWNpZnlGb3JiaWRVbmtub3duVmFsdWVzUnVsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFDQSxvREFBa0Q7QUFDbEQsdURBQWtEO0FBQ2xELG9EQUFrRDtBQUUzQyxNQUFNLDZCQUE2QixHQUFHLENBQUMsSUFBbUIsRUFBVyxFQUFFO0lBQzFFLE1BQU0sYUFBYSxHQUFHLElBQThCLENBQUM7SUFDckQsTUFBTSxNQUFNLEdBQUcsYUFBYSxFQUFFLE1BQTZCLENBQUM7SUFDNUQsSUFBSSxNQUFNLElBQUksTUFBTSxDQUFDLElBQUksS0FBSyxnQkFBZ0IsRUFBRTtRQUM1QyxPQUFPLElBQUksQ0FBQztLQUNmO0lBQ0QsT0FBTyxLQUFLLENBQUM7QUFDakIsQ0FBQyxDQUFDO0FBUFcsUUFBQSw2QkFBNkIsaUNBT3hDO0FBQ0ssTUFBTSxxQkFBcUIsR0FBRyxDQUNqQyxFQUE2QixFQUN0QixFQUFFO0lBQ1QsSUFBSSxDQUFDLEVBQUUsRUFBRTtRQUNMLE9BQU8sS0FBSyxDQUFDO0tBQ2hCO0lBQ0QsZ0ZBQWdGO0lBQ2hGLE1BQU0sMkJBQTJCLEdBQUcsRUFBRSxFQUFFLFVBQVU7UUFDOUMsRUFBRSxNQUFNLENBQUMsZ0JBQVEsQ0FBQyxZQUFZLENBQUMsZ0JBQVEsQ0FBQyxjQUFjLENBQUMsUUFBUSxDQUFDLENBQUM7U0FDaEUsSUFBSSxDQUNELENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBRSxDQUFDLENBQUMsR0FBMkIsQ0FBQyxJQUFJLEtBQUsscUJBQXFCLENBQ2xELENBQUM7SUFDM0IsMENBQTBDO0lBQzFDLElBQUksRUFBRSxJQUFJLENBQUMsMkJBQTJCLEVBQUU7UUFDcEMsT0FBTyxJQUFJLENBQUM7S0FDZjtJQUNE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
|
|
@@ -4,17 +4,17 @@ exports.getRelevantNodeName = exports.isValidModuleMetaPropertyType = void 0;
|
|
|
4
4
|
const utils_1 = require("@typescript-eslint/utils");
|
|
5
5
|
const createRule_1 = require("../../utils/createRule");
|
|
6
6
|
const wellKnownSelectors_1 = require("../../utils/wellKnownSelectors");
|
|
7
|
-
const
|
|
7
|
+
const utils_2 = require("@typescript-eslint/utils");
|
|
8
8
|
// Inspired by https://github.com/angular-eslint/angular-eslint/blob/main/packages/eslint-plugin/src/rules/sort-ngmodule-metadata-arrays.ts
|
|
9
9
|
const DEFAULT_LOCALE = "en-US";
|
|
10
10
|
const isValidModuleMetaPropertyType = (node) => {
|
|
11
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-return
|
|
11
12
|
return (!!node &&
|
|
12
|
-
|
|
13
|
+
utils_2.ASTUtils.isNodeOfTypes([
|
|
13
14
|
utils_1.TSESTree.AST_NODE_TYPES.Identifier,
|
|
14
15
|
utils_1.TSESTree.AST_NODE_TYPES.CallExpression,
|
|
15
16
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
16
|
-
]) // unsure about this type
|
|
17
|
-
);
|
|
17
|
+
])); // unsure about this type
|
|
18
18
|
};
|
|
19
19
|
exports.isValidModuleMetaPropertyType = isValidModuleMetaPropertyType;
|
|
20
20
|
const getRelevantNodeName = (node) => {
|
|
@@ -30,13 +30,17 @@ const getRelevantNodeName = (node) => {
|
|
|
30
30
|
return currentName;
|
|
31
31
|
};
|
|
32
32
|
exports.getRelevantNodeName = getRelevantNodeName;
|
|
33
|
+
const defaultLocaleOptions = [
|
|
34
|
+
{
|
|
35
|
+
locale: DEFAULT_LOCALE,
|
|
36
|
+
},
|
|
37
|
+
];
|
|
33
38
|
exports.default = (0, createRule_1.createRule)({
|
|
34
39
|
name: "sort-module-metadata-arrays",
|
|
35
40
|
meta: {
|
|
36
41
|
type: "suggestion",
|
|
37
42
|
docs: {
|
|
38
43
|
description: "Ensures ASC alphabetical order for `Module` metadata arrays for easy visual scanning",
|
|
39
|
-
recommended: false,
|
|
40
44
|
},
|
|
41
45
|
fixable: "code",
|
|
42
46
|
schema: [
|
|
@@ -56,12 +60,16 @@ exports.default = (0, createRule_1.createRule)({
|
|
|
56
60
|
moduleMetadataArraysAreSorted: "`Module` metadata arrays should be sorted in ASC alphabetical order",
|
|
57
61
|
},
|
|
58
62
|
},
|
|
59
|
-
defaultOptions:
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
63
|
+
defaultOptions: defaultLocaleOptions,
|
|
64
|
+
create(contextWithoutDefaults) {
|
|
65
|
+
const context = contextWithoutDefaults.options &&
|
|
66
|
+
contextWithoutDefaults.options.length > 0
|
|
67
|
+
? contextWithoutDefaults
|
|
68
|
+
: // only apply the defaults when the user provides no config
|
|
69
|
+
Object.setPrototypeOf({
|
|
70
|
+
options: defaultLocaleOptions,
|
|
71
|
+
}, contextWithoutDefaults);
|
|
72
|
+
const { locale } = context.options[0];
|
|
65
73
|
const sourceCode = context.getSourceCode();
|
|
66
74
|
return {
|
|
67
75
|
[`${wellKnownSelectors_1.MODULE_CLASS_DECORATOR} Property > ArrayExpression`]({ elements, }) {
|
|
@@ -90,4 +98,4 @@ exports.default = (0, createRule_1.createRule)({
|
|
|
90
98
|
};
|
|
91
99
|
},
|
|
92
100
|
});
|
|
93
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
101
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic29ydE1vZHVsZU1ldGFkYXRhQXJyYXlzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3J1bGVzL3NvcnRNb2R1bGVNZXRhZGF0YUFycmF5cy9zb3J0TW9kdWxlTWV0YWRhdGFBcnJheXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsb0RBQWtEO0FBQ2xELHVEQUFrRDtBQUNsRCx1RUFBc0U7QUFDdEUsb0RBQWtEO0FBRWxELDJJQUEySTtBQUUzSSxNQUFNLGNBQWMsR0FBRyxPQUFPLENBQUM7QUFZeEIsTUFBTSw2QkFBNkIsR0FBRyxDQUN6QyxJQUF5RCxFQUM3QixFQUFFO0lBQzlCLCtEQUErRDtJQUMvRCxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUk7UUFDVixnQkFBUSxDQUFDLGFBQWEsQ0FBQztZQUNuQixnQkFBUSxDQUFDLGNBQWMsQ0FBQyxVQUFVO1lBQ2xDLGdCQUFRLENBQUMsY0FBYyxDQUFDLGNBQWM7WUFDdEMsOERBQThEO1NBQ2pFLENBQUMsQ0FBUSxDQUFDLENBQUMseUJBQXlCO0FBQzdDLENBQUMsQ0FBQztBQVZXLFFBQUEsNkJBQTZCLGlDQVV4QztBQUNLLE1BQU0sbUJBQW1CLEdBQUcsQ0FBQyxJQUFtQixFQUFFLEVBQUU7SUFDdkQsSUFBSSxXQUFXLEdBQUcsRUFBRSxDQUFDO0lBRXJCLElBQUksSUFBSSxDQUFDLElBQUksS0FBSyxnQkFBUSxDQUFDLGNBQWMsQ0FBQyxVQUFVLEVBQUU7UUFDbEQsV0FBVyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUM7S0FDM0I7SUFDRCxJQUNJLElBQUksQ0FBQyxJQUFJLEtBQUssZ0JBQVEsQ0FBQyxjQUFjLENBQUMsY0FBYztRQUNwRCxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksS0FBSyxnQkFBUSxDQUFDLGNBQWMsQ0FBQyxnQkFBZ0I7UUFDN0QsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxLQUFLLGdCQUFRLENBQUMsY0FBYyxD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
|
|
@@ -9,19 +9,18 @@ const createRule_1 = require("../../utils/createRule");
|
|
|
9
9
|
const typedTokenHelpers_1 = require("../../utils/typedTokenHelpers");
|
|
10
10
|
const arraySetResultModel_1 = __importDefault(require("./arraySetResultModel"));
|
|
11
11
|
const shouldSetArrayProperty = (node) => {
|
|
12
|
-
var _a, _b, _c, _d;
|
|
13
12
|
const decorators = typedTokenHelpers_1.typedTokenHelpers.getDecoratorsNamed(node, [
|
|
14
13
|
"ValidateNested",
|
|
15
14
|
]);
|
|
16
15
|
if (decorators.length === 0) {
|
|
17
16
|
return new arraySetResultModel_1.default(false, false);
|
|
18
17
|
}
|
|
19
|
-
const firstArgumentToDecorator =
|
|
18
|
+
const firstArgumentToDecorator = decorators[0].expression?.arguments[0];
|
|
20
19
|
const hasEachSetInOptions = typedTokenHelpers_1.typedTokenHelpers.getPropertyValueEqualsExpected(firstArgumentToDecorator, "each", true);
|
|
21
20
|
// handle string[] or Array<string>
|
|
22
|
-
const isArrayType = (
|
|
23
|
-
.typeName
|
|
24
|
-
const isTypescriptArrayType =
|
|
21
|
+
const isArrayType = (node.typeAnnotation?.typeAnnotation)
|
|
22
|
+
.typeName?.name === "Array";
|
|
23
|
+
const isTypescriptArrayType = node.typeAnnotation?.typeAnnotation.type === utils_1.AST_NODE_TYPES.TSArrayType;
|
|
25
24
|
const isAnArrayLikeType = isArrayType || isTypescriptArrayType;
|
|
26
25
|
return new arraySetResultModel_1.default(isAnArrayLikeType && !hasEachSetInOptions, !isAnArrayLikeType && hasEachSetInOptions);
|
|
27
26
|
};
|
|
@@ -31,7 +30,6 @@ const rule = (0, createRule_1.createRule)({
|
|
|
31
30
|
meta: {
|
|
32
31
|
docs: {
|
|
33
32
|
description: "If you set ValidateNested() on an array, you should set {each: true} in the options",
|
|
34
|
-
recommended: false,
|
|
35
33
|
requiresTypeChecking: false,
|
|
36
34
|
},
|
|
37
35
|
messages: {
|
|
@@ -65,4 +63,4 @@ const rule = (0, createRule_1.createRule)({
|
|
|
65
63
|
},
|
|
66
64
|
});
|
|
67
65
|
exports.default = rule;
|
|
68
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
66
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFsaWRhdGVOZXN0ZWRPZkFycmF5U2hvdWxkU2V0RWFjaC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9ydWxlcy92YWxpZGF0ZU5lc3RlZE9mQXJyYXlTaG91bGRTZXRFYWNoL3ZhbGlkYXRlTmVzdGVkT2ZBcnJheVNob3VsZFNldEVhY2gudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsb0RBQWtFO0FBQ2xFLHVEQUFrRDtBQUNsRCxxRUFBZ0U7QUFDaEUsZ0ZBQXdEO0FBRWpELE1BQU0sc0JBQXNCLEdBQUcsQ0FDbEMsSUFBaUMsRUFDZCxFQUFFO0lBQ3JCLE1BQU0sVUFBVSxHQUFHLHFDQUFpQixDQUFDLGtCQUFrQixDQUFDLElBQUksRUFBRTtRQUMxRCxnQkFBZ0I7S0FDbkIsQ0FBQyxDQUFDO0lBRUgsSUFBSSxVQUFVLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtRQUN6QixPQUFPLElBQUksNkJBQW1CLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDO0tBQ2hEO0lBRUQsTUFBTSx3QkFBd0IsR0FDMUIsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQ2pCLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBOEIsQ0FBQztJQUU3QyxNQUFNLG1CQUFtQixHQUNyQixxQ0FBaUIsQ0FBQyw4QkFBOEIsQ0FDNUMsd0JBQXdCLEVBQ3hCLE1BQU0sRUFDTixJQUFJLENBQ1AsQ0FBQztJQUNOLG1DQUFtQztJQUNuQyxNQUFNLFdBQVcsR0FFVCxDQUFDLElBQUksQ0FBQyxjQUFjLEVBQUUsY0FBMkMsQ0FBQTtTQUM1RCxRQUNSLEVBQUUsSUFBSSxLQUFLLE9BQU8sQ0FBQztJQUN4QixNQUFNLHFCQUFxQixHQUN2QixJQUFJLENBQUMsY0FBYyxFQUFFLGNBQWMsQ0FBQyxJQUFJLEtBQUssc0JBQWMsQ0FBQyxXQUFXLENBQUM7SUFDNUUsTUFBTSxpQkFBaUIsR0FBRyxXQUFXLElBQUkscUJBQXFCLENBQUM7SUFFL0QsT0FBTyxJQUFJLDZCQUFtQixDQUMxQixpQkFBaUIsSUFBSSxDQUFDLG1CQUFtQixFQUN6QyxDQUFDLGlCQUFpQixJQUFJLG1CQUFtQixDQUM1QyxDQUFDO0FBQ04sQ0FBQyxDQUFDO0FBbkNXLFFBQUEsc0JBQXNCLDBCQW1DakM7QUFFRixNQUFNLElBQUksR0FBRyxJQUFBLHVCQUFVLEVBR3JCO0lBQ0UsSUFBSSxFQUFFLDBDQUEwQztJQUNoRCxJQUFJLEVBQUU7UUFDRixJQUFJLEVBQUU7WUFDRixXQUFXLEVBQ1AscUZBQXFGO1lBRXpGLG9CQUFvQixFQUFFLEtBQUs7U0FDOUI7UUFDRCxRQUFRLEVBQUU7WUFDTix5QkFBeUIsRUFBRSwrREFBK0Q7WUFDMUYsMEJBQTBCLEVBQUUsa0xBQWtMO1NBQ2pOO1FBQ0QsTUFBTSxFQUFFLEVBQUU7UUFDVixjQUFjLEVBQUUsS0FBSztRQUNyQixJQUFJLEVBQUUsWUFBWTtLQUNyQjtJQUNELGNBQWMsRUFBRSxFQUFFO0lBRWxCLE1BQU0sQ0FBQyxPQUFPO1FBQ1YsT0FBTztZQUNILGdFQUFnRTtZQUNoRSxrQkFBa0IsRUFBRSxDQUFDLElBQW1CLEVBQUUsRUFBRTtnQkFDeEMsTUFBTSxxQkFBcUIsR0FBRyxJQUFBLDhCQUFzQixFQUNoRCxJQUFtQyxDQUN0QyxDQUFDO2dCQUVGLElBQUkscUJBQXFCLENBQUMsdUJBQXVCLEVBQUU7b0JBQy9DLE9BQU8sQ0FBQyxNQUFNLENBQUM7d0JBQ1gsSUFBSSxFQUFFLElBQUk7d0JBQ1YsU0FBUyxFQUFFLDRCQUE0QjtxQkFDMUMsQ0FBQyxDQUFDO2lCQUNOO2dCQUNELElBQUkscUJBQXFCLENBQUMsc0JBQXNCLEVBQUU7b0JBQzlDLE9BQU8sQ0FBQyxNQUFNLENBQUM7d0JBQ1gsSUFBSSxFQUFFLElBQUk7d0JBQ1YsU0FBUyxFQUFFLDJCQUEyQjtxQkFDekMsQ0FBQyxDQUFDO2lCQUNOO1lBQ0wsQ0FBQztTQUNKLENBQUM7SUFDTixDQUFDO0NBQ0osQ0FBQyxDQUFDO0FBRUgsa0JBQWUsSUFBSSxDQUFDIn0=
|
package/dist/rules/validateNonPrimitiveNeedsTypeDecorator/validateNonPrimitiveNeedsDecorators.js
CHANGED
|
@@ -20,7 +20,6 @@ const rule = (0, createRule_1.createRule)({
|
|
|
20
20
|
meta: {
|
|
21
21
|
docs: {
|
|
22
22
|
description: "A non-primitive property with validation should probably use a @Type decorator",
|
|
23
|
-
recommended: false,
|
|
24
23
|
requiresTypeChecking: false,
|
|
25
24
|
},
|
|
26
25
|
messages: {
|
|
@@ -29,6 +28,7 @@ const rule = (0, createRule_1.createRule)({
|
|
|
29
28
|
},
|
|
30
29
|
schema: [
|
|
31
30
|
{
|
|
31
|
+
type: "object",
|
|
32
32
|
properties: {
|
|
33
33
|
additionalTypeDecorators: {
|
|
34
34
|
description: "A list of custom type decorators that this rule will use to validate",
|
|
@@ -63,23 +63,25 @@ const rule = (0, createRule_1.createRule)({
|
|
|
63
63
|
create(context) {
|
|
64
64
|
const { additionalTypeDecorators, additionalCustomValidatorDecorators } = context.options[0] || {
|
|
65
65
|
additionalTypeDecorators: [],
|
|
66
|
+
additionalCustomValidatorDecorators: [],
|
|
66
67
|
};
|
|
67
68
|
const parserServices = utils_1.ESLintUtils.getParserServices(context);
|
|
68
69
|
const typeChecker = parserServices.program.getTypeChecker();
|
|
69
70
|
return {
|
|
70
71
|
// eslint-disable-next-line @typescript-eslint/naming-convention
|
|
71
72
|
PropertyDefinition(node) {
|
|
72
|
-
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p;
|
|
73
73
|
// if it's an array get the element type
|
|
74
74
|
let mainType;
|
|
75
75
|
const isAnArray = typedTokenHelpers_1.typedTokenHelpers.isTypeArrayTypeOrUnionOfArrayTypes(node, parserServices, typeChecker);
|
|
76
76
|
// this is getting very messy
|
|
77
77
|
if (isAnArray) {
|
|
78
|
-
const mainTypeInShortArray =
|
|
78
|
+
const mainTypeInShortArray = node.typeAnnotation
|
|
79
|
+
?.typeAnnotation?.elementType?.type;
|
|
79
80
|
// eslint-disable-next-line unicorn/no-negated-condition
|
|
80
81
|
if (!mainTypeInShortArray) {
|
|
81
82
|
// try to get the type of Array<type> syntax
|
|
82
|
-
const foundParams =
|
|
83
|
+
const foundParams = node.typeAnnotation
|
|
84
|
+
?.typeAnnotation?.typeParameters?.params;
|
|
83
85
|
if (foundParams && foundParams.length === 1) {
|
|
84
86
|
mainType = foundParams[0].type;
|
|
85
87
|
}
|
|
@@ -89,7 +91,7 @@ const rule = (0, createRule_1.createRule)({
|
|
|
89
91
|
}
|
|
90
92
|
}
|
|
91
93
|
else {
|
|
92
|
-
mainType =
|
|
94
|
+
mainType = node.typeAnnotation?.typeAnnotation?.type;
|
|
93
95
|
}
|
|
94
96
|
if (!mainType) {
|
|
95
97
|
return;
|
|
@@ -101,7 +103,8 @@ const rule = (0, createRule_1.createRule)({
|
|
|
101
103
|
}
|
|
102
104
|
// property is a union with primitive type - no need to validate
|
|
103
105
|
const isNodeAUnionWithAPrimitive = mainType === utils_1.AST_NODE_TYPES.TSUnionType &&
|
|
104
|
-
(
|
|
106
|
+
(node.typeAnnotation
|
|
107
|
+
?.typeAnnotation).types?.some((x) => primitiveTypes.has(x.type));
|
|
105
108
|
if (isNodeAUnionWithAPrimitive) {
|
|
106
109
|
return;
|
|
107
110
|
}
|
|
@@ -140,15 +143,17 @@ const rule = (0, createRule_1.createRule)({
|
|
|
140
143
|
// ok so does the property have Type decorator or custom type decorator? it probably should
|
|
141
144
|
const foundTypeDecorator = typedTokenHelpers_1.typedTokenHelpers.getDecoratorsNamed(node, typeDecorators);
|
|
142
145
|
if (foundTypeDecorator.length === 0) {
|
|
143
|
-
const typeAnnotationNode =
|
|
146
|
+
const typeAnnotationNode = node.typeAnnotation?.typeAnnotation;
|
|
144
147
|
let typeIdentifier;
|
|
145
148
|
if (typeAnnotationNode) {
|
|
146
149
|
if (typeAnnotationNode.type ===
|
|
147
150
|
utils_1.AST_NODE_TYPES.TSTypeReference &&
|
|
148
|
-
typeAnnotationNode.typeName.type ===
|
|
151
|
+
typeAnnotationNode.typeName.type ===
|
|
152
|
+
utils_1.AST_NODE_TYPES.Identifier) {
|
|
149
153
|
typeIdentifier = typeAnnotationNode.typeName.name;
|
|
150
154
|
if (typeAnnotationNode.typeName.name === "Array") {
|
|
151
|
-
const foundParams =
|
|
155
|
+
const foundParams = node.typeAnnotation
|
|
156
|
+
?.typeAnnotation?.typeParameters?.params;
|
|
152
157
|
if (foundParams && foundParams.length === 1) {
|
|
153
158
|
const typeName = foundParams[0].typeName;
|
|
154
159
|
if (typeName.type ===
|
|
@@ -196,4 +201,4 @@ const rule = (0, createRule_1.createRule)({
|
|
|
196
201
|
},
|
|
197
202
|
});
|
|
198
203
|
exports.default = rule;
|
|
199
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
204
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFsaWRhdGVOb25QcmltaXRpdmVOZWVkc0RlY29yYXRvcnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvcnVsZXMvdmFsaWRhdGVOb25QcmltaXRpdmVOZWVkc1R5cGVEZWNvcmF0b3IvdmFsaWRhdGVOb25QcmltaXRpdmVOZWVkc0RlY29yYXRvcnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsa0RBQWtEO0FBQ2xELG9EQUErRTtBQUMvRSx1REFBa0Q7QUFDbEQscUVBQWdFO0FBR2hFLE1BQU0sY0FBYyxHQUFHLElBQUksR0FBRyxDQUFDO0lBQzNCLHNCQUFjLENBQUMsZUFBZTtJQUM5QixzQkFBYyxDQUFDLGdCQUFnQjtJQUMvQixzQkFBYyxDQUFDLGVBQWU7SUFDOUIsc0JBQWMsQ0FBQyxhQUFhO0NBQy9CLENBQUMsQ0FBQztBQU9JLE1BQU0sYUFBYSxHQUFHLEdBQVksRUFBRTtJQUN2QyxPQUFPLElBQUksQ0FBQztBQUNoQixDQUFDLENBQUM7QUFGVyxRQUFBLGFBQWEsaUJBRXhCO0FBRUYsTUFBTSxJQUFJLEdBQUcsSUFBQSx1QkFBVSxFQUdyQjtJQUNFLElBQUksRUFBRSx1REFBdUQ7SUFDN0QsSUFBSSxFQUFFO1FBQ0YsSUFBSSxFQUFFO1lBQ0YsV0FBVyxFQUNQLGdGQUFnRjtZQUNwRixvQkFBb0IsRUFBRSxLQUFLO1NBQzlCO1FBQ0QsUUFBUSxFQUFFO1lBQ04sd0JBQXdCLEVBQ3BCLHdFQUF3RTtZQUM1RSxzQkFBc0IsRUFDbEIsOEpBQThKO1NBQ3JLO1FBQ0QsTUFBTSxFQUFFO1lBQ0o7Z0JBQ0ksSUFBSSxFQUFFLFFBQStCO2dCQUNyQyxVQUFVLEVBQUU7b0JBQ1Isd0JBQXdCLEVBQUU7d0JBQ3RCLFdBQVcsRUFDUCxzRUFBc0U7d0JBQzFFLElBQUksRUFBRSxPQUE4Qjt3QkFDcEMsUUFBUSxFQUFFLENBQUM7d0JBQ1gsS0FBSyxFQUFFOzRCQUNILElBQUksRUFBRSxRQUErQjs0QkFDckMs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
|