@checkdigit/eslint-plugin 7.11.0-PR.113-77d9 → 7.11.0-PR.45-5dba
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-mjs/index.mjs +7 -9
- package/dist-mjs/library/ts-tree.mjs +1 -1
- package/dist-mjs/require-assert-message.mjs +75 -0
- package/dist-types/library/ts-tree.d.ts +1 -1
- package/dist-types/require-assert-message.d.ts +4 -0
- package/package.json +1 -1
- package/src/index.ts +4 -6
- package/src/library/ts-tree.ts +5 -1
- package/src/require-assert-message.ts +94 -0
- package/dist-mjs/require-service-call-response-declaration.mjs +0 -57
- package/dist-mjs/service.mjs +0 -9
- package/dist-types/require-service-call-response-declaration.d.ts +0 -4
- package/dist-types/service.d.ts +0 -2
- package/src/require-service-call-response-declaration.ts +0 -72
- package/src/service.ts +0 -11
package/dist-mjs/index.mjs
CHANGED
|
@@ -14,9 +14,6 @@ import requireTypeOutOfTypeOnlyImports, {
|
|
|
14
14
|
ruleId as requireTypeOutOfTypeOnlyImportsRuleId
|
|
15
15
|
} from "./require-type-out-of-type-only-imports.mjs";
|
|
16
16
|
import noServeRuntime, { ruleId as noServeRuntimeRuleId } from "./no-serve-runtime.mjs";
|
|
17
|
-
import requireServiceCallResponseDeclaration, {
|
|
18
|
-
ruleId as requireServiceCallResponseDeclarationRuleId
|
|
19
|
-
} from "./require-service-call-response-declaration.mjs";
|
|
20
17
|
import filePathComment from "./file-path-comment.mjs";
|
|
21
18
|
import noCardNumbers from "./no-card-numbers.mjs";
|
|
22
19
|
import noEnum from "./no-enum.mjs";
|
|
@@ -29,6 +26,7 @@ import objectLiteralResponse from "./object-literal-response.mjs";
|
|
|
29
26
|
import regexComment from "./regular-expression-comment.mjs";
|
|
30
27
|
import requireAssertPredicateRejectsThrows from "./require-assert-predicate-rejects-throws.mjs";
|
|
31
28
|
import requireStrictAssert from "./require-strict-assert.mjs";
|
|
29
|
+
import requireAssertMessage from "./require-assert-message.mjs";
|
|
32
30
|
import requireTsExtensionImportsExports from "./require-ts-extension-imports-exports.mjs";
|
|
33
31
|
var rules = {
|
|
34
32
|
"file-path-comment": filePathComment,
|
|
@@ -37,6 +35,7 @@ var rules = {
|
|
|
37
35
|
"no-random-v4-uuid": noRandomV4UUID,
|
|
38
36
|
"no-status-code-assert": noStatusCodeAssert,
|
|
39
37
|
"no-uuid": noUuid,
|
|
38
|
+
"require-assert-message": requireAssertMessage,
|
|
40
39
|
"require-strict-assert": requireStrictAssert,
|
|
41
40
|
"require-ts-extension-imports-exports": requireTsExtensionImportsExports,
|
|
42
41
|
"no-test-import": noTestImport,
|
|
@@ -51,7 +50,6 @@ var rules = {
|
|
|
51
50
|
[requireResolveFullResponseRuleId]: requireResolveFullResponse,
|
|
52
51
|
[noDuplicatedImportsRuleId]: noDuplicatedImports,
|
|
53
52
|
[noServeRuntimeRuleId]: noServeRuntime,
|
|
54
|
-
[requireServiceCallResponseDeclarationRuleId]: requireServiceCallResponseDeclaration,
|
|
55
53
|
[requireFixedServicesImportRuleId]: requireFixedServicesImport,
|
|
56
54
|
[requireTypeOutOfTypeOnlyImportsRuleId]: requireTypeOutOfTypeOnlyImports
|
|
57
55
|
};
|
|
@@ -72,6 +70,7 @@ var configs = {
|
|
|
72
70
|
"@checkdigit/no-random-v4-uuid": "error",
|
|
73
71
|
"@checkdigit/no-status-code-assert": "error",
|
|
74
72
|
"@checkdigit/no-uuid": "error",
|
|
73
|
+
"@checkdigit/require-assert-message": "error",
|
|
75
74
|
"@checkdigit/require-strict-assert": "error",
|
|
76
75
|
"@checkdigit/require-ts-extension-imports-exports": "error",
|
|
77
76
|
"@checkdigit/no-wallaby-comment": "error",
|
|
@@ -90,8 +89,7 @@ var configs = {
|
|
|
90
89
|
[`@checkdigit/${noDuplicatedImportsRuleId}`]: "error",
|
|
91
90
|
[`@checkdigit/${requireFixedServicesImportRuleId}`]: "error",
|
|
92
91
|
[`@checkdigit/${requireTypeOutOfTypeOnlyImportsRuleId}`]: "error",
|
|
93
|
-
[`@checkdigit/${noServeRuntimeRuleId}`]: "error"
|
|
94
|
-
[`@checkdigit/${requireServiceCallResponseDeclarationRuleId}`]: "error"
|
|
92
|
+
[`@checkdigit/${noServeRuntimeRuleId}`]: "error"
|
|
95
93
|
}
|
|
96
94
|
}
|
|
97
95
|
],
|
|
@@ -108,6 +106,7 @@ var configs = {
|
|
|
108
106
|
"@checkdigit/no-random-v4-uuid": "error",
|
|
109
107
|
"@checkdigit/no-status-code-assert": "error",
|
|
110
108
|
"@checkdigit/no-uuid": "error",
|
|
109
|
+
"@checkdigit/require-assert-message": "error",
|
|
111
110
|
"@checkdigit/require-strict-assert": "error",
|
|
112
111
|
"@checkdigit/require-ts-extension-imports-exports": "error",
|
|
113
112
|
"@checkdigit/no-wallaby-comment": "off",
|
|
@@ -123,8 +122,7 @@ var configs = {
|
|
|
123
122
|
[`@checkdigit/${noDuplicatedImportsRuleId}`]: "error",
|
|
124
123
|
[`@checkdigit/${requireFixedServicesImportRuleId}`]: "off",
|
|
125
124
|
[`@checkdigit/${requireTypeOutOfTypeOnlyImportsRuleId}`]: "error",
|
|
126
|
-
[`@checkdigit/${noServeRuntimeRuleId}`]: "off"
|
|
127
|
-
[`@checkdigit/${requireServiceCallResponseDeclarationRuleId}`]: "off"
|
|
125
|
+
[`@checkdigit/${noServeRuntimeRuleId}`]: "off"
|
|
128
126
|
}
|
|
129
127
|
}
|
|
130
128
|
]
|
|
@@ -137,4 +135,4 @@ var src_default = defaultToExport;
|
|
|
137
135
|
export {
|
|
138
136
|
src_default as default
|
|
139
137
|
};
|
|
140
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
138
|
+
//# sourceMappingURL=data:application/json;base64,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
|
|
@@ -69,4 +69,4 @@ export {
|
|
|
69
69
|
isBlockStatement,
|
|
70
70
|
isUsedInArrayOrAsArgument
|
|
71
71
|
};
|
|
72
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
72
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL2xpYnJhcnkvdHMtdHJlZS50cyJdLAogICJtYXBwaW5ncyI6ICI7QUFRQSxTQUFTLHNCQUFnQztBQVFsQyxTQUFTLFVBQVUsTUFBdUQ7QUFDL0UsU0FBUSxLQUF3QztBQUNsRDtBQUVPLFNBQVMsWUFDZCxNQUNBLFNBQ0EsYUFDMkI7QUFDM0IsUUFBTSxTQUFTLFVBQVUsSUFBSTtBQUM3QixNQUFJLENBQUMsUUFBUTtBQUNYLFdBQU87QUFBQSxFQUNULFdBQVcsT0FBTyxZQUFZLFlBQVksT0FBTyxTQUFTLFNBQVM7QUFDakUsV0FBTztBQUFBLEVBQ1QsV0FBVyxPQUFPLFlBQVksY0FBYyxRQUFRLE1BQU0sR0FBRztBQUMzRCxXQUFPO0FBQUEsRUFDVCxXQUFXLE9BQU8sZ0JBQWdCLFlBQVksT0FBTyxTQUFTLGFBQWE7QUFDekUsV0FBTztBQUFBLEVBQ1QsV0FBVyxPQUFPLGdCQUFnQixjQUFjLFlBQVksTUFBTSxHQUFHO0FBQ25FLFdBQU87QUFBQSxFQUNUO0FBQ0EsU0FBTyxZQUFZLFFBQVEsU0FBUyxXQUFXO0FBQ2pEO0FBRU8sU0FBUyxpQkFBaUIsTUFBOEI7QUFDN0QsU0FBTyxLQUFLLEtBQUssU0FBUyxXQUFXLEtBQUssS0FBSyxLQUFLLFNBQVMsYUFBYTtBQUM1RTtBQUVPLFNBQVMsc0JBQXNCLE1BQWdEO0FBQ3BGLFNBQU8sWUFBWSxNQUFNLGdCQUFnQjtBQUMzQztBQUVPLFNBQVMsc0JBQXNCLE1BQWdEO0FBQ3BGLFNBQU87QUFBQSxJQUFZO0FBQUEsSUFBTSxDQUFDLGVBQ3hCLENBQUMsc0JBQXNCLHVCQUF1QiwyQkFBMkIsU0FBUyxFQUFFLFNBQVMsV0FBVyxJQUFJO0FBQUEsRUFDOUc7QUFDRjtBQUVPLFNBQVMsMEJBQTBCLE1BQThCO0FBQ3RFLE1BQUksaUJBQWlCLElBQUksR0FBRztBQUMxQixXQUFPO0FBQUEsRUFDVDtBQUVBLFFBQU0sU0FBUyxVQUFVLElBQUk7QUFDN0IsTUFBSSxDQUFDLFFBQVE7QUFDWCxXQUFPO0FBQUEsRUFDVDtBQUVBLE1BQ0UsT0FBTyxTQUFTLGVBQWUsbUJBQzlCLE9BQU8sU0FBUyxlQUFlLGtCQUFrQixPQUFPLFVBQVUsU0FBUyxJQUEyQixHQUN2RztBQUNBLFdBQU87QUFBQSxFQUNUO0FBR0EsU0FBTywwQkFBMEIsTUFBTTtBQUN6QztBQUVPLFNBQVMscUJBQ2QsTUFLWTtBQUNaLE1BQ0UsS0FBSyxTQUFTLGVBQWUsdUJBQzdCLEtBQUssU0FBUyxlQUFlLHNCQUM3QixLQUFLLFNBQVMsZUFBZSx5QkFDN0I7QUFDQSxXQUFPO0FBQUEsRUFDVDtBQUVBLFFBQU0sU0FBUyxVQUFVLElBQUk7QUFDN0IsTUFBSSxDQUFDLFFBQVE7QUFDWDtBQUFBLEVBQ0Y7QUFDQSxTQUFPLHFCQUFxQixNQUFNO0FBQ3BDO0FBRU8sU0FBUyxrQkFDZCxNQUNpRTtBQUNqRSxNQUFJLENBQUMsTUFBTTtBQUNULFdBQU87QUFBQSxFQUNUO0FBQ0EsU0FBTyxLQUFLLFNBQVMsZUFBZSxvQkFBb0IsS0FBSyxTQUFTLGVBQWUsaUJBQ2pGLE9BQ0Esa0JBQWtCLEtBQUssTUFBTTtBQUNuQzsiLAogICJuYW1lcyI6IFtdCn0K
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
// src/require-assert-message.ts
|
|
2
|
+
import { strict as assert } from "node:assert";
|
|
3
|
+
import { ESLintUtils } from "@typescript-eslint/utils";
|
|
4
|
+
import { TSESTree } from "@typescript-eslint/types";
|
|
5
|
+
import getDocumentationUrl from "./get-documentation-url.mjs";
|
|
6
|
+
var ruleId = "require-assert-message";
|
|
7
|
+
var MISSING_ASSERT_MESSAGE = "MISSING_ASSERT_MESSAGE";
|
|
8
|
+
var methodsRequiringMessage = Object.keys(assert).filter((key) => typeof assert[key] === "function");
|
|
9
|
+
var createRule = ESLintUtils.RuleCreator((name) => getDocumentationUrl(name));
|
|
10
|
+
var rule = createRule({
|
|
11
|
+
name: ruleId,
|
|
12
|
+
meta: {
|
|
13
|
+
type: "problem",
|
|
14
|
+
docs: {
|
|
15
|
+
description: "Validate that message argument is always supplied to node:assert methods"
|
|
16
|
+
},
|
|
17
|
+
schema: [],
|
|
18
|
+
messages: {
|
|
19
|
+
[MISSING_ASSERT_MESSAGE]: "Missing message argument in {{methodName}}() method."
|
|
20
|
+
}
|
|
21
|
+
},
|
|
22
|
+
defaultOptions: [],
|
|
23
|
+
create(context) {
|
|
24
|
+
let assertAlias = "assert";
|
|
25
|
+
return {
|
|
26
|
+
ImportDeclaration(node) {
|
|
27
|
+
if (node.source.value === "node:assert") {
|
|
28
|
+
const specifier = node.specifiers.find(
|
|
29
|
+
(importSpecifier) => importSpecifier.type === TSESTree.AST_NODE_TYPES.ImportDefaultSpecifier || importSpecifier.type === TSESTree.AST_NODE_TYPES.ImportSpecifier
|
|
30
|
+
);
|
|
31
|
+
if (specifier) {
|
|
32
|
+
assertAlias = specifier.local.name;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
},
|
|
36
|
+
CallExpression(node) {
|
|
37
|
+
const callee = node.callee;
|
|
38
|
+
if (callee.type === TSESTree.AST_NODE_TYPES.MemberExpression && callee.object.type === TSESTree.AST_NODE_TYPES.Identifier && callee.property.type === TSESTree.AST_NODE_TYPES.Identifier) {
|
|
39
|
+
const objectName = callee.object.name;
|
|
40
|
+
const methodName = callee.property.name;
|
|
41
|
+
if (objectName === assertAlias && methodsRequiringMessage.includes(methodName)) {
|
|
42
|
+
const messageIndexMap = {
|
|
43
|
+
fail: 0,
|
|
44
|
+
ok: 1
|
|
45
|
+
};
|
|
46
|
+
const messageIndex = messageIndexMap[methodName] ?? 2;
|
|
47
|
+
if (node.arguments.length <= messageIndex) {
|
|
48
|
+
context.report({
|
|
49
|
+
node,
|
|
50
|
+
messageId: MISSING_ASSERT_MESSAGE,
|
|
51
|
+
data: {
|
|
52
|
+
methodName
|
|
53
|
+
}
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
} else if (callee.type === TSESTree.AST_NODE_TYPES.Identifier && callee.name === assertAlias && node.arguments.length < 2) {
|
|
58
|
+
context.report({
|
|
59
|
+
node,
|
|
60
|
+
messageId: MISSING_ASSERT_MESSAGE,
|
|
61
|
+
data: {
|
|
62
|
+
methodName: "assert"
|
|
63
|
+
}
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
});
|
|
70
|
+
var require_assert_message_default = rule;
|
|
71
|
+
export {
|
|
72
|
+
require_assert_message_default as default,
|
|
73
|
+
ruleId
|
|
74
|
+
};
|
|
75
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL3JlcXVpcmUtYXNzZXJ0LW1lc3NhZ2UudHMiXSwKICAibWFwcGluZ3MiOiAiO0FBUUEsU0FBUyxVQUFVLGNBQWM7QUFDakMsU0FBUyxtQkFBNkI7QUFDdEMsU0FBUyxnQkFBZ0I7QUFDekIsT0FBTyx5QkFBeUI7QUFFekIsSUFBTSxTQUFTO0FBQ3RCLElBQU0seUJBQXlCO0FBRS9CLElBQU0sMEJBQTBCLE9BQU8sS0FBSyxNQUFNLEVBQUUsT0FBTyxDQUFDLFFBQVEsT0FBUSxPQUFpQixHQUFHLE1BQU0sVUFBVTtBQUVoSCxJQUFNLGFBQWEsWUFBWSxZQUFZLENBQUMsU0FBUyxvQkFBb0IsSUFBSSxDQUFDO0FBQzlFLElBQU0sT0FBK0MsV0FBVztBQUFBLEVBQzlELE1BQU07QUFBQSxFQUNOLE1BQU07QUFBQSxJQUNKLE1BQU07QUFBQSxJQUNOLE1BQU07QUFBQSxNQUNKLGFBQWE7QUFBQSxJQUNmO0FBQUEsSUFDQSxRQUFRLENBQUM7QUFBQSxJQUNULFVBQVU7QUFBQSxNQUNSLENBQUMsc0JBQXNCLEdBQUc7QUFBQSxJQUM1QjtBQUFBLEVBQ0Y7QUFBQSxFQUNBLGdCQUFnQixDQUFDO0FBQUEsRUFDakIsT0FBTyxTQUFTO0FBQ2QsUUFBSSxjQUFjO0FBRWxCLFdBQU87QUFBQSxNQUNMLGtCQUFrQixNQUFrQztBQUNsRCxZQUFJLEtBQUssT0FBTyxVQUFVLGVBQWU7QUFDdkMsZ0JBQU0sWUFBWSxLQUFLLFdBQVc7QUFBQSxZQUNoQyxDQUFDLG9CQUNDLGdCQUFnQixTQUFTLFNBQVMsZUFBZSwwQkFDakQsZ0JBQWdCLFNBQVMsU0FBUyxlQUFlO0FBQUEsVUFDckQ7QUFDQSxjQUFJLFdBQVc7QUFDYiwwQkFBYyxVQUFVLE1BQU07QUFBQSxVQUNoQztBQUFBLFFBQ0Y7QUFBQSxNQUNGO0FBQUEsTUFDQSxlQUFlLE1BQStCO0FBQzVDLGNBQU0sU0FBUyxLQUFLO0FBQ3BCLFlBQ0UsT0FBTyxTQUFTLFNBQVMsZUFBZSxvQkFDeEMsT0FBTyxPQUFPLFNBQVMsU0FBUyxlQUFlLGNBQy9DLE9BQU8sU0FBUyxTQUFTLFNBQVMsZUFBZSxZQUNqRDtBQUNBLGdCQUFNLGFBQWEsT0FBTyxPQUFPO0FBQ2pDLGdCQUFNLGFBQWEsT0FBTyxTQUFTO0FBRW5DLGNBQUksZUFBZSxlQUFlLHdCQUF3QixTQUFTLFVBQVUsR0FBRztBQUM5RSxrQkFBTSxrQkFBMEM7QUFBQSxjQUM5QyxNQUFNO0FBQUEsY0FDTixJQUFJO0FBQUEsWUFDTjtBQUNBLGtCQUFNLGVBQWUsZ0JBQWdCLFVBQVUsS0FBSztBQUVwRCxnQkFBSSxLQUFLLFVBQVUsVUFBVSxjQUFjO0FBQ3pDLHNCQUFRLE9BQU87QUFBQSxnQkFDYjtBQUFBLGdCQUNBLFdBQVc7QUFBQSxnQkFDWCxNQUFNO0FBQUEsa0JBQ0o7QUFBQSxnQkFDRjtBQUFBLGNBQ0YsQ0FBQztBQUFBLFlBQ0g7QUFBQSxVQUNGO0FBQUEsUUFDRixXQUNFLE9BQU8sU0FBUyxTQUFTLGVBQWUsY0FDeEMsT0FBTyxTQUFTLGVBQ2hCLEtBQUssVUFBVSxTQUFTLEdBQ3hCO0FBQ0Esa0JBQVEsT0FBTztBQUFBLFlBQ2I7QUFBQSxZQUNBLFdBQVc7QUFBQSxZQUNYLE1BQU07QUFBQSxjQUNKLFlBQVk7QUFBQSxZQUNkO0FBQUEsVUFDRixDQUFDO0FBQUEsUUFDSDtBQUFBLE1BQ0Y7QUFBQSxJQUNGO0FBQUEsRUFDRjtBQUNGLENBQUM7QUFFRCxJQUFPLGlDQUFROyIsCiAgIm5hbWVzIjogW10KfQo=
|
|
@@ -5,5 +5,5 @@ export declare function isBlockStatement(node: TSESTree.Node): boolean;
|
|
|
5
5
|
export declare function getEnclosingStatement(node: TSESTree.Node): TSESTree.Node | undefined;
|
|
6
6
|
export declare function getEnclosingScopeNode(node: TSESTree.Node): TSESTree.Node | undefined;
|
|
7
7
|
export declare function isUsedInArrayOrAsArgument(node: TSESTree.Node): boolean;
|
|
8
|
-
export declare function getEnclosingFunction(node: TSESTree.Node): TSESTree.ArrowFunctionExpression | TSESTree.
|
|
8
|
+
export declare function getEnclosingFunction(node: TSESTree.Node): TSESTree.ArrowFunctionExpression | TSESTree.FunctionDeclarationWithOptionalName | TSESTree.FunctionExpression | undefined;
|
|
9
9
|
export declare function getTypeParentNode(node: TSESTree.Node | undefined): TSESTree.TSTypeAnnotation | TSESTree.TSAsExpression | undefined;
|
package/package.json
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"name":"@checkdigit/eslint-plugin","version":"7.11.0-PR.
|
|
1
|
+
{"name":"@checkdigit/eslint-plugin","version":"7.11.0-PR.45-5dba","description":"Check Digit eslint plugins","keywords":["eslint","eslintplugin"],"homepage":"https://github.com/checkdigit/eslint-plugin#readme","bugs":{"url":"https://github.com/checkdigit/eslint-plugin/issues"},"repository":{"type":"git","url":"https://github.com/checkdigit/eslint-plugin"},"license":"MIT","author":"Check Digit, LLC","sideEffects":false,"type":"module","exports":{".":{"types":"./dist-types/index.d.ts","import":"./dist-mjs/index.mjs","default":"./dist-mjs/index.mjs"}},"files":["src","dist-types","dist-mjs","!src/**/test/**","!src/**/*.test.ts","!src/**/*.spec.ts","!dist-types/**/test/**","!dist-types/**/*.test.d.ts","!dist-types/**/*.spec.d.ts","!dist-mjs/**/test/**","!dist-mjs/**/*.test.mjs","!dist-mjs/**/*.spec.mjs","SECURITY.md"],"scripts":{"build:dist-mjs":"rimraf dist-mjs && npx builder --type=module --sourceMap --outDir=dist-mjs && node dist-mjs/index.mjs","build:dist-types":"rimraf dist-types && npx builder --type=types --outDir=dist-types","ci:compile":"tsc --noEmit","ci:coverage":"NODE_OPTIONS=\"--disable-warning ExperimentalWarning --experimental-vm-modules\" jest --coverage=true","ci:lint":"npm run lint","ci:style":"npm run prettier","ci:test":"NODE_OPTIONS=\"--disable-warning ExperimentalWarning --experimental-vm-modules\" jest --coverage=false","lint":"eslint --max-warnings 0 .","lint:fix":"eslint --max-warnings 0 --fix .","prepare":"","prepublishOnly":"npm run build:dist-types && npm run build:dist-mjs","prettier":"prettier --ignore-path .gitignore --list-different .","prettier:fix":"prettier --ignore-path .gitignore --write .","test":"npm run ci:compile && npm run ci:test && npm run ci:lint && npm run ci:style"},"prettier":"@checkdigit/prettier-config","jest":{"preset":"@checkdigit/jest-config"},"dependencies":{"@typescript-eslint/type-utils":"^8.18.1","@typescript-eslint/utils":"^8.18.1","http-status-codes":"^2.3.0","ts-api-utils":"^2.0.0"},"devDependencies":{"@checkdigit/jest-config":"^6.0.2","@checkdigit/prettier-config":"^6.0.0","@checkdigit/typescript-config":"^9.0.0","@eslint/js":"^9.17.0","@types/eslint":"^9.6.1","@types/eslint-config-prettier":"^6.11.3","@typescript-eslint/parser":"^8.18.1","@typescript-eslint/rule-tester":"^8.18.1","eslint":"^9.17.0","eslint-config-prettier":"^9.1.0","eslint-import-resolver-typescript":"^3.7.0","eslint-plugin-eslint-plugin":"^6.3.2","eslint-plugin-import":"^2.31.0","eslint-plugin-no-only-tests":"^3.3.0","eslint-plugin-no-secrets":"^2.1.1","eslint-plugin-node":"^11.1.0","eslint-plugin-sonarjs":"1.0.4","rimraf":"^6.0.1","typescript-eslint":"^8.18.1"},"peerDependencies":{"eslint":">=9 <10"},"engines":{"node":">=22.11"}}
|
package/src/index.ts
CHANGED
|
@@ -23,9 +23,6 @@ import requireTypeOutOfTypeOnlyImports, {
|
|
|
23
23
|
ruleId as requireTypeOutOfTypeOnlyImportsRuleId,
|
|
24
24
|
} from './require-type-out-of-type-only-imports.ts';
|
|
25
25
|
import noServeRuntime, { ruleId as noServeRuntimeRuleId } from './no-serve-runtime.ts';
|
|
26
|
-
import requireServiceCallResponseDeclaration, {
|
|
27
|
-
ruleId as requireServiceCallResponseDeclarationRuleId,
|
|
28
|
-
} from './require-service-call-response-declaration.ts';
|
|
29
26
|
import filePathComment from './file-path-comment.ts';
|
|
30
27
|
import noCardNumbers from './no-card-numbers.ts';
|
|
31
28
|
import noEnum from './no-enum.ts';
|
|
@@ -38,6 +35,7 @@ import objectLiteralResponse from './object-literal-response.ts';
|
|
|
38
35
|
import regexComment from './regular-expression-comment.ts';
|
|
39
36
|
import requireAssertPredicateRejectsThrows from './require-assert-predicate-rejects-throws.ts';
|
|
40
37
|
import requireStrictAssert from './require-strict-assert.ts';
|
|
38
|
+
import requireAssertMessage from './require-assert-message';
|
|
41
39
|
import requireTsExtensionImportsExports from './require-ts-extension-imports-exports.ts';
|
|
42
40
|
|
|
43
41
|
const rules: Record<string, TSESLint.LooseRuleDefinition> = {
|
|
@@ -47,6 +45,7 @@ const rules: Record<string, TSESLint.LooseRuleDefinition> = {
|
|
|
47
45
|
'no-random-v4-uuid': noRandomV4UUID,
|
|
48
46
|
'no-status-code-assert': noStatusCodeAssert,
|
|
49
47
|
'no-uuid': noUuid,
|
|
48
|
+
'require-assert-message': requireAssertMessage,
|
|
50
49
|
'require-strict-assert': requireStrictAssert,
|
|
51
50
|
'require-ts-extension-imports-exports': requireTsExtensionImportsExports,
|
|
52
51
|
'no-test-import': noTestImport,
|
|
@@ -61,7 +60,6 @@ const rules: Record<string, TSESLint.LooseRuleDefinition> = {
|
|
|
61
60
|
[requireResolveFullResponseRuleId]: requireResolveFullResponse,
|
|
62
61
|
[noDuplicatedImportsRuleId]: noDuplicatedImports,
|
|
63
62
|
[noServeRuntimeRuleId]: noServeRuntime,
|
|
64
|
-
[requireServiceCallResponseDeclarationRuleId]: requireServiceCallResponseDeclaration,
|
|
65
63
|
[requireFixedServicesImportRuleId]: requireFixedServicesImport,
|
|
66
64
|
[requireTypeOutOfTypeOnlyImportsRuleId]: requireTypeOutOfTypeOnlyImports,
|
|
67
65
|
};
|
|
@@ -84,6 +82,7 @@ const configs: Record<string, TSESLint.FlatConfig.Config[]> = {
|
|
|
84
82
|
'@checkdigit/no-random-v4-uuid': 'error',
|
|
85
83
|
'@checkdigit/no-status-code-assert': 'error',
|
|
86
84
|
'@checkdigit/no-uuid': 'error',
|
|
85
|
+
'@checkdigit/require-assert-message': 'error',
|
|
87
86
|
'@checkdigit/require-strict-assert': 'error',
|
|
88
87
|
'@checkdigit/require-ts-extension-imports-exports': 'error',
|
|
89
88
|
'@checkdigit/no-wallaby-comment': 'error',
|
|
@@ -103,7 +102,6 @@ const configs: Record<string, TSESLint.FlatConfig.Config[]> = {
|
|
|
103
102
|
[`@checkdigit/${requireFixedServicesImportRuleId}`]: 'error',
|
|
104
103
|
[`@checkdigit/${requireTypeOutOfTypeOnlyImportsRuleId}`]: 'error',
|
|
105
104
|
[`@checkdigit/${noServeRuntimeRuleId}`]: 'error',
|
|
106
|
-
[`@checkdigit/${requireServiceCallResponseDeclarationRuleId}`]: 'error',
|
|
107
105
|
},
|
|
108
106
|
},
|
|
109
107
|
],
|
|
@@ -120,6 +118,7 @@ const configs: Record<string, TSESLint.FlatConfig.Config[]> = {
|
|
|
120
118
|
'@checkdigit/no-random-v4-uuid': 'error',
|
|
121
119
|
'@checkdigit/no-status-code-assert': 'error',
|
|
122
120
|
'@checkdigit/no-uuid': 'error',
|
|
121
|
+
'@checkdigit/require-assert-message': 'error',
|
|
123
122
|
'@checkdigit/require-strict-assert': 'error',
|
|
124
123
|
'@checkdigit/require-ts-extension-imports-exports': 'error',
|
|
125
124
|
'@checkdigit/no-wallaby-comment': 'off',
|
|
@@ -136,7 +135,6 @@ const configs: Record<string, TSESLint.FlatConfig.Config[]> = {
|
|
|
136
135
|
[`@checkdigit/${requireFixedServicesImportRuleId}`]: 'off',
|
|
137
136
|
[`@checkdigit/${requireTypeOutOfTypeOnlyImportsRuleId}`]: 'error',
|
|
138
137
|
[`@checkdigit/${noServeRuntimeRuleId}`]: 'off',
|
|
139
|
-
[`@checkdigit/${requireServiceCallResponseDeclarationRuleId}`]: 'off',
|
|
140
138
|
},
|
|
141
139
|
},
|
|
142
140
|
],
|
package/src/library/ts-tree.ts
CHANGED
|
@@ -75,7 +75,11 @@ export function isUsedInArrayOrAsArgument(node: TSESTree.Node): boolean {
|
|
|
75
75
|
|
|
76
76
|
export function getEnclosingFunction(
|
|
77
77
|
node: TSESTree.Node,
|
|
78
|
-
):
|
|
78
|
+
):
|
|
79
|
+
| TSESTree.ArrowFunctionExpression
|
|
80
|
+
| TSESTree.FunctionDeclarationWithOptionalName
|
|
81
|
+
| TSESTree.FunctionExpression
|
|
82
|
+
| undefined {
|
|
79
83
|
if (
|
|
80
84
|
node.type === AST_NODE_TYPES.FunctionDeclaration ||
|
|
81
85
|
node.type === AST_NODE_TYPES.FunctionExpression ||
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
// require-assert-message.ts
|
|
2
|
+
|
|
3
|
+
/*
|
|
4
|
+
* Copyright (c) 2022-2025 Check Digit, LLC
|
|
5
|
+
*
|
|
6
|
+
* This code is licensed under the MIT license (see LICENSE.txt for details).
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
import { strict as assert } from 'node:assert';
|
|
10
|
+
import { ESLintUtils, TSESLint } from '@typescript-eslint/utils';
|
|
11
|
+
import { TSESTree } from '@typescript-eslint/types';
|
|
12
|
+
import getDocumentationUrl from './get-documentation-url.ts';
|
|
13
|
+
|
|
14
|
+
export const ruleId = 'require-assert-message';
|
|
15
|
+
const MISSING_ASSERT_MESSAGE = 'MISSING_ASSERT_MESSAGE';
|
|
16
|
+
|
|
17
|
+
const methodsRequiringMessage = Object.keys(assert).filter((key) => typeof (assert as never)[key] === 'function');
|
|
18
|
+
|
|
19
|
+
const createRule = ESLintUtils.RuleCreator((name) => getDocumentationUrl(name));
|
|
20
|
+
const rule: TSESLint.RuleModule<string, unknown[]> = createRule({
|
|
21
|
+
name: ruleId,
|
|
22
|
+
meta: {
|
|
23
|
+
type: 'problem',
|
|
24
|
+
docs: {
|
|
25
|
+
description: 'Validate that message argument is always supplied to node:assert methods',
|
|
26
|
+
},
|
|
27
|
+
schema: [],
|
|
28
|
+
messages: {
|
|
29
|
+
[MISSING_ASSERT_MESSAGE]: 'Missing message argument in {{methodName}}() method.',
|
|
30
|
+
},
|
|
31
|
+
},
|
|
32
|
+
defaultOptions: [],
|
|
33
|
+
create(context) {
|
|
34
|
+
let assertAlias = 'assert';
|
|
35
|
+
|
|
36
|
+
return {
|
|
37
|
+
ImportDeclaration(node: TSESTree.ImportDeclaration) {
|
|
38
|
+
if (node.source.value === 'node:assert') {
|
|
39
|
+
const specifier = node.specifiers.find(
|
|
40
|
+
(importSpecifier) =>
|
|
41
|
+
importSpecifier.type === TSESTree.AST_NODE_TYPES.ImportDefaultSpecifier ||
|
|
42
|
+
importSpecifier.type === TSESTree.AST_NODE_TYPES.ImportSpecifier,
|
|
43
|
+
);
|
|
44
|
+
if (specifier) {
|
|
45
|
+
assertAlias = specifier.local.name;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
},
|
|
49
|
+
CallExpression(node: TSESTree.CallExpression) {
|
|
50
|
+
const callee = node.callee;
|
|
51
|
+
if (
|
|
52
|
+
callee.type === TSESTree.AST_NODE_TYPES.MemberExpression &&
|
|
53
|
+
callee.object.type === TSESTree.AST_NODE_TYPES.Identifier &&
|
|
54
|
+
callee.property.type === TSESTree.AST_NODE_TYPES.Identifier
|
|
55
|
+
) {
|
|
56
|
+
const objectName = callee.object.name;
|
|
57
|
+
const methodName = callee.property.name;
|
|
58
|
+
|
|
59
|
+
if (objectName === assertAlias && methodsRequiringMessage.includes(methodName)) {
|
|
60
|
+
const messageIndexMap: Record<string, number> = {
|
|
61
|
+
fail: 0,
|
|
62
|
+
ok: 1,
|
|
63
|
+
};
|
|
64
|
+
const messageIndex = messageIndexMap[methodName] ?? 2;
|
|
65
|
+
|
|
66
|
+
if (node.arguments.length <= messageIndex) {
|
|
67
|
+
context.report({
|
|
68
|
+
node,
|
|
69
|
+
messageId: MISSING_ASSERT_MESSAGE,
|
|
70
|
+
data: {
|
|
71
|
+
methodName,
|
|
72
|
+
},
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
} else if (
|
|
77
|
+
callee.type === TSESTree.AST_NODE_TYPES.Identifier &&
|
|
78
|
+
callee.name === assertAlias &&
|
|
79
|
+
node.arguments.length < 2
|
|
80
|
+
) {
|
|
81
|
+
context.report({
|
|
82
|
+
node,
|
|
83
|
+
messageId: MISSING_ASSERT_MESSAGE,
|
|
84
|
+
data: {
|
|
85
|
+
methodName: 'assert',
|
|
86
|
+
},
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
},
|
|
90
|
+
};
|
|
91
|
+
},
|
|
92
|
+
});
|
|
93
|
+
|
|
94
|
+
export default rule;
|
|
@@ -1,57 +0,0 @@
|
|
|
1
|
-
// src/require-service-call-response-declaration.ts
|
|
2
|
-
import { AST_NODE_TYPES, ESLintUtils } from "@typescript-eslint/utils";
|
|
3
|
-
import getDocumentationUrl from "./get-documentation-url.mjs";
|
|
4
|
-
import { isServiceResponse } from "./service.mjs";
|
|
5
|
-
var ruleId = "require-service-call-response-declaration";
|
|
6
|
-
var createRule = ESLintUtils.RuleCreator((name) => getDocumentationUrl(name));
|
|
7
|
-
var rule = createRule({
|
|
8
|
-
name: ruleId,
|
|
9
|
-
meta: {
|
|
10
|
-
type: "suggestion",
|
|
11
|
-
docs: {
|
|
12
|
-
description: "Awaited service call is required to declare variable for its return value which should be examined later on."
|
|
13
|
-
},
|
|
14
|
-
messages: {
|
|
15
|
-
requireServiceCallResponseDeclaration: "Awaited service call is required to declare variable for its return value which should be examined later on.",
|
|
16
|
-
unknownError: 'Unknown error occurred in file "{{fileName}}": {{ error }}.'
|
|
17
|
-
},
|
|
18
|
-
fixable: "code",
|
|
19
|
-
schema: []
|
|
20
|
-
},
|
|
21
|
-
defaultOptions: [],
|
|
22
|
-
create(context) {
|
|
23
|
-
const parserServices = ESLintUtils.getParserServices(context);
|
|
24
|
-
const typeChecker = parserServices.program.getTypeChecker();
|
|
25
|
-
return {
|
|
26
|
-
AwaitExpression(serviceCall) {
|
|
27
|
-
try {
|
|
28
|
-
const tsNode = parserServices.esTreeNodeToTSNodeMap.get(serviceCall.argument);
|
|
29
|
-
const type = typeChecker.getTypeAtLocation(tsNode);
|
|
30
|
-
const awaitedType = typeChecker.getAwaitedType(type);
|
|
31
|
-
if (awaitedType !== void 0 && isServiceResponse(awaitedType) && serviceCall.parent.type !== AST_NODE_TYPES.VariableDeclarator) {
|
|
32
|
-
context.report({
|
|
33
|
-
node: serviceCall,
|
|
34
|
-
messageId: "requireServiceCallResponseDeclaration"
|
|
35
|
-
});
|
|
36
|
-
}
|
|
37
|
-
} catch (error) {
|
|
38
|
-
console.error(`Failed to apply ${ruleId} rule for file "${context.filename}":`, error);
|
|
39
|
-
context.report({
|
|
40
|
-
node: serviceCall,
|
|
41
|
-
messageId: "unknownError",
|
|
42
|
-
data: {
|
|
43
|
-
fileName: context.filename,
|
|
44
|
-
error: error instanceof Error ? error.toString() : JSON.stringify(error)
|
|
45
|
-
}
|
|
46
|
-
});
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
};
|
|
50
|
-
}
|
|
51
|
-
});
|
|
52
|
-
var require_service_call_response_declaration_default = rule;
|
|
53
|
-
export {
|
|
54
|
-
require_service_call_response_declaration_default as default,
|
|
55
|
-
ruleId
|
|
56
|
-
};
|
|
57
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL3JlcXVpcmUtc2VydmljZS1jYWxsLXJlc3BvbnNlLWRlY2xhcmF0aW9uLnRzIl0sCiAgIm1hcHBpbmdzIjogIjtBQVFBLFNBQVMsZ0JBQWdCLG1CQUE2QjtBQUV0RCxPQUFPLHlCQUF5QjtBQUNoQyxTQUFTLHlCQUF5QjtBQUUzQixJQUFNLFNBQVM7QUFFdEIsSUFBTSxhQUFhLFlBQVksWUFBWSxDQUFDLFNBQVMsb0JBQW9CLElBQUksQ0FBQztBQUU5RSxJQUFNLE9BQXlGLFdBQVc7QUFBQSxFQUN4RyxNQUFNO0FBQUEsRUFDTixNQUFNO0FBQUEsSUFDSixNQUFNO0FBQUEsSUFDTixNQUFNO0FBQUEsTUFDSixhQUNFO0FBQUEsSUFDSjtBQUFBLElBQ0EsVUFBVTtBQUFBLE1BQ1IsdUNBQ0U7QUFBQSxNQUNGLGNBQWM7QUFBQSxJQUNoQjtBQUFBLElBQ0EsU0FBUztBQUFBLElBQ1QsUUFBUSxDQUFDO0FBQUEsRUFDWDtBQUFBLEVBQ0EsZ0JBQWdCLENBQUM7QUFBQSxFQUNqQixPQUFPLFNBQVM7QUFDZCxVQUFNLGlCQUFpQixZQUFZLGtCQUFrQixPQUFPO0FBQzVELFVBQU0sY0FBYyxlQUFlLFFBQVEsZUFBZTtBQUUxRCxXQUFPO0FBQUEsTUFDTCxnQkFBZ0IsYUFBdUM7QUFDckQsWUFBSTtBQUNGLGdCQUFNLFNBQVMsZUFBZSxzQkFBc0IsSUFBSSxZQUFZLFFBQVE7QUFDNUUsZ0JBQU0sT0FBTyxZQUFZLGtCQUFrQixNQUFNO0FBQ2pELGdCQUFNLGNBQWMsWUFBWSxlQUFlLElBQUk7QUFDbkQsY0FDRSxnQkFBZ0IsVUFDaEIsa0JBQWtCLFdBQVcsS0FDN0IsWUFBWSxPQUFPLFNBQVMsZUFBZSxvQkFDM0M7QUFDQSxvQkFBUSxPQUFPO0FBQUEsY0FDYixNQUFNO0FBQUEsY0FDTixXQUFXO0FBQUEsWUFDYixDQUFDO0FBQUEsVUFDSDtBQUFBLFFBQ0YsU0FBUyxPQUFPO0FBRWQsa0JBQVEsTUFBTSxtQkFBbUIsTUFBTSxtQkFBbUIsUUFBUSxRQUFRLE1BQU0sS0FBSztBQUNyRixrQkFBUSxPQUFPO0FBQUEsWUFDYixNQUFNO0FBQUEsWUFDTixXQUFXO0FBQUEsWUFDWCxNQUFNO0FBQUEsY0FDSixVQUFVLFFBQVE7QUFBQSxjQUNsQixPQUFPLGlCQUFpQixRQUFRLE1BQU0sU0FBUyxJQUFJLEtBQUssVUFBVSxLQUFLO0FBQUEsWUFDekU7QUFBQSxVQUNGLENBQUM7QUFBQSxRQUNIO0FBQUEsTUFDRjtBQUFBLElBQ0Y7QUFBQSxFQUNGO0FBQ0YsQ0FBQztBQUVELElBQU8sb0RBQVE7IiwKICAibmFtZXMiOiBbXQp9Cg==
|
package/dist-mjs/service.mjs
DELETED
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
// src/service.ts
|
|
2
|
-
import "typescript";
|
|
3
|
-
function isServiceResponse(type) {
|
|
4
|
-
return type.getProperties().some((symbol) => symbol.name === "status") && type.getProperties().some((symbol) => symbol.name === "headers") && type.getProperties().some((symbol) => symbol.name === "body");
|
|
5
|
-
}
|
|
6
|
-
export {
|
|
7
|
-
isServiceResponse
|
|
8
|
-
};
|
|
9
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL3NlcnZpY2UudHMiXSwKICAibWFwcGluZ3MiOiAiO0FBRUEsT0FBZTtBQUVSLFNBQVMsa0JBQWtCLE1BQXdCO0FBQ3hELFNBQ0UsS0FBSyxjQUFjLEVBQUUsS0FBSyxDQUFDLFdBQVcsT0FBTyxTQUFTLFFBQVEsS0FDOUQsS0FBSyxjQUFjLEVBQUUsS0FBSyxDQUFDLFdBQVcsT0FBTyxTQUFTLFNBQVMsS0FDL0QsS0FBSyxjQUFjLEVBQUUsS0FBSyxDQUFDLFdBQVcsT0FBTyxTQUFTLE1BQU07QUFFaEU7IiwKICAibmFtZXMiOiBbXQp9Cg==
|
package/dist-types/service.d.ts
DELETED
|
@@ -1,72 +0,0 @@
|
|
|
1
|
-
// require-service-call-response-declaration.ts
|
|
2
|
-
|
|
3
|
-
/*
|
|
4
|
-
* Copyright (c) 2021-2024 Check Digit, LLC
|
|
5
|
-
*
|
|
6
|
-
* This code is licensed under the MIT license (see LICENSE.txt for details).
|
|
7
|
-
*/
|
|
8
|
-
|
|
9
|
-
import { AST_NODE_TYPES, ESLintUtils, TSESTree } from '@typescript-eslint/utils';
|
|
10
|
-
|
|
11
|
-
import getDocumentationUrl from './get-documentation-url';
|
|
12
|
-
import { isServiceResponse } from './service';
|
|
13
|
-
|
|
14
|
-
export const ruleId = 'require-service-call-response-declaration';
|
|
15
|
-
|
|
16
|
-
const createRule = ESLintUtils.RuleCreator((name) => getDocumentationUrl(name));
|
|
17
|
-
|
|
18
|
-
const rule: ESLintUtils.RuleModule<'unknownError' | 'requireServiceCallResponseDeclaration'> = createRule({
|
|
19
|
-
name: ruleId,
|
|
20
|
-
meta: {
|
|
21
|
-
type: 'suggestion',
|
|
22
|
-
docs: {
|
|
23
|
-
description:
|
|
24
|
-
'Awaited service call is required to declare variable for its return value which should be examined later on.',
|
|
25
|
-
},
|
|
26
|
-
messages: {
|
|
27
|
-
requireServiceCallResponseDeclaration:
|
|
28
|
-
'Awaited service call is required to declare variable for its return value which should be examined later on.',
|
|
29
|
-
unknownError: 'Unknown error occurred in file "{{fileName}}": {{ error }}.',
|
|
30
|
-
},
|
|
31
|
-
fixable: 'code',
|
|
32
|
-
schema: [],
|
|
33
|
-
},
|
|
34
|
-
defaultOptions: [],
|
|
35
|
-
create(context) {
|
|
36
|
-
const parserServices = ESLintUtils.getParserServices(context);
|
|
37
|
-
const typeChecker = parserServices.program.getTypeChecker();
|
|
38
|
-
|
|
39
|
-
return {
|
|
40
|
-
AwaitExpression(serviceCall: TSESTree.AwaitExpression) {
|
|
41
|
-
try {
|
|
42
|
-
const tsNode = parserServices.esTreeNodeToTSNodeMap.get(serviceCall.argument);
|
|
43
|
-
const type = typeChecker.getTypeAtLocation(tsNode);
|
|
44
|
-
const awaitedType = typeChecker.getAwaitedType(type);
|
|
45
|
-
if (
|
|
46
|
-
awaitedType !== undefined &&
|
|
47
|
-
isServiceResponse(awaitedType) &&
|
|
48
|
-
serviceCall.parent.type !== AST_NODE_TYPES.VariableDeclarator
|
|
49
|
-
) {
|
|
50
|
-
context.report({
|
|
51
|
-
node: serviceCall,
|
|
52
|
-
messageId: 'requireServiceCallResponseDeclaration',
|
|
53
|
-
});
|
|
54
|
-
}
|
|
55
|
-
} catch (error) {
|
|
56
|
-
// eslint-disable-next-line no-console
|
|
57
|
-
console.error(`Failed to apply ${ruleId} rule for file "${context.filename}":`, error);
|
|
58
|
-
context.report({
|
|
59
|
-
node: serviceCall,
|
|
60
|
-
messageId: 'unknownError',
|
|
61
|
-
data: {
|
|
62
|
-
fileName: context.filename,
|
|
63
|
-
error: error instanceof Error ? error.toString() : JSON.stringify(error),
|
|
64
|
-
},
|
|
65
|
-
});
|
|
66
|
-
}
|
|
67
|
-
},
|
|
68
|
-
};
|
|
69
|
-
},
|
|
70
|
-
});
|
|
71
|
-
|
|
72
|
-
export default rule;
|
package/src/service.ts
DELETED
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
// service.ts
|
|
2
|
-
|
|
3
|
-
import ts from 'typescript';
|
|
4
|
-
|
|
5
|
-
export function isServiceResponse(type: ts.Type): boolean {
|
|
6
|
-
return (
|
|
7
|
-
type.getProperties().some((symbol) => symbol.name === 'status') &&
|
|
8
|
-
type.getProperties().some((symbol) => symbol.name === 'headers') &&
|
|
9
|
-
type.getProperties().some((symbol) => symbol.name === 'body')
|
|
10
|
-
);
|
|
11
|
-
}
|