@darraghor/eslint-plugin-nestjs-typed 6.0.0-rc.12 → 6.0.0-rc.13
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/configs/base.d.ts +1 -1
- package/dist/configs/base.js +2 -3
- package/dist/configs/noSwagger.js +4 -7
- package/dist/configs/recommended.js +4 -7
- package/dist/index.d.ts +3 -3
- package/dist/index.js +18 -56
- package/dist/rules/allPropertiesAreWhitelisted/allPropertiesAreWhitelisted.js +11 -13
- package/dist/rules/allPropertiesHaveExplicitDefined/allPropertiesHaveExplicitDefined.js +15 -17
- package/dist/rules/apiEnumPropertyBestPractices/apiEnumPropertyBestPractices.d.ts +1 -1
- package/dist/rules/apiEnumPropertyBestPractices/apiEnumPropertyBestPractices.js +17 -22
- package/dist/rules/apiEnumPropertyBestPractices/enumTestResultModel.js +2 -6
- package/dist/rules/apiMethodsShouldBeGuarded/apiMethodsShouldBeGuarded.js +12 -16
- package/dist/rules/apiMethodsShouldSpecifyApiOperation/apiMethodsShouldSpecifyApiOperation.js +9 -13
- package/dist/rules/apiMethodsShouldSpecifyApiResponse/apiMethodsShouldSpecifyApiResponse.js +9 -13
- package/dist/rules/apiPropertyMatchesPropertyOptionality/apiPropertyMatchesPropertyOptionality.js +13 -18
- package/dist/rules/apiPropertyReturningArrayShouldSetArray/apiPropertyReturningArrayShouldSetArray.d.ts +1 -1
- package/dist/rules/apiPropertyReturningArrayShouldSetArray/apiPropertyReturningArrayShouldSetArray.js +17 -24
- package/dist/rules/apiPropertyReturningArrayShouldSetArray/arraySetResultModel.js +2 -5
- package/dist/rules/controllerDecoratedHasApiTags/controllerDecoratedHasApiTags.js +9 -13
- package/dist/rules/index.d.ts +3 -3
- package/dist/rules/index.js +36 -41
- package/dist/rules/injectablesShouldBeProvided/injectableShouldBeProvided.js +13 -18
- package/dist/rules/noDuplicateDecorators/noDuplicateDecorators.js +10 -14
- package/dist/rules/paramDecoratorNameMatchesRouteParam/paramDecoratorNameMatchesRouteParam.js +19 -26
- package/dist/rules/paramDecoratorNameMatchesRouteParam/rule.testData.js +3 -6
- package/dist/rules/providerInjectedShouldMatchFactory/ProviderInjectedShouldMatchFactory.js +10 -14
- package/dist/rules/shouldSpecifyForbidUnknownValues/shouldSpecifyForbidUnknownValuesRule.js +18 -25
- package/dist/rules/sortModuleMetadataArrays/sortModuleMetadataArrays.js +18 -23
- package/dist/rules/validateNestedOfArrayShouldSetEach/arraySetResultModel.js +2 -5
- package/dist/rules/validateNestedOfArrayShouldSetEach/validateNestedOfArrayShouldSetEach.d.ts +1 -1
- package/dist/rules/validateNestedOfArrayShouldSetEach/validateNestedOfArrayShouldSetEach.js +14 -21
- package/dist/rules/validateNonPrimitiveNeedsTypeDecorator/validateNonPrimitiveNeedsDecorators.js +29 -33
- package/dist/testing/fixtureSetup.js +4 -10
- package/dist/testing/preRun.js +2 -4
- package/dist/utils/ast.js +4 -7
- package/dist/utils/createRule.js +3 -6
- package/dist/utils/files/customFileEnumeratorWrapper.js +9 -16
- package/dist/utils/files/isFilteredPath.js +2 -4
- package/dist/utils/nestModules/models/NestProvidedInjectablesMap.js +2 -6
- package/dist/utils/nestModules/nestModuleAstParser.d.ts +1 -1
- package/dist/utils/nestModules/nestModuleAstParser.js +9 -12
- package/dist/utils/nestModules/nestProvidedInjectableMapper.d.ts +1 -1
- package/dist/utils/nestModules/nestProvidedInjectableMapper.js +14 -52
- package/dist/utils/nestModules/nestProvidedInjectableMapper.testData.d.ts +1 -1
- package/dist/utils/nestModules/nestProvidedInjectableMapper.testData.js +9 -12
- package/dist/utils/nestModules/nestProviderAstParser.d.ts +1 -1
- package/dist/utils/nestModules/nestProviderAstParser.js +13 -16
- package/dist/utils/typedTokenHelpers.js +25 -64
- package/dist/utils/wellKnownSelectors.js +2 -5
- package/package.json +4 -3
package/dist/configs/base.d.ts
CHANGED
package/dist/configs/base.js
CHANGED
|
@@ -1,7 +1,6 @@
|
|
|
1
|
-
|
|
2
|
-
module.exports = {
|
|
1
|
+
export default {
|
|
3
2
|
parser: "@typescript-eslint/parser",
|
|
4
3
|
parserOptions: { sourceType: "module" },
|
|
5
4
|
plugins: ["@darraghor/nestjs-typed"],
|
|
6
5
|
};
|
|
7
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
6
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb25maWdzL2Jhc2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsZUFBZTtJQUNYLE1BQU0sRUFBRSwyQkFBMkI7SUFDbkMsYUFBYSxFQUFFLEVBQUMsVUFBVSxFQUFFLFFBQVEsRUFBQztJQUNyQyxPQUFPLEVBQUUsQ0FBQyx5QkFBeUIsQ0FBQztDQUNSLENBQUMifQ==
|
|
@@ -1,8 +1,5 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.rules = void 0;
|
|
4
1
|
// Should turn off swagger rules for folks not using swagger typings
|
|
5
|
-
|
|
2
|
+
export const rules = {
|
|
6
3
|
"@darraghor/nestjs-typed/api-property-matches-property-optionality": "off",
|
|
7
4
|
"@darraghor/nestjs-typed/api-method-should-specify-api-response": "off",
|
|
8
5
|
"@darraghor/nestjs-typed/api-method-should-specify-api-operation": "off",
|
|
@@ -10,8 +7,8 @@ exports.rules = {
|
|
|
10
7
|
"@darraghor/nestjs-typed/api-enum-property-best-practices": "off",
|
|
11
8
|
"@darraghor/nestjs-typed/api-property-returning-array-should-set-array": "off",
|
|
12
9
|
};
|
|
13
|
-
|
|
10
|
+
export default {
|
|
14
11
|
extends: ["./configs/base"],
|
|
15
|
-
rules
|
|
12
|
+
rules,
|
|
16
13
|
};
|
|
17
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
14
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm9Td2FnZ2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvbmZpZ3Mvbm9Td2FnZ2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVBLG9FQUFvRTtBQUNwRSxNQUFNLENBQUMsTUFBTSxLQUFLLEdBQWdDO0lBQzlDLG1FQUFtRSxFQUFFLEtBQUs7SUFDMUUsZ0VBQWdFLEVBQUUsS0FBSztJQUN2RSxpRUFBaUUsRUFBRSxLQUFLO0lBQ3hFLDREQUE0RCxFQUFFLEtBQUs7SUFDbkUsMERBQTBELEVBQUUsS0FBSztJQUNqRSx1RUFBdUUsRUFDbkUsS0FBSztDQUNaLENBQUM7QUFFRixlQUFlO0lBQ1gsT0FBTyxFQUFFLENBQUMsZ0JBQWdCLENBQUM7SUFDM0IsS0FBSztDQUNSLENBQUMifQ==
|
|
@@ -1,7 +1,4 @@
|
|
|
1
|
-
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.rules = void 0;
|
|
4
|
-
exports.rules = {
|
|
1
|
+
export const rules = {
|
|
5
2
|
"@darraghor/nestjs-typed/provided-injected-should-match-factory-parameters": "error",
|
|
6
3
|
"@darraghor/nestjs-typed/injectable-should-be-provided": [
|
|
7
4
|
"error",
|
|
@@ -26,8 +23,8 @@ exports.rules = {
|
|
|
26
23
|
"@darraghor/nestjs-typed/sort-module-metadata-arrays": "off",
|
|
27
24
|
"@darraghor/nestjs-typed/no-duplicate-decorators": "error",
|
|
28
25
|
};
|
|
29
|
-
|
|
26
|
+
export default {
|
|
30
27
|
extends: ["./configs/base"],
|
|
31
|
-
rules
|
|
28
|
+
rules,
|
|
32
29
|
};
|
|
33
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
30
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVjb21tZW5kZWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY29uZmlncy9yZWNvbW1lbmRlZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxNQUFNLENBQUMsTUFBTSxLQUFLLEdBQWdDO0lBQzlDLDJFQUEyRSxFQUN2RSxPQUFPO0lBQ1gsdURBQXVELEVBQUU7UUFDckQsT0FBTztRQUNQO1lBQ0ksR0FBRyxFQUFFLENBQUMsYUFBYSxDQUFDO1lBQ3BCLGVBQWUsRUFBRSxDQUFDLGNBQWMsRUFBRSxRQUFRLEVBQUUsUUFBUSxDQUFDO1NBQ3hEO0tBQ0o7SUFDRCxtRUFBbUUsRUFDL0QsT0FBTztJQUNYLGdFQUFnRSxFQUFFLE9BQU87SUFDekUsNERBQTRELEVBQUUsT0FBTztJQUNyRSwwREFBMEQsRUFBRSxPQUFPO0lBQ25FLHVFQUF1RSxFQUNuRSxPQUFPO0lBQ1gsOERBQThELEVBQUUsT0FBTztJQUN2RSxrRUFBa0UsRUFBRSxPQUFPO0lBQzNFLCtFQUErRSxFQUMzRSxPQUFPO0lBQ1gsa0VBQWtFLEVBQUUsT0FBTztJQUMzRSx3REFBd0QsRUFBRSxPQUFPO0lBQ2pFLDhEQUE4RCxFQUFFLE9BQU87SUFDdkUsdURBQXVELEVBQUUsS0FBSztJQUM5RCxpRUFBaUUsRUFBRSxLQUFLO0lBQ3hFLHFEQUFxRCxFQUFFLEtBQUs7SUFDNUQsaURBQWlELEVBQUUsT0FBTztDQUM3RCxDQUFDO0FBQ0YsZUFBZTtJQUNYLE9BQU8sRUFBRSxDQUFDLGdCQUFnQixDQUFDO0lBQzNCLEtBQUs7Q0FDUixDQUFDIn0=
|
package/dist/index.d.ts
CHANGED
|
@@ -20,7 +20,7 @@ declare const classicPlugin: {
|
|
|
20
20
|
src: string[];
|
|
21
21
|
filterFromPaths: string[];
|
|
22
22
|
}], unknown, TSESLint.RuleListener>;
|
|
23
|
-
"no-duplicate-decorators": TSESLint.RuleModule<"noDuplicateDecorators", import("./rules/noDuplicateDecorators/noDuplicateDecorators").NoDuplicateDecoratorsOptions, unknown, TSESLint.RuleListener>;
|
|
23
|
+
"no-duplicate-decorators": TSESLint.RuleModule<"noDuplicateDecorators", import("./rules/noDuplicateDecorators/noDuplicateDecorators.js").NoDuplicateDecoratorsOptions, unknown, TSESLint.RuleListener>;
|
|
24
24
|
"provided-injected-should-match-factory-parameters": TSESLint.RuleModule<"mainMessage", [], unknown, TSESLint.RuleListener>;
|
|
25
25
|
"controllers-should-supply-api-tags": TSESLint.RuleModule<"shouldUseApiTagDecorator", [], unknown, TSESLint.RuleListener>;
|
|
26
26
|
"api-method-should-specify-api-response": TSESLint.RuleModule<"shouldSpecifyApiResponse", [], unknown, TSESLint.RuleListener>;
|
|
@@ -29,11 +29,11 @@ declare const classicPlugin: {
|
|
|
29
29
|
"api-property-returning-array-should-set-array": TSESLint.RuleModule<"shouldSetArrayPropertyTrue" | "shouldSetArrayPropertyFalse", [], unknown, TSESLint.RuleListener>;
|
|
30
30
|
"should-specify-forbid-unknown-values": TSESLint.RuleModule<"shouldSpecifyForbidUnknownValues", [], unknown, TSESLint.RuleListener>;
|
|
31
31
|
"param-decorator-name-matches-route-param": TSESLint.RuleModule<"paramIdentifierDoesntNeedColon" | "paramIdentifierShouldMatch", [], unknown, TSESLint.RuleListener>;
|
|
32
|
-
"validated-non-primitive-property-needs-type-decorator": TSESLint.RuleModule<"shouldUseTypeDecorator" | "autofixWithTypeDecorator", import("./rules/validateNonPrimitiveNeedsTypeDecorator/validateNonPrimitiveNeedsDecorators").ValidateNonPrimitivePropertyTypeDecoratorOptions, unknown, TSESLint.RuleListener>;
|
|
32
|
+
"validated-non-primitive-property-needs-type-decorator": TSESLint.RuleModule<"shouldUseTypeDecorator" | "autofixWithTypeDecorator", import("./rules/validateNonPrimitiveNeedsTypeDecorator/validateNonPrimitiveNeedsDecorators.js").ValidateNonPrimitivePropertyTypeDecoratorOptions, unknown, TSESLint.RuleListener>;
|
|
33
33
|
"validate-nested-of-array-should-set-each": TSESLint.RuleModule<"shouldSetEachPropertyTrue" | "shouldSetEachPropertyFalse", [], unknown, TSESLint.RuleListener>;
|
|
34
34
|
"all-properties-are-whitelisted": TSESLint.RuleModule<"missing-property-decorator", [], unknown, TSESLint.RuleListener>;
|
|
35
35
|
"api-methods-should-be-guarded": TSESLint.RuleModule<"apiMethodsShouldBeGuarded", [], unknown, TSESLint.RuleListener>;
|
|
36
|
-
"sort-module-metadata-arrays": TSESLint.RuleModule<"moduleMetadataArraysAreSorted", import("./rules/sortModuleMetadataArrays/sortModuleMetadataArrays").RuleOptions, unknown, TSESLint.RuleListener>;
|
|
36
|
+
"sort-module-metadata-arrays": TSESLint.RuleModule<"moduleMetadataArraysAreSorted", import("./rules/sortModuleMetadataArrays/sortModuleMetadataArrays.js").RuleOptions, unknown, TSESLint.RuleListener>;
|
|
37
37
|
};
|
|
38
38
|
meta: {
|
|
39
39
|
name: string;
|
package/dist/index.js
CHANGED
|
@@ -1,47 +1,8 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
-
}
|
|
8
|
-
Object.defineProperty(o, k2, desc);
|
|
9
|
-
}) : (function(o, m, k, k2) {
|
|
10
|
-
if (k2 === undefined) k2 = k;
|
|
11
|
-
o[k2] = m[k];
|
|
12
|
-
}));
|
|
13
|
-
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
-
}) : function(o, v) {
|
|
16
|
-
o["default"] = v;
|
|
17
|
-
});
|
|
18
|
-
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
-
var ownKeys = function(o) {
|
|
20
|
-
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
-
var ar = [];
|
|
22
|
-
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
-
return ar;
|
|
24
|
-
};
|
|
25
|
-
return ownKeys(o);
|
|
26
|
-
};
|
|
27
|
-
return function (mod) {
|
|
28
|
-
if (mod && mod.__esModule) return mod;
|
|
29
|
-
var result = {};
|
|
30
|
-
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
-
__setModuleDefault(result, mod);
|
|
32
|
-
return result;
|
|
33
|
-
};
|
|
34
|
-
})();
|
|
35
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
|
-
};
|
|
38
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
-
exports.classicPlugin = exports.plugin = exports.parser = void 0;
|
|
40
|
-
const noSwagger_1 = __importDefault(require("./configs/noSwagger"));
|
|
41
|
-
const recommended_1 = __importDefault(require("./configs/recommended"));
|
|
42
|
-
const rules_1 = __importDefault(require("./rules"));
|
|
43
|
-
const parserBase = __importStar(require("@typescript-eslint/parser"));
|
|
44
|
-
const eslint_plugin_1 = __importDefault(require("@typescript-eslint/eslint-plugin"));
|
|
1
|
+
import noSwagger from "./configs/noSwagger.js";
|
|
2
|
+
import recommended from "./configs/recommended.js";
|
|
3
|
+
import rules from "./rules/index.js";
|
|
4
|
+
import * as parserBase from "@typescript-eslint/parser";
|
|
5
|
+
import pluginBase from "@typescript-eslint/eslint-plugin";
|
|
45
6
|
// Most of this is copied and simplified from https://github.com/typescript-eslint/typescript-eslint/blob/v8.22.0/packages/typescript-eslint/src/configs/recommended.ts
|
|
46
7
|
// note - cannot migrate this to an import statement because it will make TSC copy the package.json to the dist folder
|
|
47
8
|
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
@@ -50,20 +11,19 @@ const meta = {
|
|
|
50
11
|
name,
|
|
51
12
|
version,
|
|
52
13
|
};
|
|
53
|
-
|
|
14
|
+
export const parser = {
|
|
54
15
|
meta: parserBase.meta,
|
|
55
16
|
parseForESLint: parserBase.parseForESLint,
|
|
56
17
|
};
|
|
57
|
-
|
|
18
|
+
export const plugin = pluginBase;
|
|
58
19
|
const classicPlugin = {
|
|
59
20
|
configs: {
|
|
60
|
-
recommended:
|
|
61
|
-
"no-swagger":
|
|
21
|
+
recommended: recommended,
|
|
22
|
+
"no-swagger": noSwagger,
|
|
62
23
|
},
|
|
63
|
-
rules
|
|
24
|
+
rules,
|
|
64
25
|
meta,
|
|
65
26
|
};
|
|
66
|
-
exports.classicPlugin = classicPlugin;
|
|
67
27
|
const flatBaseConfig = (plugin, parser) => {
|
|
68
28
|
const baseConfig = {
|
|
69
29
|
name: "@darraghor/nestjs-typed/base",
|
|
@@ -77,23 +37,25 @@ const flatBaseConfig = (plugin, parser) => {
|
|
|
77
37
|
};
|
|
78
38
|
return baseConfig;
|
|
79
39
|
};
|
|
40
|
+
// export the classic plugin configs
|
|
41
|
+
export { classicPlugin };
|
|
80
42
|
// export the flat configs
|
|
81
|
-
|
|
82
|
-
plugin
|
|
43
|
+
export default {
|
|
44
|
+
plugin,
|
|
83
45
|
configs: {
|
|
84
46
|
flatRecommended: [
|
|
85
|
-
flatBaseConfig(
|
|
47
|
+
flatBaseConfig(plugin, parser),
|
|
86
48
|
{
|
|
87
49
|
name: "@darraghor/nestjs-typed/recommended",
|
|
88
|
-
rules:
|
|
50
|
+
rules: recommended.rules,
|
|
89
51
|
},
|
|
90
52
|
],
|
|
91
53
|
flatNoSwagger: [
|
|
92
54
|
{
|
|
93
55
|
name: "@darraghor/nestjs-typed/no-swagger",
|
|
94
|
-
rules:
|
|
56
|
+
rules: noSwagger.rules,
|
|
95
57
|
},
|
|
96
58
|
],
|
|
97
59
|
},
|
|
98
60
|
};
|
|
99
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
61
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxTQUFTLE1BQU0sd0JBQXdCLENBQUM7QUFDL0MsT0FBTyxXQUFXLE1BQU0sMEJBQTBCLENBQUM7QUFDbkQsT0FBTyxLQUFLLE1BQU0sa0JBQWtCLENBQUM7QUFFckMsT0FBTyxLQUFLLFVBQVUsTUFBTSwyQkFBMkIsQ0FBQztBQUN4RCxPQUFPLFVBQVUsTUFBTSxrQ0FBa0MsQ0FBQztBQUUxRCx1S0FBdUs7QUFFdkssc0hBQXNIO0FBQ3RILGlFQUFpRTtBQUNqRSxNQUFNLEVBQUMsSUFBSSxFQUFFLE9BQU8sRUFBQyxHQUFHLE9BQU8sQ0FBQyxpQkFBaUIsQ0FHaEQsQ0FBQztBQUNGLE1BQU0sSUFBSSxHQUFHO0lBQ1QsSUFBSTtJQUNKLE9BQU87Q0FDVixDQUFDO0FBQ0YsTUFBTSxDQUFDLE1BQU0sTUFBTSxHQUErQjtJQUM5QyxJQUFJLEVBQUUsVUFBVSxDQUFDLElBQUk7SUFDckIsY0FBYyxFQUFFLFVBQVUsQ0FBQyxjQUFjO0NBQzVDLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxNQUFNLEdBQStCLFVBR2pELENBQUM7QUFDRixNQUFNLGFBQWEsR0FBRztJQUNsQixPQUFPLEVBQUU7UUFDTCxXQUFXLEVBQUUsV0FBVztRQUN4QixZQUFZLEVBQUUsU0FBUztLQUMxQjtJQUNELEtBQUs7SUFDTCxJQUFJO0NBQ2lCLENBQUM7QUFFMUIsTUFBTSxjQUFjLEdBQUcsQ0FDbkIsTUFBeUIsRUFDekIsTUFBeUIsRUFDUixFQUFFO0lBQ25CLE1BQU0sVUFBVSxHQUFzQjtRQUNsQyxJQUFJLEVBQUUsOEJBQThCO1FBQ3BDLGVBQWUsRUFBRTtZQUNiLE1BQU07WUFDTixVQUFVLEVBQUUsUUFBUTtTQUN2QjtRQUNELE9BQU8sRUFBRTtZQUNMLHlCQUF5QixFQUFFLE1BQU07U0FDcEM7S0FDSixDQUFDO0lBQ0YsT0FBTyxVQUFVLENBQUM7QUFDdEIsQ0FBQyxDQUFDO0FBRUYsb0NBQW9DO0FBQ3BDLE9BQU8sRUFBQyxhQUFhLEVBQUMsQ0FBQztBQUV2QiwwQkFBMEI7QUFDMUIsZUFBZTtJQUNYLE1BQU07SUFDTixPQUFPLEVBQUU7UUFDTCxlQUFlLEVBQUU7WUFDYixjQUFjLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQztZQUM5QjtnQkFDSSxJQUFJLEVBQUUscUNBQXFDO2dCQUMzQyxLQUFLLEVBQUUsV0FBVyxDQUFDLEtBQUs7YUFDM0I7U0FDSjtRQUNELGFBQWEsRUFBRTtZQUNYO2dCQUNJLElBQUksRUFBRSxvQ0FBb0M7Z0JBQzFDLEtBQUssRUFBRSxTQUFTLENBQUMsS0FBSzthQUN6QjtTQUNKO0tBSUo7Q0FDSixDQUFDIn0=
|
|
@@ -1,9 +1,7 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
const
|
|
5
|
-
const typedTokenHelpers_1 = require("../../utils/typedTokenHelpers");
|
|
6
|
-
const rule = (0, createRule_1.createRule)({
|
|
1
|
+
import { AST_NODE_TYPES } from "@typescript-eslint/utils";
|
|
2
|
+
import { createRule } from "../../utils/createRule.js";
|
|
3
|
+
import { typedTokenHelpers } from "../../utils/typedTokenHelpers.js";
|
|
4
|
+
const rule = createRule({
|
|
7
5
|
name: "all-properties-are-whitelisted",
|
|
8
6
|
meta: {
|
|
9
7
|
docs: {
|
|
@@ -19,18 +17,18 @@ const rule = (0, createRule_1.createRule)({
|
|
|
19
17
|
create: function (context) {
|
|
20
18
|
return {
|
|
21
19
|
ClassDeclaration(node) {
|
|
22
|
-
const program =
|
|
20
|
+
const program = typedTokenHelpers.getRootProgram(node);
|
|
23
21
|
const withDecorator = [];
|
|
24
22
|
const withoutDecorator = [];
|
|
25
23
|
for (const element of node.body.body) {
|
|
26
|
-
if (element.type !==
|
|
24
|
+
if (element.type !== AST_NODE_TYPES.PropertyDefinition) {
|
|
27
25
|
continue;
|
|
28
26
|
}
|
|
29
27
|
const hasDecorator = element.decorators.some((decorator) => decorator.expression.type ===
|
|
30
|
-
|
|
28
|
+
AST_NODE_TYPES.CallExpression &&
|
|
31
29
|
decorator.expression.callee.type ===
|
|
32
|
-
|
|
33
|
-
|
|
30
|
+
AST_NODE_TYPES.Identifier &&
|
|
31
|
+
typedTokenHelpers.decoratorIsClassValidatorDecorator(program, decorator));
|
|
34
32
|
if (hasDecorator) {
|
|
35
33
|
withDecorator.push(element);
|
|
36
34
|
}
|
|
@@ -50,5 +48,5 @@ const rule = (0, createRule_1.createRule)({
|
|
|
50
48
|
};
|
|
51
49
|
},
|
|
52
50
|
});
|
|
53
|
-
|
|
54
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
51
|
+
export default rule;
|
|
52
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWxsUHJvcGVydGllc0FyZVdoaXRlbGlzdGVkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3J1bGVzL2FsbFByb3BlcnRpZXNBcmVXaGl0ZWxpc3RlZC9hbGxQcm9wZXJ0aWVzQXJlV2hpdGVsaXN0ZWQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLGNBQWMsRUFBVyxNQUFNLDBCQUEwQixDQUFDO0FBQ2xFLE9BQU8sRUFBQyxVQUFVLEVBQUMsTUFBTSwyQkFBMkIsQ0FBQztBQUNyRCxPQUFPLEVBQUMsaUJBQWlCLEVBQUMsTUFBTSxrQ0FBa0MsQ0FBQztBQUVuRSxNQUFNLElBQUksR0FBRyxVQUFVLENBQW1DO0lBQ3RELElBQUksRUFBRSxnQ0FBZ0M7SUFDdEMsSUFBSSxFQUFFO1FBQ0YsSUFBSSxFQUFFO1lBQ0YsV0FBVyxFQUFFLHdDQUF3QztTQUN4RDtRQUNELFFBQVEsRUFBRTtZQUNOLDRCQUE0QixFQUN4Qix5RkFBeUY7U0FDaEc7UUFDRCxJQUFJLEVBQUUsU0FBUztRQUNmLE1BQU0sRUFBRSxFQUFFO0tBQ2I7SUFDRCxjQUFjLEVBQUUsRUFBRTtJQUNsQixNQUFNLEVBQUUsVUFBVSxPQUFPO1FBQ3JCLE9BQU87WUFDSCxnQkFBZ0IsQ0FBQyxJQUErQjtnQkFDNUMsTUFBTSxPQUFPLEdBQUcsaUJBQWlCLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUN2RCxNQUFNLGFBQWEsR0FBa0MsRUFBRSxDQUFDO2dCQUN4RCxNQUFNLGdCQUFnQixHQUFrQyxFQUFFLENBQUM7Z0JBQzNELEtBQUssTUFBTSxPQUFPLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztvQkFDbkMsSUFBSSxPQUFPLENBQUMsSUFBSSxLQUFLLGNBQWMsQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO3dCQUNyRCxTQUFTO29CQUNiLENBQUM7b0JBQ0QsTUFBTSxZQUFZLEdBQUcsT0FBTyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQ3hDLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FDVixTQUFTLENBQUMsVUFBVSxDQUFDLElBQUk7d0JBQ3JCLGNBQWMsQ0FBQyxjQUFjO3dCQUNqQyxTQUFTLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxJQUFJOzRCQUM1QixjQUFjLENBQUMsVUFBVTt3QkFDN0IsaUJBQWlCLENBQUMsa0NBQWtDLENBQ2hELE9BQU8sRUFDUCxTQUFTLENBQ1osQ0FDUixDQUFDO29CQUNGLElBQUksWUFBWSxFQUFFLENBQUM7d0JBQ2YsYUFBYSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztvQkFDaEMsQ0FBQzt5QkFBTSxDQUFDO3dCQUNKLGdCQUFnQixDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztvQkFDbkMsQ0FBQztnQkFDTCxDQUFDO2dCQUNELElBQUksYUFBYSxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksZ0JBQWdCLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO29CQUMxRCxLQUFLLE1BQU0sT0FBTyxJQUFJLGdCQUFnQixFQUFFLENBQUM7d0JBQ3JDLE9BQU8sQ0FBQyxNQUFNLENBQUM7NEJBQ1gsSUFBSSxFQUFFLE9BQU87NEJBQ2IsU0FBUyxFQUFFLDRCQUE0Qjt5QkFDMUMsQ0FBQyxDQUFDO29CQUNQLENBQUM7Z0JBQ0wsQ0FBQztZQUNMLENBQUM7U0FDSixDQUFDO0lBQ04sQ0FBQztDQUNKLENBQUMsQ0FBQztBQUVILGVBQWUsSUFBSSxDQUFDIn0=
|
|
@@ -1,11 +1,9 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
const
|
|
7
|
-
const typedTokenHelpers_1 = require("../../utils/typedTokenHelpers");
|
|
8
|
-
const rule = (0, createRule_1.createRule)({
|
|
1
|
+
import { AST_NODE_TYPES, ESLintUtils, } from "@typescript-eslint/utils";
|
|
2
|
+
import { isNullableType } from "@typescript-eslint/type-utils";
|
|
3
|
+
import { getPropertiesDefinitions } from "../../utils/ast.js";
|
|
4
|
+
import { createRule } from "../../utils/createRule.js";
|
|
5
|
+
import { typedTokenHelpers } from "../../utils/typedTokenHelpers.js";
|
|
6
|
+
const rule = createRule({
|
|
9
7
|
name: "all-properties-have-explicit-defined",
|
|
10
8
|
meta: {
|
|
11
9
|
docs: {
|
|
@@ -24,13 +22,13 @@ const rule = (0, createRule_1.createRule)({
|
|
|
24
22
|
},
|
|
25
23
|
defaultOptions: [],
|
|
26
24
|
create: function (context) {
|
|
27
|
-
const service =
|
|
25
|
+
const service = ESLintUtils.getParserServices(context);
|
|
28
26
|
const checker = service.program.getTypeChecker();
|
|
29
27
|
return {
|
|
30
28
|
ClassDeclaration(node) {
|
|
31
29
|
const propertyDefinitionsWithDecoratorsStatus = [];
|
|
32
30
|
let withDecoratorCount = 0;
|
|
33
|
-
const propertyDefinitions =
|
|
31
|
+
const propertyDefinitions = getPropertiesDefinitions(node);
|
|
34
32
|
// for each property in the class
|
|
35
33
|
for (const propertyDefinition of propertyDefinitions) {
|
|
36
34
|
// check for the optional or defined decorators, or any class-validator decorator
|
|
@@ -86,7 +84,7 @@ const rule = (0, createRule_1.createRule)({
|
|
|
86
84
|
const type = getType(propertyDefinition.typeAnnotation.typeAnnotation, service, checker);
|
|
87
85
|
// if the type is nullable, it should be optional
|
|
88
86
|
if (propertyDefinition.optional ||
|
|
89
|
-
|
|
87
|
+
isNullableType(type)) {
|
|
90
88
|
if (!decoratorsStatus.hasIsOptionalDecorator &&
|
|
91
89
|
!decoratorsStatus.hasValidateIfDecorator) {
|
|
92
90
|
context.report({
|
|
@@ -110,7 +108,7 @@ const rule = (0, createRule_1.createRule)({
|
|
|
110
108
|
};
|
|
111
109
|
},
|
|
112
110
|
});
|
|
113
|
-
|
|
111
|
+
export default rule;
|
|
114
112
|
function getType(typeNode, service, checker) {
|
|
115
113
|
const tsNode = service.esTreeNodeToTSNodeMap.get(typeNode);
|
|
116
114
|
const type = checker.getTypeAtLocation(tsNode);
|
|
@@ -121,13 +119,13 @@ function getDecoratorsStatus(propertyDefinition) {
|
|
|
121
119
|
let hasTypeCheckingDecorator = false;
|
|
122
120
|
let hasIsOptionalDecorator = false;
|
|
123
121
|
let hasValidateIfDecorator = false;
|
|
124
|
-
const program =
|
|
122
|
+
const program = typedTokenHelpers.getRootProgram(propertyDefinition);
|
|
125
123
|
if (propertyDefinition.decorators) {
|
|
126
124
|
for (const decorator of propertyDefinition.decorators) {
|
|
127
|
-
if (decorator.expression.type ===
|
|
128
|
-
decorator.expression.callee.type ===
|
|
125
|
+
if (decorator.expression.type === AST_NODE_TYPES.CallExpression &&
|
|
126
|
+
decorator.expression.callee.type === AST_NODE_TYPES.Identifier) {
|
|
129
127
|
// if this is not a class-validator decorator, skip it (this avoids name conflicts with decorators from other libraries)
|
|
130
|
-
if (!
|
|
128
|
+
if (!typedTokenHelpers.decoratorIsClassValidatorDecorator(program, decorator)) {
|
|
131
129
|
continue;
|
|
132
130
|
}
|
|
133
131
|
// We care if the decorator is a validation decorator like IsString etc for checks later
|
|
@@ -156,4 +154,4 @@ function getDecoratorsStatus(propertyDefinition) {
|
|
|
156
154
|
hasValidateIfDecorator,
|
|
157
155
|
};
|
|
158
156
|
}
|
|
159
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
157
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWxsUHJvcGVydGllc0hhdmVFeHBsaWNpdERlZmluZWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvcnVsZXMvYWxsUHJvcGVydGllc0hhdmVFeHBsaWNpdERlZmluZWQvYWxsUHJvcGVydGllc0hhdmVFeHBsaWNpdERlZmluZWQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNILGNBQWMsRUFFZCxXQUFXLEdBRWQsTUFBTSwwQkFBMEIsQ0FBQztBQUNsQyxPQUFPLEVBQUMsY0FBYyxFQUFDLE1BQU0sK0JBQStCLENBQUM7QUFDN0QsT0FBTyxFQUFDLHdCQUF3QixFQUFDLE1BQU0sb0JBQW9CLENBQUM7QUFDNUQsT0FBTyxFQUFDLFVBQVUsRUFBQyxNQUFNLDJCQUEyQixDQUFDO0FBRXJELE9BQU8sRUFBQyxpQkFBaUIsRUFBQyxNQUFNLGtDQUFrQyxDQUFDO0FBRW5FLE1BQU0sSUFBSSxHQUFHLFVBQVUsQ0FRckI7SUFDRSxJQUFJLEVBQUUsc0NBQXNDO0lBQzVDLElBQUksRUFBRTtRQUNGLElBQUksRUFBRTtZQUNGLFdBQVcsRUFDUCxrRUFBa0U7U0FDekU7UUFDRCxRQUFRLEVBQUU7WUFDTiw4QkFBOEIsRUFDMUIsNEdBQTRHO1lBQ2hILCtCQUErQixFQUMzQix3RUFBd0U7WUFDNUUsaURBQWlELEVBQzdDLGdFQUFnRTtZQUNwRSxvREFBb0QsRUFDaEQsZ0VBQWdFO1lBQ3BFLHFEQUFxRCxFQUNqRCxpRUFBaUU7WUFDckUsb0NBQW9DLEVBQ2hDLDJFQUEyRTtTQUNsRjtRQUNELElBQUksRUFBRSxTQUFTO1FBQ2YsTUFBTSxFQUFFLEVBQUU7S0FDYjtJQUNELGNBQWMsRUFBRSxFQUFFO0lBQ2xCLE1BQU0sRUFBRSxVQUFVLE9BQU87UUFDckIsTUFBTSxPQUFPLEdBQUcsV0FBVyxDQUFDLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBRXZELE1BQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDakQsT0FBTztZQUNILGdCQUFnQixDQUFDLElBQStCO2dCQUM1QyxNQUFNLHVDQUF1QyxHQUd2QyxFQUFFLENBQUM7Z0JBQ1QsSUFBSSxrQkFBa0IsR0FBRyxDQUFDLENBQUM7Z0JBQzNCLE1BQU0sbUJBQW1CLEdBQUcsd0JBQXdCLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQzNELGlDQUFpQztnQkFDakMsS0FBSyxNQUFNLGtCQUFrQixJQUFJLG1CQUFtQixFQUFFLENBQUM7b0JBQ25ELGlGQUFpRjtvQkFDakYsTUFBTSxnQkFBZ0IsR0FDbEIsbUJBQW1CLENBQUMsa0JBQWtCLENBQUMsQ0FBQztvQkFDNUMsdUNBQXVDLENBQUMsSUFBSSxDQUFDO3dCQUN6QyxrQkFBa0I7d0JBQ2xCLGdCQUFnQjtxQkFDbkIsQ0FBQyxDQUFDO29CQUVILDBFQUEwRTtvQkFDMUUsSUFDSSxnQkFBZ0IsQ0FBQyxxQkFBcUI7d0JBQ3RDLGdCQUFnQixDQUFDLHNCQUFzQjt3QkFDdkMsZ0JBQWdCLENBQUMsc0JBQXNCLEVBQ3pDLENBQUM7d0JBQ0MsT0FBTyxDQUFDLE1BQU0sQ0FBQzs0QkFDWCxJQUFJLEVBQUUsa0JBQWtCOzRCQUN4QixTQUFTLEVBQUUsb0NBQW9DO3lCQUNsRCxDQUFDLENBQUM7b0JBQ1AsQ0FBQzt5QkFBTSxJQUNILGdCQUFnQixDQUFDLHFCQUFxQjt3QkFDdEMsZ0JBQWdCLENBQUMsc0JBQXNCLEVBQ3pDLENBQUM7d0JBQ0MsT0FBTyxDQUFDLE1BQU0sQ0FBQzs0QkFDWCxJQUFJLEVBQUUsa0JBQWtCOzRCQUN4QixTQUFTLEVBQ0wsaURBQWlEO3lCQUN4RCxDQUFDLENBQUM7b0JBQ1AsQ0FBQzt5QkFBTSxJQUNILGdCQUFnQixDQUFDLHFCQUFxQjt3QkFDdEMsZ0JBQWdCLENBQUMsc0JBQXNCLEVBQ3pDLENBQUM7d0JBQ0MsT0FBTyxDQUFDLE1BQU0sQ0FBQzs0QkFDWCxJQUFJLEVBQUUsa0JBQWtCOzRCQUN4QixTQUFTLEVBQ0wsb0RBQW9EO3lCQUMzRCxDQUFDLENBQUM7b0JBQ1AsQ0FBQzt5QkFBTSxJQUNILGdCQUFnQixDQUFDLHNCQUFzQjt3QkFDdkMsZ0JBQWdCLENBQUMsc0JBQXNCLEVBQ3pDLENBQUM7d0JBQ0MsT0FBTyxDQUFDLE1BQU0sQ0FBQzs0QkFDWCxJQUFJLEVBQUUsa0JBQWtCOzRCQUN4QixTQUFTLEVBQ0wscURBQXFEO3lCQUM1RCxDQUFDLENBQUM7b0JBQ1AsQ0FBQzt5QkFBTSxJQUNILGdCQUFnQixDQUFDLHFCQUFxQjt3QkFDdEMsZ0JBQWdCLENBQUMsd0JBQXdCO3dCQUN6QyxnQkFBZ0IsQ0FBQyxzQkFBc0I7d0JBQ3ZDLGdCQUFnQixDQUFDLHNCQUFzQixFQUN6QyxDQUFDO3dCQUNDLGtCQUFrQixFQUFFLENBQUM7b0JBQ3pCLENBQUM7Z0JBQ0wsQ0FBQztnQkFDRCxJQUFJLGtCQUFrQixHQUFHLENBQUMsRUFBRSxDQUFDO29CQUN6QixLQUFLLE1BQU0sQ0FDUCxrQkFBa0IsRUFDbEIsZ0JBQWdCLEVBQ25CLElBQUksdUNBQXVDLEVBQUUsQ0FBQzt3QkFDM0MsK0RBQStEO3dCQUMvRCxJQUFJLENBQUMsa0JBQWtCLENBQUMsY0FBYyxFQUFFLENBQUM7NEJBQ3JDLFNBQVM7d0JBQ2IsQ0FBQzt3QkFDRCwrQkFBK0I7d0JBQy9CLE1BQU0sSUFBSSxHQUFHLE9BQU8sQ0FDaEIsa0JBQWtCLENBQUMsY0FBYyxDQUFDLGNBQWMsRUFDaEQsT0FBTyxFQUNQLE9BQU8sQ0FDVixDQUFDO3dCQUVGLGlEQUFpRDt3QkFDakQsSUFDSSxrQkFBa0IsQ0FBQyxRQUFROzRCQUMzQixjQUFjLENBQUMsSUFBSSxDQUFDLEVBQ3RCLENBQUM7NEJBQ0MsSUFDSSxDQUFDLGdCQUFnQixDQUFDLHNCQUFzQjtnQ0FDeEMsQ0FBQyxnQkFBZ0IsQ0FBQyxzQkFBc0IsRUFDMUMsQ0FBQztnQ0FDQyxPQUFPLENBQUMsTUFBTSxDQUFDO29DQUNYLElBQUksRUFBRSxrQkFBa0I7b0NBQ3hCLFNBQVMsRUFBRSwrQkFBK0I7aUNBQzdDLENBQUMsQ0FBQzs0QkFDUCxDQUFDO3dCQUNMLENBQUM7NkJBQU0sQ0FBQzs0QkFDSixJQUNJLENBQUMsZ0JBQWdCLENBQUMscUJBQXFCO2dDQUN2QyxDQUFDLGdCQUFnQixDQUFDLHdCQUF3QixFQUM1QyxDQUFDO2dDQUNDLE9BQU8sQ0FBQyxNQUFNLENBQUM7b0NBQ1gsSUFBSSxFQUFFLGtCQUFrQjtvQ0FDeEIsU0FBUyxFQUFFLDhCQUE4QjtpQ0FDNUMsQ0FBQyxDQUFDOzRCQUNQLENBQUM7d0JBQ0wsQ0FBQztvQkFDTCxDQUFDO2dCQUNMLENBQUM7WUFDTCxDQUFDO1NBQ0osQ0FBQztJQUNOLENBQUM7Q0FDSixDQUFDLENBQUM7QUFFSCxlQUFlLElBQUksQ0FBQztBQVNwQixTQUFTLE9BQU8sQ0FDWixRQUF1QixFQUN2QixPQUEwQyxFQUMxQyxPQUFvQjtJQUVwQixNQUFNLE1BQU0sR0FBRyxPQUFPLENBQUMscUJBQXFCLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQzNELE1BQU0sSUFBSSxHQUFHLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUMvQyxPQUFPLElBQUksQ0FBQztBQUNoQixDQUFDO0FBRUQsU0FBUyxtQkFBbUIsQ0FDeEIsa0JBQStDO0lBRS9DLElBQUkscUJBQXFCLEdBQUcsS0FBSyxDQUFDO0lBQ2xDLElBQUksd0JBQXdCLEdBQUcsS0FBSyxDQUFDO0lBQ3JDLElBQUksc0JBQXNCLEdBQUcsS0FBSyxDQUFDO0lBQ25DLElBQUksc0JBQXNCLEdBQUcsS0FBSyxDQUFDO0lBQ25DLE1BQU0sT0FBTyxHQUFHLGlCQUFpQixDQUFDLGNBQWMsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO0lBRXJFLElBQUksa0JBQWtCLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDaEMsS0FBSyxNQUFNLFNBQVMsSUFBSSxrQkFBa0IsQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUNwRCxJQUNJLFNBQVMsQ0FBQyxVQUFVLENBQUMsSUFBSSxLQUFLLGNBQWMsQ0FBQyxjQUFjO2dCQUMzRCxTQUFTLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEtBQUssY0FBYyxDQUFDLFVBQVUsRUFDaEUsQ0FBQztnQkFDQyx3SEFBd0g7Z0JBQ3hILElBQ0ksQ0FBQyxpQkFBaUIsQ0FBQyxrQ0FBa0MsQ0FDakQsT0FBTyxFQUNQLFNBQVMsQ0FDWixFQUNILENBQUM7b0JBQ0MsU0FBUztnQkFDYixDQUFDO2dCQUNELHdGQUF3RjtnQkFDeEYsSUFDSSxTQUFTLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEtBQUssV0FBVztvQkFDaEQsU0FBUyxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsSUFBSSxLQUFLLFlBQVk7b0JBQ2pELFNBQVMsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLElBQUksS0FBSyxZQUFZLEVBQ25ELENBQUM7b0JBQ0Msd0JBQXdCLEdBQUcsSUFBSSxDQUFDO2dCQUNwQyxDQUFDO2dCQUNELDJFQUEyRTtnQkFDM0UsSUFBSSxTQUFTLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEtBQUssV0FBVyxFQUFFLENBQUM7b0JBQ25ELHFCQUFxQixHQUFHLElBQUksQ0FBQztnQkFDakMsQ0FBQztnQkFFRCxJQUFJLFNBQVMsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLElBQUksS0FBSyxZQUFZLEVBQUUsQ0FBQztvQkFDcEQsc0JBQXNCLEdBQUcsSUFBSSxDQUFDO2dCQUNsQyxDQUFDO2dCQUNELElBQUksU0FBUyxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsSUFBSSxLQUFLLFlBQVksRUFBRSxDQUFDO29CQUNwRCxzQkFBc0IsR0FBRyxJQUFJLENBQUM7Z0JBQ2xDLENBQUM7WUFDTCxDQUFDO1FBQ0wsQ0FBQztJQUNMLENBQUM7SUFDRCxPQUFPO1FBQ0gscUJBQXFCO1FBQ3JCLHdCQUF3QjtRQUN4QixzQkFBc0I7UUFDdEIsc0JBQXNCO0tBQ3pCLENBQUM7QUFDTixDQUFDIn0=
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { ESLintUtils, TSESTree } from "@typescript-eslint/utils";
|
|
2
|
-
import { EnumTestResultModel } from "./enumTestResultModel";
|
|
2
|
+
import { EnumTestResultModel } from "./enumTestResultModel.js";
|
|
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: ESLintUtils.RuleModule<"needsEnumNameAdded" | "needsTypeRemoved" | "enumNameShouldMatchType", [], unknown, ESLintUtils.RuleListener>;
|
|
@@ -1,23 +1,20 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
const
|
|
6
|
-
const typedTokenHelpers_1 = require("../../utils/typedTokenHelpers");
|
|
7
|
-
const enumTestResultModel_1 = require("./enumTestResultModel");
|
|
8
|
-
const noChangesRequiredResult = new enumTestResultModel_1.EnumTestResultModel({
|
|
1
|
+
import { ESLintUtils } from "@typescript-eslint/utils";
|
|
2
|
+
import { createRule } from "../../utils/createRule.js";
|
|
3
|
+
import { typedTokenHelpers } from "../../utils/typedTokenHelpers.js";
|
|
4
|
+
import { EnumTestResultModel } from "./enumTestResultModel.js";
|
|
5
|
+
const noChangesRequiredResult = new EnumTestResultModel({
|
|
9
6
|
needsEnumAdded: false,
|
|
10
7
|
needsEnumNameAdded: false,
|
|
11
8
|
needsEnumNameToMatchEnumType: false,
|
|
12
9
|
needsTypeRemoved: false,
|
|
13
10
|
});
|
|
14
|
-
const hasEnumSpecifiedCorrectly = (node, isEnumType) => {
|
|
11
|
+
export const hasEnumSpecifiedCorrectly = (node, isEnumType) => {
|
|
15
12
|
// is this an enum
|
|
16
13
|
if (!isEnumType) {
|
|
17
14
|
return noChangesRequiredResult;
|
|
18
15
|
}
|
|
19
16
|
// is this decorated with api documentation
|
|
20
|
-
const decorators =
|
|
17
|
+
const decorators = typedTokenHelpers.getDecoratorsNamed(node, ["ApiPropertyOptional", "ApiProperty"]);
|
|
21
18
|
if (decorators.length === 0) {
|
|
22
19
|
return noChangesRequiredResult;
|
|
23
20
|
}
|
|
@@ -25,7 +22,7 @@ const hasEnumSpecifiedCorrectly = (node, isEnumType) => {
|
|
|
25
22
|
const firstArgument = decorators[0].expression
|
|
26
23
|
.arguments[0];
|
|
27
24
|
if (!firstArgument) {
|
|
28
|
-
return new
|
|
25
|
+
return new EnumTestResultModel({
|
|
29
26
|
needsEnumAdded: true,
|
|
30
27
|
needsEnumNameAdded: true,
|
|
31
28
|
needsEnumNameToMatchEnumType: false,
|
|
@@ -40,15 +37,14 @@ const hasEnumSpecifiedCorrectly = (node, isEnumType) => {
|
|
|
40
37
|
// check if there is an enumName: property in the provided options (enums should specify a name)
|
|
41
38
|
const enumNameProperty = firstArgument.properties.find((p) => p.key.name ===
|
|
42
39
|
"enumName");
|
|
43
|
-
return new
|
|
40
|
+
return new EnumTestResultModel({
|
|
44
41
|
needsEnumAdded: enumProperty === undefined,
|
|
45
42
|
needsEnumNameAdded: enumNameProperty === undefined,
|
|
46
|
-
needsEnumNameToMatchEnumType:
|
|
43
|
+
needsEnumNameToMatchEnumType: needsEnumNameMatchingEnumType(enumNameProperty, enumProperty),
|
|
47
44
|
needsTypeRemoved: hasTypeProperty,
|
|
48
45
|
});
|
|
49
46
|
};
|
|
50
|
-
|
|
51
|
-
const needsEnumNameMatchingEnumType = (enumNameProperty, enumProperty) => {
|
|
47
|
+
export const needsEnumNameMatchingEnumType = (enumNameProperty, enumProperty) => {
|
|
52
48
|
// if enum props aren't specified we don't care about this scenario
|
|
53
49
|
if (enumNameProperty === undefined || enumProperty === undefined) {
|
|
54
50
|
return false;
|
|
@@ -57,8 +53,7 @@ const needsEnumNameMatchingEnumType = (enumNameProperty, enumProperty) => {
|
|
|
57
53
|
enumProperty.value?.name;
|
|
58
54
|
return !isEnumNameMatchingEnumType;
|
|
59
55
|
};
|
|
60
|
-
|
|
61
|
-
const rule = (0, createRule_1.createRule)({
|
|
56
|
+
const rule = createRule({
|
|
62
57
|
name: "api-enum-property-best-practices",
|
|
63
58
|
meta: {
|
|
64
59
|
docs: {
|
|
@@ -76,14 +71,14 @@ const rule = (0, createRule_1.createRule)({
|
|
|
76
71
|
defaultOptions: [],
|
|
77
72
|
create(context) {
|
|
78
73
|
//const globalScope = context.getScope();
|
|
79
|
-
const parserServices =
|
|
74
|
+
const parserServices = ESLintUtils.getParserServices(context);
|
|
80
75
|
const typeChecker = parserServices.program.getTypeChecker();
|
|
81
76
|
return {
|
|
82
77
|
PropertyDefinition(node) {
|
|
83
78
|
const mappedNode = parserServices.esTreeNodeToTSNodeMap.get(node);
|
|
84
79
|
const objectType = typeChecker.getTypeAtLocation(mappedNode);
|
|
85
|
-
const isEnumType =
|
|
86
|
-
const result =
|
|
80
|
+
const isEnumType = typedTokenHelpers.isEnumType(objectType);
|
|
81
|
+
const result = hasEnumSpecifiedCorrectly(node, isEnumType);
|
|
87
82
|
if (result.needsEnumNameAdded) {
|
|
88
83
|
context.report({
|
|
89
84
|
node: node,
|
|
@@ -106,5 +101,5 @@ const rule = (0, createRule_1.createRule)({
|
|
|
106
101
|
};
|
|
107
102
|
},
|
|
108
103
|
});
|
|
109
|
-
|
|
110
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
104
|
+
export default rule;
|
|
105
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBpRW51bVByb3BlcnR5QmVzdFByYWN0aWNlcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9ydWxlcy9hcGlFbnVtUHJvcGVydHlCZXN0UHJhY3RpY2VzL2FwaUVudW1Qcm9wZXJ0eUJlc3RQcmFjdGljZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLFdBQVcsRUFBVyxNQUFNLDBCQUEwQixDQUFDO0FBQy9ELE9BQU8sRUFBQyxVQUFVLEVBQUMsTUFBTSwyQkFBMkIsQ0FBQztBQUNyRCxPQUFPLEVBQUMsaUJBQWlCLEVBQUMsTUFBTSxrQ0FBa0MsQ0FBQztBQUNuRSxPQUFPLEVBQUMsbUJBQW1CLEVBQUMsTUFBTSwwQkFBMEIsQ0FBQztBQUU3RCxNQUFNLHVCQUF1QixHQUFHLElBQUksbUJBQW1CLENBQUM7SUFDcEQsY0FBYyxFQUFFLEtBQUs7SUFDckIsa0JBQWtCLEVBQUUsS0FBSztJQUN6Qiw0QkFBNEIsRUFBRSxLQUFLO0lBQ25DLGdCQUFnQixFQUFFLEtBQUs7Q0FDMUIsQ0FBQyxDQUFDO0FBRUgsTUFBTSxDQUFDLE1BQU0seUJBQXlCLEdBQUcsQ0FDckMsSUFBbUIsRUFDbkIsVUFBbUIsRUFDQSxFQUFFO0lBQ3JCLGtCQUFrQjtJQUNsQixJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDZCxPQUFPLHVCQUF1QixDQUFDO0lBQ25DLENBQUM7SUFFRCwyQ0FBMkM7SUFDM0MsTUFBTSxVQUFVLEdBQUcsaUJBQWlCLENBQUMsa0JBQWtCLENBQ25ELElBQW1DLEVBQ25DLENBQUMscUJBQXFCLEVBQUUsYUFBYSxDQUFDLENBQ3pDLENBQUM7SUFFRixJQUFJLFVBQVUsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDMUIsT0FBTyx1QkFBdUIsQ0FBQztJQUNuQyxDQUFDO0lBRUQsc0dBQXNHO0lBQ3RHLE1BQU0sYUFBYSxHQUFJLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFz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
|
|
@@ -1,7 +1,4 @@
|
|
|
1
|
-
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.EnumTestResultModel = void 0;
|
|
4
|
-
class EnumTestResultModel {
|
|
1
|
+
export class EnumTestResultModel {
|
|
5
2
|
constructor(init) {
|
|
6
3
|
this.needsEnumAdded = init.needsEnumAdded;
|
|
7
4
|
this.needsEnumNameAdded = init.needsEnumNameAdded;
|
|
@@ -9,5 +6,4 @@ class EnumTestResultModel {
|
|
|
9
6
|
this.needsEnumNameToMatchEnumType = init.needsEnumNameToMatchEnumType;
|
|
10
7
|
}
|
|
11
8
|
}
|
|
12
|
-
|
|
13
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW51bVRlc3RSZXN1bHRNb2RlbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9ydWxlcy9hcGlFbnVtUHJvcGVydHlCZXN0UHJhY3RpY2VzL2VudW1UZXN0UmVzdWx0TW9kZWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsTUFBYSxtQkFBbUI7SUFDNUIsWUFBWSxJQUF5QjtRQUNqQyxJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUM7UUFDMUMsSUFBSSxDQUFDLGtCQUFrQixHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQztRQUNsRCxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDO1FBQzlDLElBQUksQ0FBQyw0QkFBNEIsR0FBRyxJQUFJLENBQUMsNEJBQTRCLENBQUM7SUFDMUUsQ0FBQztDQUtKO0FBWEQsa0RBV0MifQ==
|
|
9
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW51bVRlc3RSZXN1bHRNb2RlbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9ydWxlcy9hcGlFbnVtUHJvcGVydHlCZXN0UHJhY3RpY2VzL2VudW1UZXN0UmVzdWx0TW9kZWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsTUFBTSxPQUFPLG1CQUFtQjtJQUM1QixZQUFZLElBQXlCO1FBQ2pDLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQztRQUMxQyxJQUFJLENBQUMsa0JBQWtCLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDO1FBQ2xELElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUM7UUFDOUMsSUFBSSxDQUFDLDRCQUE0QixHQUFHLElBQUksQ0FBQyw0QkFBNEIsQ0FBQztJQUMxRSxDQUFDO0NBS0oifQ==
|
|
@@ -1,14 +1,11 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
const
|
|
5
|
-
const
|
|
6
|
-
const
|
|
7
|
-
const apiMethodsShouldBeGuarded = (node) => {
|
|
8
|
-
const hasApiMethodDecorator = typedTokenHelpers_1.typedTokenHelpers.nodeHasDecoratorsNamed(node, ["Get", "Post", "Put", "Delete", "Patch", "Options", "Head", "All"]);
|
|
9
|
-
const hasUseGuardsDecorator = typedTokenHelpers_1.typedTokenHelpers.nodeHasDecoratorsNamed(node, ["UseGuards"]);
|
|
1
|
+
import { TSESTree } from "@typescript-eslint/utils";
|
|
2
|
+
import { createRule } from "../../utils/createRule.js";
|
|
3
|
+
import { typedTokenHelpers } from "../../utils/typedTokenHelpers.js";
|
|
4
|
+
export const apiMethodsShouldBeGuarded = (node) => {
|
|
5
|
+
const hasApiMethodDecorator = typedTokenHelpers.nodeHasDecoratorsNamed(node, ["Get", "Post", "Put", "Delete", "Patch", "Options", "Head", "All"]);
|
|
6
|
+
const hasUseGuardsDecorator = typedTokenHelpers.nodeHasDecoratorsNamed(node, ["UseGuards"]);
|
|
10
7
|
function findClassDeclaration(node) {
|
|
11
|
-
if (node.type ===
|
|
8
|
+
if (node.type === TSESTree.AST_NODE_TYPES.ClassDeclaration) {
|
|
12
9
|
return node;
|
|
13
10
|
}
|
|
14
11
|
if (node.parent) {
|
|
@@ -18,14 +15,13 @@ const apiMethodsShouldBeGuarded = (node) => {
|
|
|
18
15
|
}
|
|
19
16
|
const classNode = findClassDeclaration(node);
|
|
20
17
|
const hasUseGuardsDecoratorOnController = classNode
|
|
21
|
-
?
|
|
18
|
+
? typedTokenHelpers.nodeHasDecoratorsNamed(classNode, ["UseGuards"])
|
|
22
19
|
: false;
|
|
23
20
|
return (hasApiMethodDecorator &&
|
|
24
21
|
!hasUseGuardsDecorator &&
|
|
25
22
|
!hasUseGuardsDecoratorOnController);
|
|
26
23
|
};
|
|
27
|
-
|
|
28
|
-
const rule = (0, createRule_1.createRule)({
|
|
24
|
+
const rule = createRule({
|
|
29
25
|
name: "api-methods-should-be-guarded",
|
|
30
26
|
meta: {
|
|
31
27
|
docs: {
|
|
@@ -42,7 +38,7 @@ const rule = (0, createRule_1.createRule)({
|
|
|
42
38
|
create(context) {
|
|
43
39
|
return {
|
|
44
40
|
MethodDefinition(node) {
|
|
45
|
-
if (
|
|
41
|
+
if (apiMethodsShouldBeGuarded(node)) {
|
|
46
42
|
context.report({
|
|
47
43
|
node: node,
|
|
48
44
|
messageId: "apiMethodsShouldBeGuarded",
|
|
@@ -52,5 +48,5 @@ const rule = (0, createRule_1.createRule)({
|
|
|
52
48
|
};
|
|
53
49
|
},
|
|
54
50
|
});
|
|
55
|
-
|
|
56
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
51
|
+
export default rule;
|
|
52
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBpTWV0aG9kc1Nob3VsZEJlR3VhcmRlZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9ydWxlcy9hcGlNZXRob2RzU2hvdWxkQmVHdWFyZGVkL2FwaU1ldGhvZHNTaG91bGRCZUd1YXJkZWQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLFFBQVEsRUFBQyxNQUFNLDBCQUEwQixDQUFDO0FBQ2xELE9BQU8sRUFBQyxVQUFVLEVBQUMsTUFBTSwyQkFBMkIsQ0FBQztBQUNyRCxPQUFPLEVBQUMsaUJBQWlCLEVBQUMsTUFBTSxrQ0FBa0MsQ0FBQztBQUVuRSxNQUFNLENBQUMsTUFBTSx5QkFBeUIsR0FBRyxDQUFDLElBQStCLEVBQUUsRUFBRTtJQUN6RSxNQUFNLHFCQUFxQixHQUFHLGlCQUFpQixDQUFDLHNCQUFzQixDQUNsRSxJQUFJLEVBQ0osQ0FBQyxLQUFLLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsS0FBSyxDQUFDLENBQ3RFLENBQUM7SUFFRixNQUFNLHFCQUFxQixHQUFHLGlCQUFpQixDQUFDLHNCQUFzQixDQUNsRSxJQUFJLEVBQ0osQ0FBQyxXQUFXLENBQUMsQ0FDaEIsQ0FBQztJQUVGLFNBQVMsb0JBQW9CLENBQ3pCLElBQW1CO1FBRW5CLElBQUksSUFBSSxDQUFDLElBQUksS0FBSyxRQUFRLENBQUMsY0FBYyxDQUFDLGdCQUFnQixFQUFFLENBQUM7WUFDekQsT0FBTyxJQUFJLENBQUM7UUFDaEIsQ0FBQztRQUNELElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ2QsT0FBTyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDN0MsQ0FBQztRQUNELE9BQU8sSUFBSSxDQUFDO0lBQ2hCLENBQUM7SUFFRCxNQUFNLFNBQVMsR0FBRyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUU3QyxNQUFNLGlDQUFpQyxHQUFHLFNBQVM7UUFDL0MsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLHNCQUFzQixDQUFDLFNBQVMsRUFBRSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQ3BFLENBQUMsQ0FBQyxLQUFLLENBQUM7SUFFWixPQUFPLENBQ0gscUJBQXFCO1FBQ3JCLENBQUMscUJBQXFCO1FBQ3RCLENBQUMsaUNBQWlDLENBQ3JDLENBQUM7QUFDTixDQUFDLENBQUM7QUFFRixNQUFNLElBQUksR0FBRyxVQUFVLENBQWtDO0lBQ3JELElBQUksRUFBRSwrQkFBK0I7SUFDckMsSUFBSSxFQUFFO1FBQ0YsSUFBSSxFQUFFO1lBQ0YsV0FBVyxFQUNQLDZFQUE2RTtTQUNwRjtRQUNELFFBQVEsRUFBRTtZQUNOLHlCQUF5QixFQUNyQiwyR0FBMkc7U0FDbEg7UUFDRCxNQUFNLEVBQUUsRUFBRTtRQUNWLGNBQWMsRUFBRSxLQUFLO1FBQ3JCLElBQUksRUFBRSxZQUFZO0tBQ3JCO0lBQ0QsY0FBYyxFQUFFLEVBQUU7SUFDbEIsTUFBTSxDQUFDLE9BQU87UUFDVixPQUFPO1lBQ0gsZ0JBQWdCLENBQUMsSUFBK0I7Z0JBQzVDLElBQUkseUJBQXlCLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztvQkFDbEMsT0FBTyxDQUFDLE1BQU0sQ0FBQzt3QkFDWCxJQUFJLEVBQUUsSUFBSTt3QkFDVixTQUFTLEVBQUUsMkJBQTJCO3FCQUN6QyxDQUFDLENBQUM7Z0JBQ1AsQ0FBQztZQUNMLENBQUM7U0FDSixDQUFDO0lBQ04sQ0FBQztDQUNKLENBQUMsQ0FBQztBQUVILGVBQWUsSUFBSSxDQUFDIn0=
|
package/dist/rules/apiMethodsShouldSpecifyApiOperation/apiMethodsShouldSpecifyApiOperation.js
CHANGED
|
@@ -1,15 +1,11 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
const
|
|
5
|
-
const
|
|
6
|
-
const shouldUseApiResponseDecorator = (node) => {
|
|
7
|
-
const hasApiMethodDecorator = typedTokenHelpers_1.typedTokenHelpers.nodeHasDecoratorsNamed(node, ["Get", "Post", "Put", "Delete", "Patch", "Options", "Head", "All"]);
|
|
8
|
-
const hasApiOperationDecorator = typedTokenHelpers_1.typedTokenHelpers.nodeHasDecoratorsNamed(node, ["ApiOperation"]);
|
|
1
|
+
import { createRule } from "../../utils/createRule.js";
|
|
2
|
+
import { typedTokenHelpers } from "../../utils/typedTokenHelpers.js";
|
|
3
|
+
export const shouldUseApiResponseDecorator = (node) => {
|
|
4
|
+
const hasApiMethodDecorator = typedTokenHelpers.nodeHasDecoratorsNamed(node, ["Get", "Post", "Put", "Delete", "Patch", "Options", "Head", "All"]);
|
|
5
|
+
const hasApiOperationDecorator = typedTokenHelpers.nodeHasDecoratorsNamed(node, ["ApiOperation"]);
|
|
9
6
|
return hasApiMethodDecorator && !hasApiOperationDecorator;
|
|
10
7
|
};
|
|
11
|
-
|
|
12
|
-
const rule = (0, createRule_1.createRule)({
|
|
8
|
+
const rule = createRule({
|
|
13
9
|
name: "api-method-should-specify-api-operation",
|
|
14
10
|
meta: {
|
|
15
11
|
docs: {
|
|
@@ -26,7 +22,7 @@ const rule = (0, createRule_1.createRule)({
|
|
|
26
22
|
create(context) {
|
|
27
23
|
return {
|
|
28
24
|
MethodDefinition(node) {
|
|
29
|
-
if (
|
|
25
|
+
if (shouldUseApiResponseDecorator(node)) {
|
|
30
26
|
context.report({
|
|
31
27
|
node: node,
|
|
32
28
|
messageId: "shouldSpecifyApiOperation",
|
|
@@ -36,5 +32,5 @@ const rule = (0, createRule_1.createRule)({
|
|
|
36
32
|
};
|
|
37
33
|
},
|
|
38
34
|
});
|
|
39
|
-
|
|
40
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
35
|
+
export default rule;
|
|
36
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBpTWV0aG9kc1Nob3VsZFNwZWNpZnlBcGlPcGVyYXRpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvcnVsZXMvYXBpTWV0aG9kc1Nob3VsZFNwZWNpZnlBcGlPcGVyYXRpb24vYXBpTWV0aG9kc1Nob3VsZFNwZWNpZnlBcGlPcGVyYXRpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFDLFVBQVUsRUFBQyxNQUFNLDJCQUEyQixDQUFDO0FBQ3JELE9BQU8sRUFBQyxpQkFBaUIsRUFBQyxNQUFNLGtDQUFrQyxDQUFDO0FBRW5FLE1BQU0sQ0FBQyxNQUFNLDZCQUE2QixHQUFHLENBQ3pDLElBQStCLEVBQ3hCLEVBQUU7SUFDVCxNQUFNLHFCQUFxQixHQUFHLGlCQUFpQixDQUFDLHNCQUFzQixDQUNsRSxJQUFJLEVBQ0osQ0FBQyxLQUFLLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsS0FBSyxDQUFDLENBQ3RFLENBQUM7SUFFRixNQUFNLHdCQUF3QixHQUFHLGlCQUFpQixDQUFDLHNCQUFzQixDQUNyRSxJQUFJLEVBQ0osQ0FBQyxjQUFjLENBQUMsQ0FDbkIsQ0FBQztJQUVGLE9BQU8scUJBQXFCLElBQUksQ0FBQyx3QkFBd0IsQ0FBQztBQUM5RCxDQUFDLENBQUM7QUFFRixNQUFNLElBQUksR0FBRyxVQUFVLENBQWtDO0lBQ3JELElBQUksRUFBRSx5Q0FBeUM7SUFDL0MsSUFBSSxFQUFFO1FBQ0YsSUFBSSxFQUFFO1lBQ0YsV0FBVyxFQUNQLGdFQUFnRTtTQUN2RTtRQUNELFFBQVEsRUFBRTtZQUNOLHlCQUF5QixFQUFFLG1MQUFtTDtTQUNqTjtRQUNELE1BQU0sRUFBRSxFQUFFO1FBQ1YsY0FBYyxFQUFFLEtBQUs7UUFDckIsSUFBSSxFQUFFLFlBQVk7S0FDckI7SUFDRCxjQUFjLEVBQUUsRUFBRTtJQUVsQixNQUFNLENBQUMsT0FBTztRQUNWLE9BQU87WUFDSCxnQkFBZ0IsQ0FBQyxJQUErQjtnQkFDNUMsSUFBSSw2QkFBNkIsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO29CQUN0QyxPQUFPLENBQUMsTUFBTSxDQUFDO3dCQUNYLElBQUksRUFBRSxJQUFJO3dCQUNWLFNBQVMsRUFBRSwyQkFBMkI7cUJBQ3pDLENBQUMsQ0FBQztnQkFDUCxDQUFDO1lBQ0wsQ0FBQztTQUNKLENBQUM7SUFDTixDQUFDO0NBQ0osQ0FBQyxDQUFDO0FBRUgsZUFBZSxJQUFJLENBQUMifQ==
|