@checkdigit/eslint-plugin 6.6.0-PR.79-1cec → 6.7.0-PR.79-33df

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.
@@ -1,8 +1,12 @@
1
1
  // src/index.ts
2
2
  import invalidJsonStringify, { ruleId as invalidJsonStringifyRuleId } from "./invalid-json-stringify.mjs";
3
3
  import noPromiseInstanceMethod, { ruleId as noPromiseInstanceMethodRuleId } from "./no-promise-instance-method.mjs";
4
+ import requireResolveFullResponse, {
5
+ ruleId as requireResolveFullResponseRuleId
6
+ } from "./require-resolve-full-response.mjs";
4
7
  import filePathComment from "./file-path-comment.mjs";
5
8
  import noCardNumbers from "./no-card-numbers.mjs";
9
+ import noEnum from "./no-enum.mjs";
6
10
  import noTestImport from "./no-test-import.mjs";
7
11
  import noUuid from "./no-uuid.mjs";
8
12
  import noWallabyComment from "./no-wallaby-comment.mjs";
@@ -14,6 +18,7 @@ var src_default = {
14
18
  rules: {
15
19
  "file-path-comment": filePathComment,
16
20
  "no-card-numbers": noCardNumbers,
21
+ "no-enum": noEnum,
17
22
  "no-uuid": noUuid,
18
23
  "require-strict-assert": requireStrictAssert,
19
24
  "no-test-import": noTestImport,
@@ -22,12 +27,14 @@ var src_default = {
22
27
  "require-assert-predicate-rejects-throws": requireAssertPredicateRejectsThrows,
23
28
  "object-literal-response": objectLiteralResponse,
24
29
  [invalidJsonStringifyRuleId]: invalidJsonStringify,
25
- [noPromiseInstanceMethodRuleId]: noPromiseInstanceMethod
30
+ [noPromiseInstanceMethodRuleId]: noPromiseInstanceMethod,
31
+ [requireResolveFullResponseRuleId]: requireResolveFullResponse
26
32
  },
27
33
  configs: {
28
34
  all: {
29
35
  rules: {
30
36
  "@checkdigit/no-card-numbers": "error",
37
+ "@checkdigit/no-enum": "error",
31
38
  "@checkdigit/file-path-comment": "error",
32
39
  "@checkdigit/no-uuid": "error",
33
40
  "@checkdigit/require-strict-assert": "error",
@@ -37,12 +44,14 @@ var src_default = {
37
44
  "@checkdigit/object-literal-response": "error",
38
45
  "@checkdigit/no-test-import": "error",
39
46
  [`@checkdigit/${invalidJsonStringifyRuleId}`]: "error",
40
- [`@checkdigit/${noPromiseInstanceMethodRuleId}`]: "error"
47
+ [`@checkdigit/${noPromiseInstanceMethodRuleId}`]: "error",
48
+ [`@checkdigit/${requireResolveFullResponseRuleId}`]: "error"
41
49
  }
42
50
  },
43
51
  recommended: {
44
52
  rules: {
45
53
  "@checkdigit/no-card-numbers": "error",
54
+ "@checkdigit/no-enum": "error",
46
55
  "@checkdigit/file-path-comment": "off",
47
56
  "@checkdigit/no-uuid": "error",
48
57
  "@checkdigit/require-strict-assert": "error",
@@ -60,4 +69,4 @@ var src_default = {
60
69
  export {
61
70
  src_default as default
62
71
  };
63
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL2luZGV4LnRzIl0sCiAgIm1hcHBpbmdzIjogIjtBQVFBLE9BQU8sd0JBQXdCLFVBQVUsa0NBQWtDO0FBQzNFLE9BQU8sMkJBQTJCLFVBQVUscUNBQXFDO0FBQ2pGLE9BQU8scUJBQXFCO0FBQzVCLE9BQU8sbUJBQW1CO0FBQzFCLE9BQU8sa0JBQWtCO0FBQ3pCLE9BQU8sWUFBWTtBQUNuQixPQUFPLHNCQUFzQjtBQUM3QixPQUFPLDJCQUEyQjtBQUNsQyxPQUFPLGtCQUFrQjtBQUN6QixPQUFPLHlDQUF5QztBQUNoRCxPQUFPLHlCQUF5QjtBQUVoQyxJQUFPLGNBQVE7QUFBQSxFQUNiLE9BQU87QUFBQSxJQUNMLHFCQUFxQjtBQUFBLElBQ3JCLG1CQUFtQjtBQUFBLElBQ25CLFdBQVc7QUFBQSxJQUNYLHlCQUF5QjtBQUFBLElBQ3pCLGtCQUFrQjtBQUFBLElBQ2xCLHNCQUFzQjtBQUFBLElBQ3RCLDhCQUE4QjtBQUFBLElBQzlCLDJDQUEyQztBQUFBLElBQzNDLDJCQUEyQjtBQUFBLElBQzNCLENBQUMsMEJBQTBCLEdBQUc7QUFBQSxJQUM5QixDQUFDLDZCQUE2QixHQUFHO0FBQUEsRUFDbkM7QUFBQSxFQUNBLFNBQVM7QUFBQSxJQUNQLEtBQUs7QUFBQSxNQUNILE9BQU87QUFBQSxRQUNMLCtCQUErQjtBQUFBLFFBQy9CLGlDQUFpQztBQUFBLFFBQ2pDLHVCQUF1QjtBQUFBLFFBQ3ZCLHFDQUFxQztBQUFBLFFBQ3JDLGtDQUFrQztBQUFBLFFBQ2xDLDBDQUEwQztBQUFBLFFBQzFDLHVEQUF1RDtBQUFBLFFBQ3ZELHVDQUF1QztBQUFBLFFBQ3ZDLDhCQUE4QjtBQUFBLFFBQzlCLENBQUMsZUFBZSwwQkFBMEIsRUFBRSxHQUFHO0FBQUEsUUFDL0MsQ0FBQyxlQUFlLDZCQUE2QixFQUFFLEdBQUc7QUFBQSxNQUNwRDtBQUFBLElBQ0Y7QUFBQSxJQUNBLGFBQWE7QUFBQSxNQUNYLE9BQU87QUFBQSxRQUNMLCtCQUErQjtBQUFBLFFBQy9CLGlDQUFpQztBQUFBLFFBQ2pDLHVCQUF1QjtBQUFBLFFBQ3ZCLHFDQUFxQztBQUFBLFFBQ3JDLGtDQUFrQztBQUFBLFFBQ2xDLDBDQUEwQztBQUFBLFFBQzFDLHVEQUF1RDtBQUFBLFFBQ3ZELHVDQUF1QztBQUFBLFFBQ3ZDLDhCQUE4QjtBQUFBLFFBQzlCLENBQUMsZUFBZSwwQkFBMEIsRUFBRSxHQUFHO0FBQUEsUUFDL0MsQ0FBQyxlQUFlLDZCQUE2QixFQUFFLEdBQUc7QUFBQSxNQUNwRDtBQUFBLElBQ0Y7QUFBQSxFQUNGO0FBQ0Y7IiwKICAibmFtZXMiOiBbXQp9Cg==
72
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL2luZGV4LnRzIl0sCiAgIm1hcHBpbmdzIjogIjtBQVFBLE9BQU8sd0JBQXdCLFVBQVUsa0NBQWtDO0FBQzNFLE9BQU8sMkJBQTJCLFVBQVUscUNBQXFDO0FBQ2pGLE9BQU87QUFBQSxFQUNMLFVBQVU7QUFBQSxPQUNMO0FBQ1AsT0FBTyxxQkFBcUI7QUFDNUIsT0FBTyxtQkFBbUI7QUFDMUIsT0FBTyxZQUFZO0FBQ25CLE9BQU8sa0JBQWtCO0FBQ3pCLE9BQU8sWUFBWTtBQUNuQixPQUFPLHNCQUFzQjtBQUM3QixPQUFPLDJCQUEyQjtBQUNsQyxPQUFPLGtCQUFrQjtBQUN6QixPQUFPLHlDQUF5QztBQUNoRCxPQUFPLHlCQUF5QjtBQUVoQyxJQUFPLGNBQVE7QUFBQSxFQUNiLE9BQU87QUFBQSxJQUNMLHFCQUFxQjtBQUFBLElBQ3JCLG1CQUFtQjtBQUFBLElBQ25CLFdBQVc7QUFBQSxJQUNYLFdBQVc7QUFBQSxJQUNYLHlCQUF5QjtBQUFBLElBQ3pCLGtCQUFrQjtBQUFBLElBQ2xCLHNCQUFzQjtBQUFBLElBQ3RCLDhCQUE4QjtBQUFBLElBQzlCLDJDQUEyQztBQUFBLElBQzNDLDJCQUEyQjtBQUFBLElBQzNCLENBQUMsMEJBQTBCLEdBQUc7QUFBQSxJQUM5QixDQUFDLDZCQUE2QixHQUFHO0FBQUEsSUFDakMsQ0FBQyxnQ0FBZ0MsR0FBRztBQUFBLEVBQ3RDO0FBQUEsRUFDQSxTQUFTO0FBQUEsSUFDUCxLQUFLO0FBQUEsTUFDSCxPQUFPO0FBQUEsUUFDTCwrQkFBK0I7QUFBQSxRQUMvQix1QkFBdUI7QUFBQSxRQUN2QixpQ0FBaUM7QUFBQSxRQUNqQyx1QkFBdUI7QUFBQSxRQUN2QixxQ0FBcUM7QUFBQSxRQUNyQyxrQ0FBa0M7QUFBQSxRQUNsQywwQ0FBMEM7QUFBQSxRQUMxQyx1REFBdUQ7QUFBQSxRQUN2RCx1Q0FBdUM7QUFBQSxRQUN2Qyw4QkFBOEI7QUFBQSxRQUM5QixDQUFDLGVBQWUsMEJBQTBCLEVBQUUsR0FBRztBQUFBLFFBQy9DLENBQUMsZUFBZSw2QkFBNkIsRUFBRSxHQUFHO0FBQUEsUUFDbEQsQ0FBQyxlQUFlLGdDQUFnQyxFQUFFLEdBQUc7QUFBQSxNQUN2RDtBQUFBLElBQ0Y7QUFBQSxJQUNBLGFBQWE7QUFBQSxNQUNYLE9BQU87QUFBQSxRQUNMLCtCQUErQjtBQUFBLFFBQy9CLHVCQUF1QjtBQUFBLFFBQ3ZCLGlDQUFpQztBQUFBLFFBQ2pDLHVCQUF1QjtBQUFBLFFBQ3ZCLHFDQUFxQztBQUFBLFFBQ3JDLGtDQUFrQztBQUFBLFFBQ2xDLDBDQUEwQztBQUFBLFFBQzFDLHVEQUF1RDtBQUFBLFFBQ3ZELHVDQUF1QztBQUFBLFFBQ3ZDLDhCQUE4QjtBQUFBLFFBQzlCLENBQUMsZUFBZSwwQkFBMEIsRUFBRSxHQUFHO0FBQUEsUUFDL0MsQ0FBQyxlQUFlLDZCQUE2QixFQUFFLEdBQUc7QUFBQSxNQUNwRDtBQUFBLElBQ0Y7QUFBQSxFQUNGO0FBQ0Y7IiwKICAibmFtZXMiOiBbXQp9Cg==
@@ -0,0 +1,14 @@
1
+ // src/library/format.ts
2
+ import "@typescript-eslint/utils";
3
+ import { strict as assert } from "node:assert";
4
+ function getIndentation(node, sourceCode) {
5
+ assert.ok(node.loc);
6
+ const line = sourceCode.lines[node.loc.start.line - 1];
7
+ assert.ok(line !== void 0);
8
+ const indentMatch = line.match(/^\s*/u);
9
+ return indentMatch ? indentMatch[0] : "";
10
+ }
11
+ export {
12
+ getIndentation
13
+ };
14
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL2xpYnJhcnkvZm9ybWF0LnRzIl0sCiAgIm1hcHBpbmdzIjogIjtBQVFBLE9BQW1DO0FBR25DLFNBQVMsVUFBVSxjQUFjO0FBRTFCLFNBQVMsZUFBZSxNQUE0QixZQUE4QztBQUN2RyxTQUFPLEdBQUcsS0FBSyxHQUFHO0FBQ2xCLFFBQU0sT0FBTyxXQUFXLE1BQU0sS0FBSyxJQUFJLE1BQU0sT0FBTyxDQUFDO0FBQ3JELFNBQU8sR0FBRyxTQUFTLE1BQVM7QUFDNUIsUUFBTSxjQUFjLEtBQUssTUFBTSxPQUFPO0FBQ3RDLFNBQU8sY0FBYyxZQUFZLENBQUMsSUFBSTtBQUN4QzsiLAogICJuYW1lcyI6IFtdCn0K
@@ -0,0 +1,64 @@
1
+ // src/library/tree.ts
2
+ function getParent(node) {
3
+ return node.parent;
4
+ }
5
+ function getAncestor(node, matcher, exitMatcher) {
6
+ const parent = getParent(node);
7
+ if (!parent) {
8
+ return void 0;
9
+ } else if (typeof matcher === "string" && parent.type === matcher) {
10
+ return parent;
11
+ } else if (typeof matcher === "function" && matcher(parent)) {
12
+ return parent;
13
+ } else if (typeof exitMatcher === "string" && parent.type === exitMatcher) {
14
+ return void 0;
15
+ } else if (typeof exitMatcher === "function" && exitMatcher(parent)) {
16
+ return void 0;
17
+ }
18
+ return getAncestor(parent, matcher, exitMatcher);
19
+ }
20
+ function isBlockStatement(node) {
21
+ return node.type.endsWith("Statement") || node.type.endsWith("Declaration");
22
+ }
23
+ function getEnclosingStatement(node) {
24
+ return getAncestor(node, isBlockStatement);
25
+ }
26
+ function getEnclosingScopeNode(node) {
27
+ return getAncestor(
28
+ node,
29
+ (parentNode) => ["FunctionExpression", "FunctionDeclaration", "ArrowFunctionExpression", "Program"].includes(parentNode.type)
30
+ );
31
+ }
32
+ function isUsedInArrayOrAsArgument(node) {
33
+ if (isBlockStatement(node)) {
34
+ return false;
35
+ }
36
+ const parent = getParent(node);
37
+ if (!parent) {
38
+ return false;
39
+ }
40
+ if (parent.type === "ArrayExpression" || parent.type === "CallExpression" && parent.arguments.includes(node)) {
41
+ return true;
42
+ }
43
+ return isUsedInArrayOrAsArgument(parent);
44
+ }
45
+ function getEnclosingFunction(node) {
46
+ if (node.type === "FunctionDeclaration" || node.type === "FunctionExpression" || node.type === "ArrowFunctionExpression") {
47
+ return node;
48
+ }
49
+ const parent = getParent(node);
50
+ if (!parent) {
51
+ return;
52
+ }
53
+ return getEnclosingFunction(parent);
54
+ }
55
+ export {
56
+ getAncestor,
57
+ getEnclosingFunction,
58
+ getEnclosingScopeNode,
59
+ getEnclosingStatement,
60
+ getParent,
61
+ isBlockStatement,
62
+ isUsedInArrayOrAsArgument
63
+ };
64
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL2xpYnJhcnkvdHJlZS50cyJdLAogICJtYXBwaW5ncyI6ICI7QUFnQk8sU0FBUyxVQUFVLE1BQXFDO0FBQzdELFNBQVEsS0FBd0M7QUFDbEQ7QUFFTyxTQUFTLFlBQ2QsTUFDQSxTQUNBLGFBQ2tCO0FBQ2xCLFFBQU0sU0FBUyxVQUFVLElBQUk7QUFDN0IsTUFBSSxDQUFDLFFBQVE7QUFDWCxXQUFPO0FBQUEsRUFDVCxXQUFXLE9BQU8sWUFBWSxZQUFZLE9BQU8sU0FBUyxTQUFTO0FBQ2pFLFdBQU87QUFBQSxFQUNULFdBQVcsT0FBTyxZQUFZLGNBQWMsUUFBUSxNQUFNLEdBQUc7QUFDM0QsV0FBTztBQUFBLEVBQ1QsV0FBVyxPQUFPLGdCQUFnQixZQUFZLE9BQU8sU0FBUyxhQUFhO0FBQ3pFLFdBQU87QUFBQSxFQUNULFdBQVcsT0FBTyxnQkFBZ0IsY0FBYyxZQUFZLE1BQU0sR0FBRztBQUNuRSxXQUFPO0FBQUEsRUFDVDtBQUNBLFNBQU8sWUFBWSxRQUFRLFNBQVMsV0FBVztBQUNqRDtBQUVPLFNBQVMsaUJBQWlCLE1BQVk7QUFDM0MsU0FBTyxLQUFLLEtBQUssU0FBUyxXQUFXLEtBQUssS0FBSyxLQUFLLFNBQVMsYUFBYTtBQUM1RTtBQUVPLFNBQVMsc0JBQXNCLE1BQVk7QUFDaEQsU0FBTyxZQUFZLE1BQU0sZ0JBQWdCO0FBQzNDO0FBRU8sU0FBUyxzQkFBc0IsTUFBWTtBQUNoRCxTQUFPO0FBQUEsSUFBWTtBQUFBLElBQU0sQ0FBQyxlQUN4QixDQUFDLHNCQUFzQix1QkFBdUIsMkJBQTJCLFNBQVMsRUFBRSxTQUFTLFdBQVcsSUFBSTtBQUFBLEVBQzlHO0FBQ0Y7QUFFTyxTQUFTLDBCQUEwQixNQUFZO0FBQ3BELE1BQUksaUJBQWlCLElBQUksR0FBRztBQUMxQixXQUFPO0FBQUEsRUFDVDtBQUVBLFFBQU0sU0FBUyxVQUFVLElBQUk7QUFDN0IsTUFBSSxDQUFDLFFBQVE7QUFDWCxXQUFPO0FBQUEsRUFDVDtBQUVBLE1BQ0UsT0FBTyxTQUFTLHFCQUNmLE9BQU8sU0FBUyxvQkFBb0IsT0FBTyxVQUFVLFNBQVMsSUFBa0IsR0FDakY7QUFDQSxXQUFPO0FBQUEsRUFDVDtBQUdBLFNBQU8sMEJBQTBCLE1BQU07QUFDekM7QUFFTyxTQUFTLHFCQUFxQixNQUFZO0FBQy9DLE1BQ0UsS0FBSyxTQUFTLHlCQUNkLEtBQUssU0FBUyx3QkFDZCxLQUFLLFNBQVMsMkJBQ2Q7QUFDQSxXQUFPO0FBQUEsRUFDVDtBQUVBLFFBQU0sU0FBUyxVQUFVLElBQUk7QUFDN0IsTUFBSSxDQUFDLFFBQVE7QUFDWDtBQUFBLEVBQ0Y7QUFDQSxTQUFPLHFCQUFxQixNQUFNO0FBQ3BDOyIsCiAgIm5hbWVzIjogW10KfQo=
@@ -0,0 +1,72 @@
1
+ // src/library/ts-tree.ts
2
+ import { AST_NODE_TYPES } from "@typescript-eslint/utils";
3
+ function getParent(node) {
4
+ return node.parent;
5
+ }
6
+ function getAncestor(node, matcher, exitMatcher) {
7
+ const parent = getParent(node);
8
+ if (!parent) {
9
+ return void 0;
10
+ } else if (typeof matcher === "string" && parent.type === matcher) {
11
+ return parent;
12
+ } else if (typeof matcher === "function" && matcher(parent)) {
13
+ return parent;
14
+ } else if (typeof exitMatcher === "string" && parent.type === exitMatcher) {
15
+ return void 0;
16
+ } else if (typeof exitMatcher === "function" && exitMatcher(parent)) {
17
+ return void 0;
18
+ }
19
+ return getAncestor(parent, matcher, exitMatcher);
20
+ }
21
+ function isBlockStatement(node) {
22
+ return node.type.endsWith("Statement") || node.type.endsWith("Declaration");
23
+ }
24
+ function getEnclosingStatement(node) {
25
+ return getAncestor(node, isBlockStatement);
26
+ }
27
+ function getEnclosingScopeNode(node) {
28
+ return getAncestor(
29
+ node,
30
+ (parentNode) => ["FunctionExpression", "FunctionDeclaration", "ArrowFunctionExpression", "Program"].includes(parentNode.type)
31
+ );
32
+ }
33
+ function isUsedInArrayOrAsArgument(node) {
34
+ if (isBlockStatement(node)) {
35
+ return false;
36
+ }
37
+ const parent = getParent(node);
38
+ if (!parent) {
39
+ return false;
40
+ }
41
+ if (parent.type === AST_NODE_TYPES.ArrayExpression || parent.type === AST_NODE_TYPES.CallExpression && parent.arguments.includes(node)) {
42
+ return true;
43
+ }
44
+ return isUsedInArrayOrAsArgument(parent);
45
+ }
46
+ function getEnclosingFunction(node) {
47
+ if (node.type === AST_NODE_TYPES.FunctionDeclaration || node.type === AST_NODE_TYPES.FunctionExpression || node.type === AST_NODE_TYPES.ArrowFunctionExpression) {
48
+ return node;
49
+ }
50
+ const parent = getParent(node);
51
+ if (!parent) {
52
+ return;
53
+ }
54
+ return getEnclosingFunction(parent);
55
+ }
56
+ function getTypeParentNode(node) {
57
+ if (!node) {
58
+ return void 0;
59
+ }
60
+ return node.type === AST_NODE_TYPES.TSTypeAnnotation || node.type === AST_NODE_TYPES.TSAsExpression ? node : getTypeParentNode(node.parent);
61
+ }
62
+ export {
63
+ getAncestor,
64
+ getEnclosingFunction,
65
+ getEnclosingScopeNode,
66
+ getEnclosingStatement,
67
+ getParent,
68
+ getTypeParentNode,
69
+ isBlockStatement,
70
+ isUsedInArrayOrAsArgument
71
+ };
72
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL2xpYnJhcnkvdHMtdHJlZS50cyJdLAogICJtYXBwaW5ncyI6ICI7QUFRQSxTQUFTLHNCQUFnQztBQVFsQyxTQUFTLFVBQVUsTUFBdUQ7QUFDL0UsU0FBUSxLQUF3QztBQUNsRDtBQUVPLFNBQVMsWUFDZCxNQUNBLFNBQ0EsYUFDMkI7QUFDM0IsUUFBTSxTQUFTLFVBQVUsSUFBSTtBQUM3QixNQUFJLENBQUMsUUFBUTtBQUNYLFdBQU87QUFBQSxFQUNULFdBQVcsT0FBTyxZQUFZLFlBQVksT0FBTyxTQUFTLFNBQVM7QUFDakUsV0FBTztBQUFBLEVBQ1QsV0FBVyxPQUFPLFlBQVksY0FBYyxRQUFRLE1BQU0sR0FBRztBQUMzRCxXQUFPO0FBQUEsRUFDVCxXQUFXLE9BQU8sZ0JBQWdCLFlBQVksT0FBTyxTQUFTLGFBQWE7QUFDekUsV0FBTztBQUFBLEVBQ1QsV0FBVyxPQUFPLGdCQUFnQixjQUFjLFlBQVksTUFBTSxHQUFHO0FBQ25FLFdBQU87QUFBQSxFQUNUO0FBQ0EsU0FBTyxZQUFZLFFBQVEsU0FBUyxXQUFXO0FBQ2pEO0FBRU8sU0FBUyxpQkFBaUIsTUFBcUI7QUFDcEQsU0FBTyxLQUFLLEtBQUssU0FBUyxXQUFXLEtBQUssS0FBSyxLQUFLLFNBQVMsYUFBYTtBQUM1RTtBQUVPLFNBQVMsc0JBQXNCLE1BQXFCO0FBQ3pELFNBQU8sWUFBWSxNQUFNLGdCQUFnQjtBQUMzQztBQUVPLFNBQVMsc0JBQXNCLE1BQXFCO0FBQ3pELFNBQU87QUFBQSxJQUFZO0FBQUEsSUFBTSxDQUFDLGVBQ3hCLENBQUMsc0JBQXNCLHVCQUF1QiwyQkFBMkIsU0FBUyxFQUFFLFNBQVMsV0FBVyxJQUFJO0FBQUEsRUFDOUc7QUFDRjtBQUVPLFNBQVMsMEJBQTBCLE1BQXFCO0FBQzdELE1BQUksaUJBQWlCLElBQUksR0FBRztBQUMxQixXQUFPO0FBQUEsRUFDVDtBQUVBLFFBQU0sU0FBUyxVQUFVLElBQUk7QUFDN0IsTUFBSSxDQUFDLFFBQVE7QUFDWCxXQUFPO0FBQUEsRUFDVDtBQUVBLE1BQ0UsT0FBTyxTQUFTLGVBQWUsbUJBQzlCLE9BQU8sU0FBUyxlQUFlLGtCQUFrQixPQUFPLFVBQVUsU0FBUyxJQUEyQixHQUN2RztBQUNBLFdBQU87QUFBQSxFQUNUO0FBR0EsU0FBTywwQkFBMEIsTUFBTTtBQUN6QztBQUVPLFNBQVMscUJBQXFCLE1BQXFCO0FBQ3hELE1BQ0UsS0FBSyxTQUFTLGVBQWUsdUJBQzdCLEtBQUssU0FBUyxlQUFlLHNCQUM3QixLQUFLLFNBQVMsZUFBZSx5QkFDN0I7QUFDQSxXQUFPO0FBQUEsRUFDVDtBQUVBLFFBQU0sU0FBUyxVQUFVLElBQUk7QUFDN0IsTUFBSSxDQUFDLFFBQVE7QUFDWDtBQUFBLEVBQ0Y7QUFDQSxTQUFPLHFCQUFxQixNQUFNO0FBQ3BDO0FBRU8sU0FBUyxrQkFDZCxNQUNpRTtBQUNqRSxNQUFJLENBQUMsTUFBTTtBQUNULFdBQU87QUFBQSxFQUNUO0FBQ0EsU0FBTyxLQUFLLFNBQVMsZUFBZSxvQkFBb0IsS0FBSyxTQUFTLGVBQWUsaUJBQ2pGLE9BQ0Esa0JBQWtCLEtBQUssTUFBTTtBQUNuQzsiLAogICJuYW1lcyI6IFtdCn0K
@@ -0,0 +1,8 @@
1
+ // src/library/variable.ts
2
+ function isValidPropertyName(name) {
3
+ return typeof name === "string" && /^[a-zA-Z_$][a-zA-Z_$0-9]*$/u.test(name);
4
+ }
5
+ export {
6
+ isValidPropertyName
7
+ };
8
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL2xpYnJhcnkvdmFyaWFibGUudHMiXSwKICAibWFwcGluZ3MiOiAiO0FBRU8sU0FBUyxvQkFBb0IsTUFBZTtBQUNqRCxTQUFPLE9BQU8sU0FBUyxZQUFZLDhCQUE4QixLQUFLLElBQUk7QUFDNUU7IiwKICAibmFtZXMiOiBbXQp9Cg==
@@ -3,6 +3,15 @@ import { ESLintUtils, TSESTree } from "@typescript-eslint/utils";
3
3
  var ruleId = "no-enum";
4
4
  var NO_ENUM = "NO_ENUM";
5
5
  var createRule = ESLintUtils.RuleCreator((name) => name);
6
+ function isJsonSchemaProperty(node) {
7
+ if (!node) {
8
+ return false;
9
+ }
10
+ if (node.type === TSESTree.AST_NODE_TYPES.Property && node.key.type === TSESTree.AST_NODE_TYPES.Identifier && node.key.name === "properties") {
11
+ return true;
12
+ }
13
+ return isJsonSchemaProperty(node.parent);
14
+ }
6
15
  var rule = createRule({
7
16
  name: ruleId,
8
17
  meta: {
@@ -25,7 +34,7 @@ var rule = createRule({
25
34
  });
26
35
  },
27
36
  Property(node) {
28
- if (node.key.type === TSESTree.AST_NODE_TYPES.Identifier && node.key.name === "enum" && node.value.type === TSESTree.AST_NODE_TYPES.ArrayExpression) {
37
+ if (node.key.type === TSESTree.AST_NODE_TYPES.Identifier && node.key.name === "enum" && node.value.type === TSESTree.AST_NODE_TYPES.ArrayExpression && !isJsonSchemaProperty(node.parent)) {
29
38
  context.report({
30
39
  node,
31
40
  messageId: NO_ENUM
@@ -40,4 +49,4 @@ export {
40
49
  no_enum_default as default,
41
50
  ruleId
42
51
  };
43
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL25vLWVudW0udHMiXSwKICAibWFwcGluZ3MiOiAiO0FBRUEsU0FBUyxhQUFhLGdCQUFnQjtBQVEvQixJQUFNLFNBQVM7QUFDdEIsSUFBTSxVQUFVO0FBRWhCLElBQU0sYUFBYSxZQUFZLFlBQVksQ0FBQyxTQUFTLElBQUk7QUFFekQsSUFBTSxPQUFPLFdBQVc7QUFBQSxFQUN0QixNQUFNO0FBQUEsRUFDTixNQUFNO0FBQUEsSUFDSixNQUFNO0FBQUEsSUFDTixNQUFNO0FBQUEsTUFDSixhQUFhO0FBQUEsSUFDZjtBQUFBLElBQ0EsUUFBUSxDQUFDO0FBQUEsSUFDVCxVQUFVO0FBQUEsTUFDUixDQUFDLE9BQU8sR0FBRztBQUFBLElBQ2I7QUFBQSxFQUNGO0FBQUEsRUFDQSxnQkFBZ0IsQ0FBQztBQUFBLEVBQ2pCLE9BQU8sU0FBUztBQUNkLFdBQU87QUFBQSxNQUNMLGtCQUFrQixNQUFrQztBQUNsRCxnQkFBUSxPQUFPO0FBQUEsVUFDYjtBQUFBLFVBQ0EsV0FBVztBQUFBLFFBQ2IsQ0FBQztBQUFBLE1BQ0g7QUFBQSxNQUNBLFNBQVMsTUFBeUI7QUFDaEMsWUFDRSxLQUFLLElBQUksU0FBUyxTQUFTLGVBQWUsY0FDMUMsS0FBSyxJQUFJLFNBQVMsVUFDbEIsS0FBSyxNQUFNLFNBQVMsU0FBUyxlQUFlLGlCQUM1QztBQUNBLGtCQUFRLE9BQU87QUFBQSxZQUNiO0FBQUEsWUFDQSxXQUFXO0FBQUEsVUFDYixDQUFDO0FBQUEsUUFDSDtBQUFBLE1BQ0Y7QUFBQSxJQUNGO0FBQUEsRUFDRjtBQUNGLENBQUM7QUFFRCxJQUFPLGtCQUFROyIsCiAgIm5hbWVzIjogW10KfQo=
52
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL25vLWVudW0udHMiXSwKICAibWFwcGluZ3MiOiAiO0FBUUEsU0FBUyxhQUFhLGdCQUFnQjtBQUUvQixJQUFNLFNBQVM7QUFDdEIsSUFBTSxVQUFVO0FBRWhCLElBQU0sYUFBYSxZQUFZLFlBQVksQ0FBQyxTQUFTLElBQUk7QUFFekQsU0FBUyxxQkFBcUIsTUFBK0I7QUFDM0QsTUFBSSxDQUFDLE1BQU07QUFDVCxXQUFPO0FBQUEsRUFDVDtBQUNBLE1BQ0UsS0FBSyxTQUFTLFNBQVMsZUFBZSxZQUN0QyxLQUFLLElBQUksU0FBUyxTQUFTLGVBQWUsY0FDMUMsS0FBSyxJQUFJLFNBQVMsY0FDbEI7QUFDQSxXQUFPO0FBQUEsRUFDVDtBQUNBLFNBQU8scUJBQXFCLEtBQUssTUFBTTtBQUN6QztBQUVBLElBQU0sT0FBTyxXQUFXO0FBQUEsRUFDdEIsTUFBTTtBQUFBLEVBQ04sTUFBTTtBQUFBLElBQ0osTUFBTTtBQUFBLElBQ04sTUFBTTtBQUFBLE1BQ0osYUFBYTtBQUFBLElBQ2Y7QUFBQSxJQUNBLFFBQVEsQ0FBQztBQUFBLElBQ1QsVUFBVTtBQUFBLE1BQ1IsQ0FBQyxPQUFPLEdBQUc7QUFBQSxJQUNiO0FBQUEsRUFDRjtBQUFBLEVBQ0EsZ0JBQWdCLENBQUM7QUFBQSxFQUNqQixPQUFPLFNBQVM7QUFDZCxXQUFPO0FBQUEsTUFDTCxrQkFBa0IsTUFBa0M7QUFDbEQsZ0JBQVEsT0FBTztBQUFBLFVBQ2I7QUFBQSxVQUNBLFdBQVc7QUFBQSxRQUNiLENBQUM7QUFBQSxNQUNIO0FBQUEsTUFDQSxTQUFTLE1BQXlCO0FBQ2hDLFlBQ0UsS0FBSyxJQUFJLFNBQVMsU0FBUyxlQUFlLGNBQzFDLEtBQUssSUFBSSxTQUFTLFVBQ2xCLEtBQUssTUFBTSxTQUFTLFNBQVMsZUFBZSxtQkFDNUMsQ0FBQyxxQkFBcUIsS0FBSyxNQUFNLEdBQ2pDO0FBQ0Esa0JBQVEsT0FBTztBQUFBLFlBQ2I7QUFBQSxZQUNBLFdBQVc7QUFBQSxVQUNiLENBQUM7QUFBQSxRQUNIO0FBQUEsTUFDRjtBQUFBLElBQ0Y7QUFBQSxFQUNGO0FBQ0YsQ0FBQztBQUVELElBQU8sa0JBQVE7IiwKICAibmFtZXMiOiBbXQp9Cg==
@@ -0,0 +1,159 @@
1
+ // src/require-resolve-full-response.ts
2
+ import { AST_NODE_TYPES, ESLintUtils } from "@typescript-eslint/utils";
3
+ import { DefinitionType } from "@typescript-eslint/scope-manager";
4
+ import { strict as assert } from "node:assert";
5
+ import getDocumentationUrl from "./get-documentation-url.mjs";
6
+ import { getEnclosingScopeNode } from "./library/ts-tree.mjs";
7
+ var ruleId = "require-resolve-full-response";
8
+ var PLAIN_URL_REGEXP = /^[`']\/\w+(?<serviceNamePart>-\w+)*\/v\d+\/(?<any>.|\r|\n)+[`']$/u;
9
+ var TOKENIZED_URL_REGEXP = /^`\$\{(?<serviceNamePart>[A-Z]+_)*BASE_PATH\}\/(?<any>.|\r|\n)+`$/u;
10
+ var createRule = ESLintUtils.RuleCreator((name) => getDocumentationUrl(name));
11
+ var rule = createRule({
12
+ name: ruleId,
13
+ meta: {
14
+ type: "suggestion",
15
+ docs: {
16
+ description: "Prefer native fetch over customized service wrapper."
17
+ },
18
+ messages: {
19
+ invalidOptions: '"options" argument should be provided with "resolveWithFullResponse" property set as "true". Otherwise, it indicates that the response body will be obtained without status code assertion which could result in unexpected issue.',
20
+ unknownError: 'Unknown error occurred in file "{{fileName}}": {{ error }}.'
21
+ },
22
+ schema: []
23
+ },
24
+ defaultOptions: [],
25
+ create(context) {
26
+ const sourceCode = context.sourceCode;
27
+ const scopeManager = sourceCode.scopeManager;
28
+ const parserService = ESLintUtils.getParserServices(context);
29
+ const typeChecker = parserService.program.getTypeChecker();
30
+ function isUrlArgumentValid(urlArgument, scope) {
31
+ if (urlArgument?.type === AST_NODE_TYPES.Literal && typeof urlArgument.value === "string" || urlArgument?.type === AST_NODE_TYPES.TemplateLiteral) {
32
+ const urlText = sourceCode.getText(urlArgument);
33
+ return PLAIN_URL_REGEXP.test(urlText) || TOKENIZED_URL_REGEXP.test(urlText);
34
+ }
35
+ if (urlArgument?.type === AST_NODE_TYPES.Identifier) {
36
+ const foundVariable = scope.variables.find((variable) => variable.name === urlArgument.name);
37
+ if (foundVariable) {
38
+ const variableDefinition = foundVariable.defs.find((def) => def.type === DefinitionType.Variable);
39
+ assert.ok(variableDefinition, `Variable "${urlArgument.name}" not defined in scope`);
40
+ const variableDefinitionNode = variableDefinition.node;
41
+ assert.ok(variableDefinitionNode.type === AST_NODE_TYPES.VariableDeclarator);
42
+ assert.ok(variableDefinitionNode.init, "Variable definition node has no init property");
43
+ return isUrlArgumentValid(variableDefinitionNode.init, scope);
44
+ }
45
+ }
46
+ return false;
47
+ }
48
+ function getType(identifier) {
49
+ const variable = parserService.esTreeNodeToTSNodeMap.get(identifier);
50
+ const variableType = typeChecker.getTypeAtLocation(variable);
51
+ return typeChecker.typeToString(variableType);
52
+ }
53
+ function isServiceLikeName(name) {
54
+ return /.*[Ss]ervice$/u.test(name);
55
+ }
56
+ function isCalleeServiceWrapper(serviceCall) {
57
+ const callee = serviceCall.callee;
58
+ if (callee.type !== AST_NODE_TYPES.MemberExpression) {
59
+ return false;
60
+ }
61
+ const endpoint = callee.object;
62
+ if (endpoint.type === AST_NODE_TYPES.Identifier) {
63
+ return getType(endpoint) === "Endpoint" || isServiceLikeName(endpoint.name);
64
+ }
65
+ if (endpoint.type !== AST_NODE_TYPES.CallExpression) {
66
+ return false;
67
+ }
68
+ const [contextArgument] = endpoint.arguments;
69
+ if (contextArgument?.type !== AST_NODE_TYPES.Identifier) {
70
+ return false;
71
+ }
72
+ if (contextArgument.name !== "EMPTY_CONTEXT" && getType(contextArgument) !== "InboundContext") {
73
+ return false;
74
+ }
75
+ const service = endpoint.callee;
76
+ if (service.type === AST_NODE_TYPES.Identifier) {
77
+ return getType(service) === "ResolvedService";
78
+ }
79
+ if (service.type !== AST_NODE_TYPES.MemberExpression) {
80
+ return false;
81
+ }
82
+ const services = service.object;
83
+ if (services.type === AST_NODE_TYPES.Identifier) {
84
+ return getType(services) === "ResolvedServices";
85
+ }
86
+ if (services.type !== AST_NODE_TYPES.MemberExpression) {
87
+ return false;
88
+ }
89
+ const configuration = services.object;
90
+ if (configuration.type === AST_NODE_TYPES.Identifier) {
91
+ return ["Configuration", "Configuration<ResolvedServices>"].includes(getType(configuration));
92
+ }
93
+ if (configuration.type !== AST_NODE_TYPES.MemberExpression) {
94
+ return false;
95
+ }
96
+ const fixture = configuration.object;
97
+ if (fixture.type === AST_NODE_TYPES.Identifier) {
98
+ return fixture.name === "fixture" || getType(fixture) === "Fixture";
99
+ }
100
+ return false;
101
+ }
102
+ return {
103
+ "CallExpression[callee.property.name=/^(head|get|put|post|del|patch)$/]": (serviceCall) => {
104
+ try {
105
+ if (!isCalleeServiceWrapper(serviceCall)) {
106
+ return;
107
+ }
108
+ const enclosingScopeNode = getEnclosingScopeNode(serviceCall);
109
+ assert.ok(enclosingScopeNode, "enclosingScopeNode is undefined");
110
+ const scope = scopeManager?.acquire(enclosingScopeNode);
111
+ assert.ok(scope, "scope is undefined");
112
+ const urlArgument = serviceCall.arguments[0];
113
+ if (!isUrlArgumentValid(urlArgument, scope)) {
114
+ return;
115
+ }
116
+ assert.ok(serviceCall.callee.type === AST_NODE_TYPES.MemberExpression);
117
+ assert.ok(serviceCall.callee.property.type === AST_NODE_TYPES.Identifier);
118
+ const method = serviceCall.callee.property.name;
119
+ const optionsArgument = ["get", "head", "del"].includes(method) ? serviceCall.arguments[1] : serviceCall.arguments[2];
120
+ if (optionsArgument === void 0 || optionsArgument.type !== AST_NODE_TYPES.ObjectExpression) {
121
+ context.report({
122
+ node: serviceCall,
123
+ messageId: "invalidOptions"
124
+ });
125
+ return;
126
+ }
127
+ const resolveWithFullResponseProperty = optionsArgument.properties.find(
128
+ (property) => property.type === AST_NODE_TYPES.Property && property.key.type === AST_NODE_TYPES.Identifier && property.key.name === "resolveWithFullResponse"
129
+ );
130
+ if (resolveWithFullResponseProperty?.type !== AST_NODE_TYPES.Property || resolveWithFullResponseProperty.value.type !== AST_NODE_TYPES.Literal || resolveWithFullResponseProperty.value.value !== true) {
131
+ context.report({
132
+ node: optionsArgument,
133
+ messageId: "invalidOptions"
134
+ });
135
+ return;
136
+ }
137
+ } catch (error) {
138
+ console.error(`Failed to apply ${ruleId} rule for file "${context.filename}":`, error);
139
+ context.report({
140
+ node: serviceCall,
141
+ messageId: "unknownError",
142
+ data: {
143
+ fileName: context.filename,
144
+ error: error instanceof Error ? error.toString() : JSON.stringify(error)
145
+ }
146
+ });
147
+ }
148
+ }
149
+ };
150
+ }
151
+ });
152
+ var require_resolve_full_response_default = rule;
153
+ export {
154
+ PLAIN_URL_REGEXP,
155
+ TOKENIZED_URL_REGEXP,
156
+ require_resolve_full_response_default as default,
157
+ ruleId
158
+ };
159
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL3JlcXVpcmUtcmVzb2x2ZS1mdWxsLXJlc3BvbnNlLnRzIl0sCiAgIm1hcHBpbmdzIjogIjtBQVFBLFNBQVMsZ0JBQWdCLG1CQUE2QjtBQUN0RCxTQUFTLHNCQUFrQztBQUMzQyxTQUFTLFVBQVUsY0FBYztBQUNqQyxPQUFPLHlCQUF5QjtBQUNoQyxTQUFTLDZCQUE2QjtBQUUvQixJQUFNLFNBQVM7QUFDZixJQUFNLG1CQUFtQjtBQUN6QixJQUFNLHVCQUF1QjtBQUVwQyxJQUFNLGFBQWEsWUFBWSxZQUFZLENBQUMsU0FBUyxvQkFBb0IsSUFBSSxDQUFDO0FBRTlFLElBQU0sT0FBTyxXQUFXO0FBQUEsRUFDdEIsTUFBTTtBQUFBLEVBQ04sTUFBTTtBQUFBLElBQ0osTUFBTTtBQUFBLElBQ04sTUFBTTtBQUFBLE1BQ0osYUFBYTtBQUFBLElBQ2Y7QUFBQSxJQUNBLFVBQVU7QUFBQSxNQUNSLGdCQUNFO0FBQUEsTUFDRixjQUFjO0FBQUEsSUFDaEI7QUFBQSxJQUNBLFFBQVEsQ0FBQztBQUFBLEVBQ1g7QUFBQSxFQUNBLGdCQUFnQixDQUFDO0FBQUEsRUFDakIsT0FBTyxTQUFTO0FBQ2QsVUFBTSxhQUFhLFFBQVE7QUFDM0IsVUFBTSxlQUFlLFdBQVc7QUFDaEMsVUFBTSxnQkFBZ0IsWUFBWSxrQkFBa0IsT0FBTztBQUMzRCxVQUFNLGNBQWMsY0FBYyxRQUFRLGVBQWU7QUFFekQsYUFBUyxtQkFBbUIsYUFBd0MsT0FBYztBQUNoRixVQUNHLGFBQWEsU0FBUyxlQUFlLFdBQVcsT0FBTyxZQUFZLFVBQVUsWUFDOUUsYUFBYSxTQUFTLGVBQWUsaUJBQ3JDO0FBQ0EsY0FBTSxVQUFVLFdBQVcsUUFBUSxXQUFXO0FBQzlDLGVBQU8saUJBQWlCLEtBQUssT0FBTyxLQUFLLHFCQUFxQixLQUFLLE9BQU87QUFBQSxNQUM1RTtBQUVBLFVBQUksYUFBYSxTQUFTLGVBQWUsWUFBWTtBQUNuRCxjQUFNLGdCQUFnQixNQUFNLFVBQVUsS0FBSyxDQUFD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
@@ -2,6 +2,7 @@ declare const _default: {
2
2
  rules: {
3
3
  'file-path-comment': import("eslint").Rule.RuleModule;
4
4
  'no-card-numbers': import("eslint").Rule.RuleModule;
5
+ 'no-enum': import("@typescript-eslint/utils/ts-eslint").RuleModule<"NO_ENUM", never[], import("@typescript-eslint/utils/ts-eslint").RuleListener>;
5
6
  'no-uuid': import("eslint").Rule.RuleModule;
6
7
  'require-strict-assert': import("eslint").Rule.RuleModule;
7
8
  'no-test-import': import("eslint").Rule.RuleModule;
@@ -11,11 +12,13 @@ declare const _default: {
11
12
  'object-literal-response': import("eslint").Rule.RuleModule;
12
13
  "invalid-json-stringify": import("eslint").Rule.RuleModule;
13
14
  "no-promise-instance-method": import("eslint").Rule.RuleModule;
15
+ "require-resolve-full-response": import("@typescript-eslint/utils/ts-eslint").RuleModule<"invalidOptions" | "unknownError", never[], import("@typescript-eslint/utils/ts-eslint").RuleListener>;
14
16
  };
15
17
  configs: {
16
18
  all: {
17
19
  rules: {
18
20
  '@checkdigit/no-card-numbers': string;
21
+ '@checkdigit/no-enum': string;
19
22
  '@checkdigit/file-path-comment': string;
20
23
  '@checkdigit/no-uuid': string;
21
24
  '@checkdigit/require-strict-assert': string;
@@ -26,11 +29,13 @@ declare const _default: {
26
29
  '@checkdigit/no-test-import': string;
27
30
  "@checkdigit/invalid-json-stringify": string;
28
31
  "@checkdigit/no-promise-instance-method": string;
32
+ "@checkdigit/require-resolve-full-response": string;
29
33
  };
30
34
  };
31
35
  recommended: {
32
36
  rules: {
33
37
  '@checkdigit/no-card-numbers': string;
38
+ '@checkdigit/no-enum': string;
34
39
  '@checkdigit/file-path-comment': string;
35
40
  '@checkdigit/no-uuid': string;
36
41
  '@checkdigit/require-strict-assert': string;
@@ -0,0 +1,4 @@
1
+ import { TSESLint, TSESTree } from '@typescript-eslint/utils';
2
+ import type { Node } from 'estree';
3
+ import type { SourceCode } from 'eslint';
4
+ export declare function getIndentation(node: Node | TSESTree.Node, sourceCode: SourceCode | TSESLint.SourceCode): string;
@@ -0,0 +1,8 @@
1
+ import type { Node } from 'estree';
2
+ export declare function getParent(node: Node): Node | undefined | null;
3
+ export declare function getAncestor(node: Node, matcher: string | ((testNode: Node) => boolean), exitMatcher?: string | ((testNode: Node) => boolean)): Node | undefined;
4
+ export declare function isBlockStatement(node: Node): boolean;
5
+ export declare function getEnclosingStatement(node: Node): Node | undefined;
6
+ export declare function getEnclosingScopeNode(node: Node): Node | undefined;
7
+ export declare function isUsedInArrayOrAsArgument(node: Node): boolean;
8
+ export declare function getEnclosingFunction(node: Node): import("estree").ArrowFunctionExpression | import("estree").FunctionExpression | import("estree").FunctionDeclaration | undefined;
@@ -0,0 +1,9 @@
1
+ import { AST_NODE_TYPES, TSESTree } from '@typescript-eslint/utils';
2
+ export declare function getParent(node: TSESTree.Node): TSESTree.Node | undefined | null;
3
+ export declare function getAncestor(node: TSESTree.Node, matcher: AST_NODE_TYPES | ((testNode: TSESTree.Node) => boolean), exitMatcher?: AST_NODE_TYPES | ((testNode: TSESTree.Node) => boolean)): TSESTree.Node | undefined;
4
+ export declare function isBlockStatement(node: TSESTree.Node): boolean;
5
+ export declare function getEnclosingStatement(node: TSESTree.Node): TSESTree.Node | undefined;
6
+ export declare function getEnclosingScopeNode(node: TSESTree.Node): TSESTree.Node | undefined;
7
+ export declare function isUsedInArrayOrAsArgument(node: TSESTree.Node): boolean;
8
+ export declare function getEnclosingFunction(node: TSESTree.Node): TSESTree.ArrowFunctionExpression | TSESTree.FunctionDeclarationWithOptionalName | TSESTree.FunctionExpression | undefined;
9
+ export declare function getTypeParentNode(node: TSESTree.Node | undefined): TSESTree.TSTypeAnnotation | TSESTree.TSAsExpression | undefined;
@@ -0,0 +1 @@
1
+ export declare function isValidPropertyName(name: unknown): boolean;
@@ -0,0 +1,6 @@
1
+ import { ESLintUtils } from '@typescript-eslint/utils';
2
+ export declare const ruleId = "require-resolve-full-response";
3
+ export declare const PLAIN_URL_REGEXP: RegExp;
4
+ export declare const TOKENIZED_URL_REGEXP: RegExp;
5
+ declare const rule: ESLintUtils.RuleModule<"invalidOptions" | "unknownError", never[], ESLintUtils.RuleListener>;
6
+ export default rule;
package/package.json CHANGED
@@ -1 +1 @@
1
- {"name":"@checkdigit/eslint-plugin","version":"6.6.0-PR.79-1cec","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","require":"./dist-cjs/index.cjs","import":"./dist-mjs/index.mjs","default":"./dist-mjs/index.mjs"}},"files":["src","dist-types","dist-cjs","dist-mjs","!src/**/*.test.ts","!src/**/*.spec.ts","!dist-types/**/*.test.d.ts","!dist-types/**/*.spec.d.ts","!dist-cjs/**/*.test.cjs","!dist-cjs/**/*.spec.cjs","!dist-mjs/**/*.test.mjs","!dist-mjs/**/*.spec.mjs","SECURITY.md"],"scripts":{"build:dist-cjs":"rimraf dist-cjs && npx builder --type=commonjs --sourceMap --entryPoint=index.ts --outDir=dist-cjs --outFile=index.cjs --external=espree && echo \"module.exports = module.exports.default;\" >> dist-cjs/index.cjs && node dist-cjs/index.cjs","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 --ignore-path .gitignore .","lint:fix":"eslint --ignore-path .gitignore . --fix","prepublishOnly":"npm run build:dist-types && npm run build:dist-cjs && 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"},"devDependencies":{"@checkdigit/jest-config":"^6.0.2","@checkdigit/prettier-config":"^5.5.0","@checkdigit/typescript-config":"6.0.0","@types/eslint":"8.56.10","@typescript-eslint/eslint-plugin":"7.18.0","@typescript-eslint/parser":"7.18.0","@typescript-eslint/rule-tester":"7.18.0","@typescript-eslint/utils":"7.18.0","eslint-config-prettier":"^9.1.0","eslint-plugin-eslint-plugin":"^6.2.0","eslint-plugin-import":"^2.29.1","eslint-plugin-no-only-tests":"^3.1.0","eslint-plugin-no-secrets":"^1.0.2","eslint-plugin-node":"^11.1.0","eslint-plugin-sonarjs":"0.24.0","http-status-codes":"^2.3.0"},"peerDependencies":{"eslint":">=8 <9"},"engines":{"node":">=20.14"}}
1
+ {"name":"@checkdigit/eslint-plugin","version":"6.7.0-PR.79-33df","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","require":"./dist-cjs/index.cjs","import":"./dist-mjs/index.mjs","default":"./dist-mjs/index.mjs"}},"files":["src","dist-types","dist-cjs","dist-mjs","!src/**/*.test.ts","!src/**/*.spec.ts","!dist-types/**/*.test.d.ts","!dist-types/**/*.spec.d.ts","!dist-cjs/**/*.test.cjs","!dist-cjs/**/*.spec.cjs","!dist-mjs/**/*.test.mjs","!dist-mjs/**/*.spec.mjs","SECURITY.md"],"scripts":{"build:dist-cjs":"rimraf dist-cjs && npx builder --type=commonjs --sourceMap --entryPoint=index.ts --outDir=dist-cjs --outFile=index.cjs --external=espree && echo \"module.exports = module.exports.default;\" >> dist-cjs/index.cjs && node dist-cjs/index.cjs","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 --ignore-path .gitignore .","lint:fix":"eslint --ignore-path .gitignore . --fix","prepublishOnly":"npm run build:dist-types && npm run build:dist-cjs && 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":"7.18.0","@typescript-eslint/utils":"7.18.0","ts-api-utils":"^1.3.0"},"devDependencies":{"@checkdigit/jest-config":"^6.0.2","@checkdigit/prettier-config":"^5.5.0","@checkdigit/typescript-config":"6.0.0","@types/eslint":"8.56.10","@typescript-eslint/eslint-plugin":"7.18.0","@typescript-eslint/parser":"7.18.0","@typescript-eslint/rule-tester":"7.18.0","eslint-config-prettier":"^9.1.0","eslint-plugin-eslint-plugin":"^6.2.0","eslint-plugin-import":"^2.29.1","eslint-plugin-no-only-tests":"^3.1.0","eslint-plugin-no-secrets":"^1.0.2","eslint-plugin-node":"^11.1.0","eslint-plugin-sonarjs":"0.24.0","http-status-codes":"^2.3.0"},"peerDependencies":{"eslint":">=8 <9"},"engines":{"node":">=20.14"}}
package/src/index.ts CHANGED
@@ -8,8 +8,12 @@
8
8
 
9
9
  import invalidJsonStringify, { ruleId as invalidJsonStringifyRuleId } from './invalid-json-stringify';
10
10
  import noPromiseInstanceMethod, { ruleId as noPromiseInstanceMethodRuleId } from './no-promise-instance-method';
11
+ import requireResolveFullResponse, {
12
+ ruleId as requireResolveFullResponseRuleId,
13
+ } from './require-resolve-full-response';
11
14
  import filePathComment from './file-path-comment';
12
15
  import noCardNumbers from './no-card-numbers';
16
+ import noEnum from './no-enum';
13
17
  import noTestImport from './no-test-import';
14
18
  import noUuid from './no-uuid';
15
19
  import noWallabyComment from './no-wallaby-comment';
@@ -22,6 +26,7 @@ export default {
22
26
  rules: {
23
27
  'file-path-comment': filePathComment,
24
28
  'no-card-numbers': noCardNumbers,
29
+ 'no-enum': noEnum,
25
30
  'no-uuid': noUuid,
26
31
  'require-strict-assert': requireStrictAssert,
27
32
  'no-test-import': noTestImport,
@@ -31,11 +36,13 @@ export default {
31
36
  'object-literal-response': objectLiteralResponse,
32
37
  [invalidJsonStringifyRuleId]: invalidJsonStringify,
33
38
  [noPromiseInstanceMethodRuleId]: noPromiseInstanceMethod,
39
+ [requireResolveFullResponseRuleId]: requireResolveFullResponse,
34
40
  },
35
41
  configs: {
36
42
  all: {
37
43
  rules: {
38
44
  '@checkdigit/no-card-numbers': 'error',
45
+ '@checkdigit/no-enum': 'error',
39
46
  '@checkdigit/file-path-comment': 'error',
40
47
  '@checkdigit/no-uuid': 'error',
41
48
  '@checkdigit/require-strict-assert': 'error',
@@ -46,11 +53,13 @@ export default {
46
53
  '@checkdigit/no-test-import': 'error',
47
54
  [`@checkdigit/${invalidJsonStringifyRuleId}`]: 'error',
48
55
  [`@checkdigit/${noPromiseInstanceMethodRuleId}`]: 'error',
56
+ [`@checkdigit/${requireResolveFullResponseRuleId}`]: 'error',
49
57
  },
50
58
  },
51
59
  recommended: {
52
60
  rules: {
53
61
  '@checkdigit/no-card-numbers': 'error',
62
+ '@checkdigit/no-enum': 'error',
54
63
  '@checkdigit/file-path-comment': 'off',
55
64
  '@checkdigit/no-uuid': 'error',
56
65
  '@checkdigit/require-strict-assert': 'error',
@@ -0,0 +1,20 @@
1
+ // format.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 { TSESLint, TSESTree } from '@typescript-eslint/utils';
10
+ import type { Node } from 'estree';
11
+ import type { SourceCode } from 'eslint';
12
+ import { strict as assert } from 'node:assert';
13
+
14
+ export function getIndentation(node: Node | TSESTree.Node, sourceCode: SourceCode | TSESLint.SourceCode) {
15
+ assert.ok(node.loc);
16
+ const line = sourceCode.lines[node.loc.start.line - 1];
17
+ assert.ok(line !== undefined);
18
+ const indentMatch = line.match(/^\s*/u);
19
+ return indentMatch ? indentMatch[0] : '';
20
+ }