@checkdigit/eslint-plugin 7.15.0-PR.117-a0b1 → 7.15.0-PR.134-b6cb
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 +10 -8
- package/dist-mjs/is-aws-sdk-v3-used.mjs +17 -0
- package/dist-mjs/require-aws-config.mjs +53 -0
- package/dist-types/index.d.ts +1 -0
- package/dist-types/is-aws-sdk-v3-used.d.ts +1 -0
- package/dist-types/require-aws-config.d.ts +5 -0
- package/package.json +1 -1
- package/src/index.ts +5 -4
- package/src/is-aws-sdk-v3-used.ts +25 -0
- package/src/require-aws-config.ts +60 -0
- package/dist-mjs/no-type-assertion-as.mjs +0 -46
- package/dist-types/no-type-assertion-as.d.ts +0 -5
- package/src/no-type-assertion-as.ts +0 -57
package/dist-mjs/index.mjs
CHANGED
|
@@ -17,13 +17,13 @@ import noServeRuntime, { ruleId as noServeRuntimeRuleId } from "./no-serve-runti
|
|
|
17
17
|
import requireServiceCallResponseDeclaration, {
|
|
18
18
|
ruleId as requireServiceCallResponseDeclarationRuleId
|
|
19
19
|
} from "./require-service-call-response-declaration.mjs";
|
|
20
|
+
import requireAwsConfig, { ruleId as requireAwsConfigRuleId } from "./require-aws-config.mjs";
|
|
20
21
|
import filePathComment from "./file-path-comment.mjs";
|
|
21
22
|
import noCardNumbers from "./no-card-numbers.mjs";
|
|
22
23
|
import noEnum from "./no-enum.mjs";
|
|
23
24
|
import noSideEffects from "./no-side-effects.mjs";
|
|
24
25
|
import noRandomV4UUID from "./no-random-v4-uuid.mjs";
|
|
25
26
|
import noTestImport from "./no-test-import.mjs";
|
|
26
|
-
import noTypeAssertionAs from "./no-type-assertion-as.mjs";
|
|
27
27
|
import noUtil from "./no-util.mjs";
|
|
28
28
|
import noUuid from "./no-uuid.mjs";
|
|
29
29
|
import noWallabyComment from "./no-wallaby-comment.mjs";
|
|
@@ -33,6 +33,7 @@ import requireAssertPredicateRejectsThrows from "./require-assert-predicate-reje
|
|
|
33
33
|
import requireStrictAssert from "./require-strict-assert.mjs";
|
|
34
34
|
import requireAssertMessage from "./require-assert-message.mjs";
|
|
35
35
|
import requireTsExtensionImportsExports from "./require-ts-extension-imports-exports.mjs";
|
|
36
|
+
import { default as default2 } from "./is-aws-sdk-v3-used.mjs";
|
|
36
37
|
var rules = {
|
|
37
38
|
"file-path-comment": filePathComment,
|
|
38
39
|
"no-card-numbers": noCardNumbers,
|
|
@@ -47,7 +48,6 @@ var rules = {
|
|
|
47
48
|
"no-test-import": noTestImport,
|
|
48
49
|
"no-wallaby-comment": noWallabyComment,
|
|
49
50
|
"no-side-effects": noSideEffects,
|
|
50
|
-
"no-type-assertion-as": noTypeAssertionAs,
|
|
51
51
|
"regular-expression-comment": regexComment,
|
|
52
52
|
"require-assert-predicate-rejects-throws": requireAssertPredicateRejectsThrows,
|
|
53
53
|
"object-literal-response": objectLiteralResponse,
|
|
@@ -58,6 +58,7 @@ var rules = {
|
|
|
58
58
|
[noDuplicatedImportsRuleId]: noDuplicatedImports,
|
|
59
59
|
[noServeRuntimeRuleId]: noServeRuntime,
|
|
60
60
|
[requireServiceCallResponseDeclarationRuleId]: requireServiceCallResponseDeclaration,
|
|
61
|
+
[requireAwsConfigRuleId]: requireAwsConfig,
|
|
61
62
|
[requireFixedServicesImportRuleId]: requireFixedServicesImport,
|
|
62
63
|
[requireTypeOutOfTypeOnlyImportsRuleId]: requireTypeOutOfTypeOnlyImports
|
|
63
64
|
};
|
|
@@ -84,7 +85,6 @@ var configs = {
|
|
|
84
85
|
"@checkdigit/require-ts-extension-imports-exports": "error",
|
|
85
86
|
"@checkdigit/no-wallaby-comment": "error",
|
|
86
87
|
"@checkdigit/no-side-effects": "error",
|
|
87
|
-
"@checkdigit/no-type-assertion-as": "error",
|
|
88
88
|
"@checkdigit/regular-expression-comment": "error",
|
|
89
89
|
"@checkdigit/require-assert-predicate-rejects-throws": "error",
|
|
90
90
|
"@checkdigit/object-literal-response": "error",
|
|
@@ -97,7 +97,8 @@ var configs = {
|
|
|
97
97
|
[`@checkdigit/${requireFixedServicesImportRuleId}`]: "error",
|
|
98
98
|
[`@checkdigit/${requireTypeOutOfTypeOnlyImportsRuleId}`]: "error",
|
|
99
99
|
[`@checkdigit/${noServeRuntimeRuleId}`]: "error",
|
|
100
|
-
[`@checkdigit/${requireServiceCallResponseDeclarationRuleId}`]: "error"
|
|
100
|
+
[`@checkdigit/${requireServiceCallResponseDeclarationRuleId}`]: "error",
|
|
101
|
+
[`@checkdigit/${requireAwsConfigRuleId}`]: "error"
|
|
101
102
|
}
|
|
102
103
|
}
|
|
103
104
|
],
|
|
@@ -120,7 +121,6 @@ var configs = {
|
|
|
120
121
|
"@checkdigit/require-ts-extension-imports-exports": "error",
|
|
121
122
|
"@checkdigit/no-wallaby-comment": "off",
|
|
122
123
|
"@checkdigit/no-side-effects": "error",
|
|
123
|
-
"@checkdigit/no-type-assertion-as": "error",
|
|
124
124
|
"@checkdigit/regular-expression-comment": "error",
|
|
125
125
|
"@checkdigit/require-assert-predicate-rejects-throws": "error",
|
|
126
126
|
"@checkdigit/object-literal-response": "error",
|
|
@@ -133,7 +133,8 @@ var configs = {
|
|
|
133
133
|
[`@checkdigit/${requireFixedServicesImportRuleId}`]: "off",
|
|
134
134
|
[`@checkdigit/${requireTypeOutOfTypeOnlyImportsRuleId}`]: "error",
|
|
135
135
|
[`@checkdigit/${noServeRuntimeRuleId}`]: "off",
|
|
136
|
-
[`@checkdigit/${requireServiceCallResponseDeclarationRuleId}`]: "off"
|
|
136
|
+
[`@checkdigit/${requireServiceCallResponseDeclarationRuleId}`]: "off",
|
|
137
|
+
[`@checkdigit/${requireAwsConfigRuleId}`]: "off"
|
|
137
138
|
}
|
|
138
139
|
}
|
|
139
140
|
]
|
|
@@ -144,6 +145,7 @@ var defaultToExport = {
|
|
|
144
145
|
};
|
|
145
146
|
var index_default = defaultToExport;
|
|
146
147
|
export {
|
|
147
|
-
index_default as default
|
|
148
|
+
index_default as default,
|
|
149
|
+
default2 as isAwsSdkV3Used
|
|
148
150
|
};
|
|
149
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
151
|
+
//# sourceMappingURL=data:application/json;base64,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UUFDbEQsQ0FBQyxlQUFlLDJCQUEyQixFQUFFLEdBQUc7QUFBQSxRQUNoRCxDQUFDLGVBQWUsZ0NBQWdDLEVBQUUsR0FBRztBQUFBLFFBQ3JELENBQUMsZUFBZSx5QkFBeUIsRUFBRSxHQUFHO0FBQUEsUUFDOUMsQ0FBQyxlQUFlLGdDQUFnQyxFQUFFLEdBQUc7QUFBQSxRQUNyRCxDQUFDLGVBQWUscUNBQXFDLEVBQUUsR0FBRztBQUFBLFFBQzFELENBQUMsZUFBZSxvQkFBb0IsRUFBRSxHQUFHO0FBQUEsUUFDekMsQ0FBQyxlQUFlLDJDQUEyQyxFQUFFLEdBQUc7QUFBQSxRQUNoRSxDQUFDLGVBQWUsc0JBQXNCLEVBQUUsR0FBRztBQUFBLE1BQzdDO0FBQUEsSUFDRjtBQUFBLEVBQ0Y7QUFBQSxFQUNBLGFBQWE7QUFBQSxJQUNYO0FBQUEsTUFDRSxPQUFPLENBQUMsU0FBUztBQUFBLE1BQ2pCLFNBQVM7QUFBQSxRQUNQLGVBQWU7QUFBQSxNQUNqQjtBQUFBLE1BQ0EsT0FBTztBQUFBLFFBQ0wsK0JBQStCO0FBQUEsUUFDL0IsdUJBQXVCO0FBQUEsUUFDdkIsaUNBQWlDO0FBQUEsUUFDakMsaUNBQWlDO0FBQUEsUUFDakMscUNBQXFDO0FBQUEsUUFDckMsdUJBQXVCO0FBQUEsUUFDdkIsdUJBQXVCO0FBQUEsUUFDdkIsc0NBQXNDO0FBQUEsUUFDdEMscUNBQXFDO0FBQUEsUUFDckMsb0RBQW9EO0FBQUEsUUFDcEQsa0NBQWtDO0FBQUEsUUFDbEMsK0JBQStCO0FBQUEsUUFDL0IsMENBQTBDO0FBQUEsUUFDMUMsdURBQXVEO0FBQUEsUUFDdkQsdUNBQXVDO0FBQUEsUUFDdkMsOEJBQThCO0FBQUEsUUFDOUIsQ0FBQyxlQUFlLDBCQUEwQixFQUFFLEdBQUc7QUFBQSxRQUMvQyxDQUFDLGVBQWUsNkJBQTZCLEVBQUUsR0FBRztBQUFBLFFBQ2xELENBQUMsZUFBZSwyQkFBMkIsRUFBRSxHQUFHO0FBQUEsUUFDaEQsQ0FBQyxlQUFlLGdDQUFnQyxFQUFFLEdBQUc7QUFBQSxRQUNyRCxDQUFDLGVBQWUseUJBQXlCLEVBQUUsR0FBRztBQUFBLFFBQzlDLENBQUMsZUFBZSxnQ0FBZ0MsRUFBRSxHQUFHO0FBQUEsUUFDckQsQ0FBQyxlQUFlLHFDQUFxQyxFQUFFLEdBQUc7QUFBQSxRQUMxRCxDQUFDLGVBQWUsb0JBQW9CLEVBQUUsR0FBRztBQUFBLFFBQ3pDLENBQUMsZUFBZSwyQ0FBMkMsRUFBRSxHQUFHO0FBQUEsUUFDaEUsQ0FBQyxlQUFlLHNCQUFzQixFQUFFLEdBQUc7QUFBQSxNQUM3QztBQUFBLElBQ0Y7QUFBQSxFQUNGO0FBQ0Y7QUFFQSxJQUFNLGtCQUVGO0FBQUEsRUFDRixHQUFHO0FBQUEsRUFDSDtBQUNGO0FBQ0EsSUFBTyxnQkFBUTsiLAogICJuYW1lcyI6IFsiZGVmYXVsdCJdCn0K
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
// src/is-aws-sdk-v3-used.ts
|
|
2
|
+
import { promises as fs } from "node:fs";
|
|
3
|
+
async function isAwsSdkV3Used() {
|
|
4
|
+
const isService = process.env["SERVICE_NAME"] !== void 0;
|
|
5
|
+
if (!isService) {
|
|
6
|
+
return false;
|
|
7
|
+
}
|
|
8
|
+
const packageJson = JSON.parse(await fs.readFile("package.json", "utf-8"));
|
|
9
|
+
const dependencies = packageJson.dependencies ?? {};
|
|
10
|
+
const hasAwsSdkV3Dependency = Object.keys(dependencies).some((dependency) => dependency.startsWith("@aws-sdk/"));
|
|
11
|
+
const isAwsSdkV2Used = Object.keys(dependencies).some((dependency) => dependency === "@checkdigit/aws") || packageJson.service?.awsSdkV2 === true;
|
|
12
|
+
return !isAwsSdkV2Used && hasAwsSdkV3Dependency;
|
|
13
|
+
}
|
|
14
|
+
export {
|
|
15
|
+
isAwsSdkV3Used as default
|
|
16
|
+
};
|
|
17
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL2lzLWF3cy1zZGstdjMtdXNlZC50cyJdLAogICJtYXBwaW5ncyI6ICI7QUFFQSxTQUFTLFlBQVksVUFBVTtBQUUvQixlQUFPLGlCQUEwRDtBQUMvRCxRQUFNLFlBQVksUUFBUSxJQUFJLGNBQWMsTUFBTTtBQUNsRCxNQUFJLENBQUMsV0FBVztBQUNkLFdBQU87QUFBQSxFQUNUO0FBRUEsUUFBTSxjQUFjLEtBQUssTUFBTSxNQUFNLEdBQUcsU0FBUyxnQkFBZ0IsT0FBTyxDQUFDO0FBTXpFLFFBQU0sZUFBZSxZQUFZLGdCQUFnQixDQUFDO0FBRWxELFFBQU0sd0JBQXdCLE9BQU8sS0FBSyxZQUFZLEVBQUUsS0FBSyxDQUFDLGVBQWUsV0FBVyxXQUFXLFdBQVcsQ0FBQztBQUMvRyxRQUFNLGlCQUNKLE9BQU8sS0FBSyxZQUFZLEVBQUUsS0FBSyxDQUFDLGVBQWUsZUFBZSxpQkFBaUIsS0FDL0UsWUFBWSxTQUFTLGFBQWE7QUFFcEMsU0FBTyxDQUFDLGtCQUFrQjtBQUM1QjsiLAogICJuYW1lcyI6IFtdCn0K
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
// src/require-aws-config.ts
|
|
2
|
+
import { AST_NODE_TYPES, ESLintUtils } from "@typescript-eslint/utils";
|
|
3
|
+
import getDocumentationUrl from "./get-documentation-url.mjs";
|
|
4
|
+
var ruleId = "require-aws-config";
|
|
5
|
+
var MESSAGE_ID_REQUIRE_AWS_CONFIG = "requireAwsConfig";
|
|
6
|
+
var createRule = ESLintUtils.RuleCreator((name) => getDocumentationUrl(name));
|
|
7
|
+
var rule = createRule({
|
|
8
|
+
name: ruleId,
|
|
9
|
+
meta: {
|
|
10
|
+
type: "problem",
|
|
11
|
+
docs: {
|
|
12
|
+
description: "Require to apply @checkdigit/aws-config along with qualifier instead of using aws client directly."
|
|
13
|
+
},
|
|
14
|
+
messages: {
|
|
15
|
+
[MESSAGE_ID_REQUIRE_AWS_CONFIG]: "Please apply @checkdigit/aws-config along with qualifier instead of using aws client {{awsClientName}} directly."
|
|
16
|
+
},
|
|
17
|
+
schema: []
|
|
18
|
+
},
|
|
19
|
+
defaultOptions: [],
|
|
20
|
+
create(context) {
|
|
21
|
+
const { isAwsSdkV3Used } = context.settings;
|
|
22
|
+
if (isAwsSdkV3Used !== true) {
|
|
23
|
+
return {};
|
|
24
|
+
}
|
|
25
|
+
return {
|
|
26
|
+
NewExpression(node) {
|
|
27
|
+
if (node.callee.type === AST_NODE_TYPES.Identifier && node.callee.name.endsWith("Client")) {
|
|
28
|
+
context.report({
|
|
29
|
+
node,
|
|
30
|
+
messageId: MESSAGE_ID_REQUIRE_AWS_CONFIG,
|
|
31
|
+
data: { awsClientName: node.callee.name }
|
|
32
|
+
});
|
|
33
|
+
} else if (node.callee.type === AST_NODE_TYPES.MemberExpression) {
|
|
34
|
+
const property = node.callee.property;
|
|
35
|
+
if (property.type === AST_NODE_TYPES.Identifier && property.name.endsWith("Client")) {
|
|
36
|
+
context.report({
|
|
37
|
+
node,
|
|
38
|
+
messageId: MESSAGE_ID_REQUIRE_AWS_CONFIG,
|
|
39
|
+
data: { awsClientName: property.name }
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
});
|
|
47
|
+
var require_aws_config_default = rule;
|
|
48
|
+
export {
|
|
49
|
+
MESSAGE_ID_REQUIRE_AWS_CONFIG,
|
|
50
|
+
require_aws_config_default as default,
|
|
51
|
+
ruleId
|
|
52
|
+
};
|
|
53
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL3JlcXVpcmUtYXdzLWNvbmZpZy50cyJdLAogICJtYXBwaW5ncyI6ICI7QUFRQSxTQUFTLGdCQUFnQixtQkFBbUI7QUFDNUMsT0FBTyx5QkFBeUI7QUFFekIsSUFBTSxTQUFTO0FBQ2YsSUFBTSxnQ0FBZ0M7QUFDN0MsSUFBTSxhQUFhLFlBQVksWUFBWSxDQUFDLFNBQVMsb0JBQW9CLElBQUksQ0FBQztBQUU5RSxJQUFNLE9BQXFFLFdBQVc7QUFBQSxFQUNwRixNQUFNO0FBQUEsRUFDTixNQUFNO0FBQUEsSUFDSixNQUFNO0FBQUEsSUFDTixNQUFNO0FBQUEsTUFDSixhQUFhO0FBQUEsSUFDZjtBQUFBLElBQ0EsVUFBVTtBQUFBLE1BQ1IsQ0FBQyw2QkFBNkIsR0FDNUI7QUFBQSxJQUNKO0FBQUEsSUFDQSxRQUFRLENBQUM7QUFBQSxFQUNYO0FBQUEsRUFDQSxnQkFBZ0IsQ0FBQztBQUFBLEVBQ2pCLE9BQU8sU0FBUztBQUNkLFVBQU0sRUFBRSxlQUFlLElBQUksUUFBUTtBQUNuQyxRQUFJLG1CQUFtQixNQUFNO0FBQzNCLGFBQU8sQ0FBQztBQUFBLElBQ1Y7QUFFQSxXQUFPO0FBQUEsTUFDTCxjQUFjLE1BQU07QUFDbEIsWUFBSSxLQUFLLE9BQU8sU0FBUyxlQUFlLGNBQWMsS0FBSyxPQUFPLEtBQUssU0FBUyxRQUFRLEdBQUc7QUFDekYsa0JBQVEsT0FBTztBQUFBLFlBQ2I7QUFBQSxZQUNBLFdBQVc7QUFBQSxZQUNYLE1BQU0sRUFBRSxlQUFlLEtBQUssT0FBTyxLQUFLO0FBQUEsVUFDMUMsQ0FBQztBQUFBLFFBQ0gsV0FBVyxLQUFLLE9BQU8sU0FBUyxlQUFlLGtCQUFrQjtBQUUvRCxnQkFBTSxXQUFXLEtBQUssT0FBTztBQUM3QixjQUFJLFNBQVMsU0FBUyxlQUFlLGNBQWMsU0FBUyxLQUFLLFNBQVMsUUFBUSxHQUFHO0FBQ25GLG9CQUFRLE9BQU87QUFBQSxjQUNiO0FBQUEsY0FDQSxXQUFXO0FBQUEsY0FDWCxNQUFNLEVBQUUsZUFBZSxTQUFTLEtBQUs7QUFBQSxZQUN2QyxDQUFDO0FBQUEsVUFDSDtBQUFBLFFBQ0Y7QUFBQSxNQUNGO0FBQUEsSUFDRjtBQUFBLEVBQ0Y7QUFDRixDQUFDO0FBRUQsSUFBTyw2QkFBUTsiLAogICJuYW1lcyI6IFtdCn0K
|
package/dist-types/index.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { TSESLint } from '@typescript-eslint/utils';
|
|
2
|
+
export { default as isAwsSdkV3Used } from './is-aws-sdk-v3-used.ts';
|
|
2
3
|
declare const defaultToExport: Exclude<TSESLint.FlatConfig.Plugin, 'config'> & {
|
|
3
4
|
configs: Record<string, TSESLint.FlatConfig.Config[]>;
|
|
4
5
|
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export default function isAwsSdkV3Used(): Promise<boolean>;
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { ESLintUtils } from '@typescript-eslint/utils';
|
|
2
|
+
export declare const ruleId = "require-aws-config";
|
|
3
|
+
export declare const MESSAGE_ID_REQUIRE_AWS_CONFIG = "requireAwsConfig";
|
|
4
|
+
declare const rule: ESLintUtils.RuleModule<typeof MESSAGE_ID_REQUIRE_AWS_CONFIG>;
|
|
5
|
+
export default rule;
|
package/package.json
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"name":"@checkdigit/eslint-plugin","version":"7.15.0-PR.
|
|
1
|
+
{"name":"@checkdigit/eslint-plugin","version":"7.15.0-PR.134-b6cb","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.45.0","@typescript-eslint/utils":"^8.45.0","http-status-codes":"^2.3.0","ts-api-utils":"^2.1.0"},"devDependencies":{"@checkdigit/jest-config":"^6.0.2","@checkdigit/prettier-config":"^6.1.0","@checkdigit/typescript-config":"^9.3.1","@eslint/js":"^9.36.0","@types/eslint":"^9.6.1","@types/eslint-config-prettier":"^6.11.3","@typescript-eslint/parser":"^8.45.0","@typescript-eslint/rule-tester":"^8.45.0","eslint":"^9.36.0","eslint-config-prettier":"^10.1.8","eslint-import-resolver-typescript":"^4.4.4","eslint-plugin-eslint-plugin":"^6.4.0","eslint-plugin-import":"^2.32.0","eslint-plugin-no-only-tests":"^3.3.0","eslint-plugin-no-secrets":"^2.2.1","eslint-plugin-node":"^11.1.0","eslint-plugin-sonarjs":"1.0.4","rimraf":"^6.0.1","typescript-eslint":"^8.45.0"},"peerDependencies":{"eslint":">=9 <10"},"engines":{"node":">=22.15"}}
|
package/src/index.ts
CHANGED
|
@@ -26,13 +26,13 @@ import noServeRuntime, { ruleId as noServeRuntimeRuleId } from './no-serve-runti
|
|
|
26
26
|
import requireServiceCallResponseDeclaration, {
|
|
27
27
|
ruleId as requireServiceCallResponseDeclarationRuleId,
|
|
28
28
|
} from './require-service-call-response-declaration.ts';
|
|
29
|
+
import requireAwsConfig, { ruleId as requireAwsConfigRuleId } from './require-aws-config.ts';
|
|
29
30
|
import filePathComment from './file-path-comment.ts';
|
|
30
31
|
import noCardNumbers from './no-card-numbers.ts';
|
|
31
32
|
import noEnum from './no-enum.ts';
|
|
32
33
|
import noSideEffects from './no-side-effects.ts';
|
|
33
34
|
import noRandomV4UUID from './no-random-v4-uuid.ts';
|
|
34
35
|
import noTestImport from './no-test-import.ts';
|
|
35
|
-
import noTypeAssertionAs from './no-type-assertion-as.ts';
|
|
36
36
|
import noUtil from './no-util.ts';
|
|
37
37
|
import noUuid from './no-uuid.ts';
|
|
38
38
|
import noWallabyComment from './no-wallaby-comment.ts';
|
|
@@ -42,6 +42,7 @@ import requireAssertPredicateRejectsThrows from './require-assert-predicate-reje
|
|
|
42
42
|
import requireStrictAssert from './require-strict-assert.ts';
|
|
43
43
|
import requireAssertMessage from './require-assert-message';
|
|
44
44
|
import requireTsExtensionImportsExports from './require-ts-extension-imports-exports.ts';
|
|
45
|
+
export { default as isAwsSdkV3Used } from './is-aws-sdk-v3-used.ts';
|
|
45
46
|
|
|
46
47
|
const rules: Record<string, TSESLint.LooseRuleDefinition> = {
|
|
47
48
|
'file-path-comment': filePathComment,
|
|
@@ -57,7 +58,6 @@ const rules: Record<string, TSESLint.LooseRuleDefinition> = {
|
|
|
57
58
|
'no-test-import': noTestImport,
|
|
58
59
|
'no-wallaby-comment': noWallabyComment,
|
|
59
60
|
'no-side-effects': noSideEffects,
|
|
60
|
-
'no-type-assertion-as': noTypeAssertionAs,
|
|
61
61
|
'regular-expression-comment': regexComment,
|
|
62
62
|
'require-assert-predicate-rejects-throws': requireAssertPredicateRejectsThrows,
|
|
63
63
|
'object-literal-response': objectLiteralResponse,
|
|
@@ -68,6 +68,7 @@ const rules: Record<string, TSESLint.LooseRuleDefinition> = {
|
|
|
68
68
|
[noDuplicatedImportsRuleId]: noDuplicatedImports,
|
|
69
69
|
[noServeRuntimeRuleId]: noServeRuntime,
|
|
70
70
|
[requireServiceCallResponseDeclarationRuleId]: requireServiceCallResponseDeclaration,
|
|
71
|
+
[requireAwsConfigRuleId]: requireAwsConfig,
|
|
71
72
|
[requireFixedServicesImportRuleId]: requireFixedServicesImport,
|
|
72
73
|
[requireTypeOutOfTypeOnlyImportsRuleId]: requireTypeOutOfTypeOnlyImports,
|
|
73
74
|
};
|
|
@@ -96,7 +97,6 @@ const configs: Record<string, TSESLint.FlatConfig.Config[]> = {
|
|
|
96
97
|
'@checkdigit/require-ts-extension-imports-exports': 'error',
|
|
97
98
|
'@checkdigit/no-wallaby-comment': 'error',
|
|
98
99
|
'@checkdigit/no-side-effects': 'error',
|
|
99
|
-
'@checkdigit/no-type-assertion-as': 'error',
|
|
100
100
|
'@checkdigit/regular-expression-comment': 'error',
|
|
101
101
|
'@checkdigit/require-assert-predicate-rejects-throws': 'error',
|
|
102
102
|
'@checkdigit/object-literal-response': 'error',
|
|
@@ -110,6 +110,7 @@ const configs: Record<string, TSESLint.FlatConfig.Config[]> = {
|
|
|
110
110
|
[`@checkdigit/${requireTypeOutOfTypeOnlyImportsRuleId}`]: 'error',
|
|
111
111
|
[`@checkdigit/${noServeRuntimeRuleId}`]: 'error',
|
|
112
112
|
[`@checkdigit/${requireServiceCallResponseDeclarationRuleId}`]: 'error',
|
|
113
|
+
[`@checkdigit/${requireAwsConfigRuleId}`]: 'error',
|
|
113
114
|
},
|
|
114
115
|
},
|
|
115
116
|
],
|
|
@@ -132,7 +133,6 @@ const configs: Record<string, TSESLint.FlatConfig.Config[]> = {
|
|
|
132
133
|
'@checkdigit/require-ts-extension-imports-exports': 'error',
|
|
133
134
|
'@checkdigit/no-wallaby-comment': 'off',
|
|
134
135
|
'@checkdigit/no-side-effects': 'error',
|
|
135
|
-
'@checkdigit/no-type-assertion-as': 'error',
|
|
136
136
|
'@checkdigit/regular-expression-comment': 'error',
|
|
137
137
|
'@checkdigit/require-assert-predicate-rejects-throws': 'error',
|
|
138
138
|
'@checkdigit/object-literal-response': 'error',
|
|
@@ -146,6 +146,7 @@ const configs: Record<string, TSESLint.FlatConfig.Config[]> = {
|
|
|
146
146
|
[`@checkdigit/${requireTypeOutOfTypeOnlyImportsRuleId}`]: 'error',
|
|
147
147
|
[`@checkdigit/${noServeRuntimeRuleId}`]: 'off',
|
|
148
148
|
[`@checkdigit/${requireServiceCallResponseDeclarationRuleId}`]: 'off',
|
|
149
|
+
[`@checkdigit/${requireAwsConfigRuleId}`]: 'off',
|
|
149
150
|
},
|
|
150
151
|
},
|
|
151
152
|
],
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
// is-aws-sdk-v3-used.ts
|
|
2
|
+
|
|
3
|
+
import { promises as fs } from 'node:fs';
|
|
4
|
+
|
|
5
|
+
export default async function isAwsSdkV3Used(): Promise<boolean> {
|
|
6
|
+
const isService = process.env['SERVICE_NAME'] !== undefined;
|
|
7
|
+
if (!isService) {
|
|
8
|
+
return false;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
const packageJson = JSON.parse(await fs.readFile('package.json', 'utf-8')) as {
|
|
12
|
+
dependencies?: Record<string, string>;
|
|
13
|
+
service?: {
|
|
14
|
+
awsSdkV2?: boolean;
|
|
15
|
+
};
|
|
16
|
+
};
|
|
17
|
+
const dependencies = packageJson.dependencies ?? {};
|
|
18
|
+
|
|
19
|
+
const hasAwsSdkV3Dependency = Object.keys(dependencies).some((dependency) => dependency.startsWith('@aws-sdk/'));
|
|
20
|
+
const isAwsSdkV2Used =
|
|
21
|
+
Object.keys(dependencies).some((dependency) => dependency === '@checkdigit/aws') ||
|
|
22
|
+
packageJson.service?.awsSdkV2 === true;
|
|
23
|
+
|
|
24
|
+
return !isAwsSdkV2Used && hasAwsSdkV3Dependency;
|
|
25
|
+
}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
// require-aws-config.ts
|
|
2
|
+
|
|
3
|
+
/*
|
|
4
|
+
* Copyright (c) 2021-2025 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 } from '@typescript-eslint/utils';
|
|
10
|
+
import getDocumentationUrl from './get-documentation-url.ts';
|
|
11
|
+
|
|
12
|
+
export const ruleId = 'require-aws-config';
|
|
13
|
+
export const MESSAGE_ID_REQUIRE_AWS_CONFIG = 'requireAwsConfig';
|
|
14
|
+
const createRule = ESLintUtils.RuleCreator((name) => getDocumentationUrl(name));
|
|
15
|
+
|
|
16
|
+
const rule: ESLintUtils.RuleModule<typeof MESSAGE_ID_REQUIRE_AWS_CONFIG> = createRule({
|
|
17
|
+
name: ruleId,
|
|
18
|
+
meta: {
|
|
19
|
+
type: 'problem',
|
|
20
|
+
docs: {
|
|
21
|
+
description: 'Require to apply @checkdigit/aws-config along with qualifier instead of using aws client directly.',
|
|
22
|
+
},
|
|
23
|
+
messages: {
|
|
24
|
+
[MESSAGE_ID_REQUIRE_AWS_CONFIG]:
|
|
25
|
+
'Please apply @checkdigit/aws-config along with qualifier instead of using aws client {{awsClientName}} directly.',
|
|
26
|
+
},
|
|
27
|
+
schema: [],
|
|
28
|
+
},
|
|
29
|
+
defaultOptions: [],
|
|
30
|
+
create(context) {
|
|
31
|
+
const { isAwsSdkV3Used } = context.settings;
|
|
32
|
+
if (isAwsSdkV3Used !== true) {
|
|
33
|
+
return {};
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
return {
|
|
37
|
+
NewExpression(node) {
|
|
38
|
+
if (node.callee.type === AST_NODE_TYPES.Identifier && node.callee.name.endsWith('Client')) {
|
|
39
|
+
context.report({
|
|
40
|
+
node,
|
|
41
|
+
messageId: MESSAGE_ID_REQUIRE_AWS_CONFIG,
|
|
42
|
+
data: { awsClientName: node.callee.name },
|
|
43
|
+
});
|
|
44
|
+
} else if (node.callee.type === AST_NODE_TYPES.MemberExpression) {
|
|
45
|
+
// Handle `new AWS.DynamoDBClient()` style (MemberExpression)
|
|
46
|
+
const property = node.callee.property;
|
|
47
|
+
if (property.type === AST_NODE_TYPES.Identifier && property.name.endsWith('Client')) {
|
|
48
|
+
context.report({
|
|
49
|
+
node,
|
|
50
|
+
messageId: MESSAGE_ID_REQUIRE_AWS_CONFIG,
|
|
51
|
+
data: { awsClientName: property.name },
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
},
|
|
56
|
+
};
|
|
57
|
+
},
|
|
58
|
+
});
|
|
59
|
+
|
|
60
|
+
export default rule;
|
|
@@ -1,46 +0,0 @@
|
|
|
1
|
-
// src/no-type-assertion-as.ts
|
|
2
|
-
import { AST_NODE_TYPES, ESLintUtils } from "@typescript-eslint/utils";
|
|
3
|
-
var ruleId = "no-as-type-assertion";
|
|
4
|
-
var NO_AS_TYPE_ASSERTION = "NO_AS_TYPE_ASSERTION";
|
|
5
|
-
var createRule = ESLintUtils.RuleCreator((name) => name);
|
|
6
|
-
var rule = createRule({
|
|
7
|
-
name: ruleId,
|
|
8
|
-
meta: {
|
|
9
|
-
type: "problem",
|
|
10
|
-
docs: {
|
|
11
|
-
description: "Disallow the use of `as` type assertions and suggest using `satisfies` instead"
|
|
12
|
-
},
|
|
13
|
-
schema: [],
|
|
14
|
-
messages: {
|
|
15
|
-
[NO_AS_TYPE_ASSERTION]: "Avoid using `as` type assertions. Use `satisfies` instead."
|
|
16
|
-
}
|
|
17
|
-
},
|
|
18
|
-
defaultOptions: [],
|
|
19
|
-
create(context) {
|
|
20
|
-
const parserServices = ESLintUtils.getParserServices(context);
|
|
21
|
-
const checker = parserServices.program.getTypeChecker();
|
|
22
|
-
return {
|
|
23
|
-
TSAsExpression(node) {
|
|
24
|
-
if (node.parent.type === AST_NODE_TYPES.TSAsExpression) {
|
|
25
|
-
return;
|
|
26
|
-
}
|
|
27
|
-
const tsNode = parserServices.esTreeNodeToTSNodeMap.get(node.expression);
|
|
28
|
-
const originalType = checker.getTypeAtLocation(tsNode);
|
|
29
|
-
const targetType = checker.getTypeAtLocation(parserServices.esTreeNodeToTSNodeMap.get(node.typeAnnotation));
|
|
30
|
-
if (!checker.isTypeAssignableTo(originalType, targetType)) {
|
|
31
|
-
return;
|
|
32
|
-
}
|
|
33
|
-
context.report({
|
|
34
|
-
node,
|
|
35
|
-
messageId: NO_AS_TYPE_ASSERTION
|
|
36
|
-
});
|
|
37
|
-
}
|
|
38
|
-
};
|
|
39
|
-
}
|
|
40
|
-
});
|
|
41
|
-
var no_type_assertion_as_default = rule;
|
|
42
|
-
export {
|
|
43
|
-
no_type_assertion_as_default as default,
|
|
44
|
-
ruleId
|
|
45
|
-
};
|
|
46
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL25vLXR5cGUtYXNzZXJ0aW9uLWFzLnRzIl0sCiAgIm1hcHBpbmdzIjogIjtBQVFBLFNBQVMsZ0JBQWdCLG1CQUE2QjtBQUUvQyxJQUFNLFNBQVM7QUFDdEIsSUFBTSx1QkFBdUI7QUFFN0IsSUFBTSxhQUFhLFlBQVksWUFBWSxDQUFDLFNBQVMsSUFBSTtBQUV6RCxJQUFNLE9BQTRELFdBQVc7QUFBQSxFQUMzRSxNQUFNO0FBQUEsRUFDTixNQUFNO0FBQUEsSUFDSixNQUFNO0FBQUEsSUFDTixNQUFNO0FBQUEsTUFDSixhQUFhO0FBQUEsSUFDZjtBQUFBLElBQ0EsUUFBUSxDQUFDO0FBQUEsSUFDVCxVQUFVO0FBQUEsTUFDUixDQUFDLG9CQUFvQixHQUFHO0FBQUEsSUFDMUI7QUFBQSxFQUNGO0FBQUEsRUFDQSxnQkFBZ0IsQ0FBQztBQUFBLEVBQ2pCLE9BQU8sU0FBUztBQUNkLFVBQU0saUJBQWlCLFlBQVksa0JBQWtCLE9BQU87QUFDNUQsVUFBTSxVQUFVLGVBQWUsUUFBUSxlQUFlO0FBRXRELFdBQU87QUFBQSxNQUNMLGVBQWUsTUFBK0I7QUFDNUMsWUFBSSxLQUFLLE9BQU8sU0FBUyxlQUFlLGdCQUFnQjtBQUN0RDtBQUFBLFFBQ0Y7QUFFQSxjQUFNLFNBQVMsZUFBZSxzQkFBc0IsSUFBSSxLQUFLLFVBQVU7QUFDdkUsY0FBTSxlQUFlLFFBQVEsa0JBQWtCLE1BQU07QUFDckQsY0FBTSxhQUFhLFFBQVEsa0JBQWtCLGVBQWUsc0JBQXNCLElBQUksS0FBSyxjQUFjLENBQUM7QUFHMUcsWUFBSSxDQUFDLFFBQVEsbUJBQW1CLGNBQWMsVUFBVSxHQUFHO0FBQ3pEO0FBQUEsUUFDRjtBQUVBLGdCQUFRLE9BQU87QUFBQSxVQUNiO0FBQUEsVUFDQSxXQUFXO0FBQUEsUUFDYixDQUFDO0FBQUEsTUFDSDtBQUFBLElBQ0Y7QUFBQSxFQUNGO0FBQ0YsQ0FBQztBQUVELElBQU8sK0JBQVE7IiwKICAibmFtZXMiOiBbXQp9Cg==
|
|
@@ -1,5 +0,0 @@
|
|
|
1
|
-
import { ESLintUtils } from '@typescript-eslint/utils';
|
|
2
|
-
export declare const ruleId = "no-as-type-assertion";
|
|
3
|
-
declare const NO_AS_TYPE_ASSERTION = "NO_AS_TYPE_ASSERTION";
|
|
4
|
-
declare const rule: ESLintUtils.RuleModule<typeof NO_AS_TYPE_ASSERTION>;
|
|
5
|
-
export default rule;
|
|
@@ -1,57 +0,0 @@
|
|
|
1
|
-
// no-type-assertion-as.ts
|
|
2
|
-
|
|
3
|
-
/*
|
|
4
|
-
* Copyright (c) 2021-2025 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
|
-
export const ruleId = 'no-as-type-assertion';
|
|
12
|
-
const NO_AS_TYPE_ASSERTION = 'NO_AS_TYPE_ASSERTION';
|
|
13
|
-
|
|
14
|
-
const createRule = ESLintUtils.RuleCreator((name) => name);
|
|
15
|
-
|
|
16
|
-
const rule: ESLintUtils.RuleModule<typeof NO_AS_TYPE_ASSERTION> = createRule({
|
|
17
|
-
name: ruleId,
|
|
18
|
-
meta: {
|
|
19
|
-
type: 'problem',
|
|
20
|
-
docs: {
|
|
21
|
-
description: 'Disallow the use of `as` type assertions and suggest using `satisfies` instead',
|
|
22
|
-
},
|
|
23
|
-
schema: [],
|
|
24
|
-
messages: {
|
|
25
|
-
[NO_AS_TYPE_ASSERTION]: 'Avoid using `as` type assertions. Use `satisfies` instead.',
|
|
26
|
-
},
|
|
27
|
-
},
|
|
28
|
-
defaultOptions: [],
|
|
29
|
-
create(context) {
|
|
30
|
-
const parserServices = ESLintUtils.getParserServices(context);
|
|
31
|
-
const checker = parserServices.program.getTypeChecker();
|
|
32
|
-
|
|
33
|
-
return {
|
|
34
|
-
TSAsExpression(node: TSESTree.TSAsExpression) {
|
|
35
|
-
if (node.parent.type === AST_NODE_TYPES.TSAsExpression) {
|
|
36
|
-
return;
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
const tsNode = parserServices.esTreeNodeToTSNodeMap.get(node.expression);
|
|
40
|
-
const originalType = checker.getTypeAtLocation(tsNode);
|
|
41
|
-
const targetType = checker.getTypeAtLocation(parserServices.esTreeNodeToTSNodeMap.get(node.typeAnnotation));
|
|
42
|
-
|
|
43
|
-
// Ensure the types are not assignable
|
|
44
|
-
if (!checker.isTypeAssignableTo(originalType, targetType)) {
|
|
45
|
-
return;
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
context.report({
|
|
49
|
-
node,
|
|
50
|
-
messageId: NO_AS_TYPE_ASSERTION,
|
|
51
|
-
});
|
|
52
|
-
},
|
|
53
|
-
};
|
|
54
|
-
},
|
|
55
|
-
});
|
|
56
|
-
|
|
57
|
-
export default rule;
|