@checkdigit/eslint-plugin 6.6.0-PR.75-0869 → 6.6.0-PR.75-e4e7

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.
@@ -0,0 +1,61 @@
1
+ // src/fixture/add-url-domain.ts
2
+ import { AST_NODE_TYPES, ESLintUtils } from "@typescript-eslint/utils";
3
+ import { addBasePathUrlDomain } from "./url.mjs";
4
+ import getDocumentationUrl from "../get-documentation-url.mjs";
5
+ var ruleId = "add-url-domain";
6
+ var createRule = ESLintUtils.RuleCreator((name) => getDocumentationUrl(name));
7
+ var rule = createRule({
8
+ name: ruleId,
9
+ meta: {
10
+ type: "suggestion",
11
+ docs: {
12
+ description: "Add HTTP domain to the BASE_PATH like url constant variable."
13
+ },
14
+ messages: {
15
+ addDomain: "Add HTTP domain to the BASE_PATH like url constant variable.",
16
+ unknownError: 'Unknown error occurred in file "{{fileName}}": {{ error }}.'
17
+ },
18
+ fixable: "code",
19
+ schema: []
20
+ },
21
+ defaultOptions: [],
22
+ create(context) {
23
+ const sourceCode = context.sourceCode;
24
+ return {
25
+ "VariableDeclarator[id.name=/^([A-Z]+_)*BASE_PATH$/]": (basePathDeclarator) => {
26
+ try {
27
+ if (basePathDeclarator.init === null || basePathDeclarator.init.type !== AST_NODE_TYPES.Literal && basePathDeclarator.init.type !== AST_NODE_TYPES.TemplateLiteral) {
28
+ return;
29
+ }
30
+ const urlText = sourceCode.getText(basePathDeclarator.init);
31
+ const replacement = addBasePathUrlDomain(urlText);
32
+ if (replacement !== urlText) {
33
+ context.report({
34
+ messageId: "addDomain",
35
+ node: basePathDeclarator.init,
36
+ fix(fixer) {
37
+ return fixer.replaceText(basePathDeclarator.init, replacement);
38
+ }
39
+ });
40
+ }
41
+ } catch (error) {
42
+ console.error(`Failed to apply ${ruleId} rule for file "${context.filename}":`, error);
43
+ context.report({
44
+ node: basePathDeclarator,
45
+ messageId: "unknownError",
46
+ data: {
47
+ fileName: context.filename,
48
+ error: error instanceof Error ? error.toString() : JSON.stringify(error)
49
+ }
50
+ });
51
+ }
52
+ }
53
+ };
54
+ }
55
+ });
56
+ var add_url_domain_default = rule;
57
+ export {
58
+ add_url_domain_default as default,
59
+ ruleId
60
+ };
61
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL2ZpeHR1cmUvYWRkLXVybC1kb21haW4udHMiXSwKICAibWFwcGluZ3MiOiAiO0FBUUEsU0FBUyxnQkFBZ0IsbUJBQTZCO0FBQ3RELFNBQVMsNEJBQTRCO0FBQ3JDLE9BQU8seUJBQXlCO0FBRXpCLElBQU0sU0FBUztBQUV0QixJQUFNLGFBQWEsWUFBWSxZQUFZLENBQUMsU0FBUyxvQkFBb0IsSUFBSSxDQUFDO0FBRTlFLElBQU0sT0FBTyxXQUFXO0FBQUEsRUFDdEIsTUFBTTtBQUFBLEVBQ04sTUFBTTtBQUFBLElBQ0osTUFBTTtBQUFBLElBQ04sTUFBTTtBQUFBLE1BQ0osYUFBYTtBQUFBLElBQ2Y7QUFBQSxJQUNBLFVBQVU7QUFBQSxNQUNSLFdBQVc7QUFBQSxNQUNYLGNBQWM7QUFBQSxJQUNoQjtBQUFBLElBQ0EsU0FBUztBQUFBLElBQ1QsUUFBUSxDQUFDO0FBQUEsRUFDWDtBQUFBLEVBQ0EsZ0JBQWdCLENBQUM7QUFBQSxFQUNqQixPQUFPLFNBQVM7QUFDZCxVQUFNLGFBQWEsUUFBUTtBQUUzQixXQUFPO0FBQUEsTUFDTCx1REFBdUQsQ0FBQyx1QkFBb0Q7QUFDMUcsWUFBSTtBQUNGLGNBQ0UsbUJBQW1CLFNBQVMsUUFDM0IsbUJBQW1CLEtBQUssU0FBUyxlQUFlLFdBQy9DLG1CQUFtQixLQUFLLFNBQVMsZUFBZSxpQkFDbEQ7QUFDQTtBQUFBLFVBQ0Y7QUFFQSxnQkFBTSxVQUFVLFdBQVcsUUFBUSxtQkFBbUIsSUFBSTtBQUMxRCxnQkFBTSxjQUFjLHFCQUFxQixPQUFPO0FBRWhELGNBQUksZ0JBQWdCLFNBQVM7QUFDM0Isb0JBQVEsT0FBTztBQUFBLGNBQ2IsV0FBVztBQUFBLGNBQ1gsTUFBTSxtQkFBbUI7QUFBQSxjQUN6QixJQUFJLE9BQU87QUFDVCx1QkFBTyxNQUFNLFlBQVksbUJBQW1CLE1BQXVCLFdBQVc7QUFBQSxjQUNoRjtBQUFBLFlBQ0YsQ0FBQztBQUFBLFVBQ0g7QUFBQSxRQUNGLFNBQVMsT0FBTztBQUVkLGtCQUFRLE1BQU0sbUJBQW1CLE1BQU0sbUJBQW1CLFFBQVEsUUFBUSxNQUFNLEtBQUs7QUFDckYsa0JBQVEsT0FBTztBQUFBLFlBQ2IsTUFBTTtBQUFBLFlBQ04sV0FBVztBQUFBLFlBQ1gsTUFBTTtBQUFBLGNBQ0osVUFBVSxRQUFRO0FBQUEsY0FDbEIsT0FBTyxpQkFBaUIsUUFBUSxNQUFNLFNBQVMsSUFBSSxLQUFLLFVBQVUsS0FBSztBQUFBLFlBQ3pFO0FBQUEsVUFDRixDQUFDO0FBQUEsUUFDSDtBQUFBLE1BQ0Y7QUFBQSxJQUNGO0FBQUEsRUFDRjtBQUNGLENBQUM7QUFFRCxJQUFPLHlCQUFROyIsCiAgIm5hbWVzIjogW10KfQo=
@@ -62,6 +62,38 @@ var rule = createRule({
62
62
  }
63
63
  });
64
64
  }
65
+ },
66
+ 'CallExpression[callee.property.name="get"]': (responseHeadersAccess) => {
67
+ try {
68
+ if (responseHeadersAccess.callee.type !== AST_NODE_TYPES.MemberExpression) {
69
+ return;
70
+ }
71
+ const responseNode = responseHeadersAccess.callee.object;
72
+ const responseHeadersTsNode = parserServices.esTreeNodeToTSNodeMap.get(responseNode);
73
+ const responseType = typeChecker.getTypeAtLocation(responseHeadersTsNode);
74
+ const hasHeadersProperty = responseType.getProperties().some((symbol) => symbol.name === "headers");
75
+ if (!hasHeadersProperty) {
76
+ return;
77
+ }
78
+ const replacementText = `${sourceCode.getText(responseNode)}.headers`;
79
+ context.report({
80
+ messageId: "useGetter",
81
+ node: responseHeadersAccess,
82
+ fix(fixer) {
83
+ return fixer.replaceText(responseNode, replacementText);
84
+ }
85
+ });
86
+ } catch (error) {
87
+ console.error(`Failed to apply ${ruleId} rule for file "${context.filename}":`, error);
88
+ context.report({
89
+ node: responseHeadersAccess,
90
+ messageId: "unknownError",
91
+ data: {
92
+ fileName: context.filename,
93
+ error: error instanceof Error ? error.toString() : JSON.stringify(error)
94
+ }
95
+ });
96
+ }
65
97
  }
66
98
  };
67
99
  }
@@ -71,4 +103,4 @@ export {
71
103
  fetch_response_header_getter_ts_default as default,
72
104
  ruleId
73
105
  };
74
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL2ZpeHR1cmUvZmV0Y2gtcmVzcG9uc2UtaGVhZGVyLWdldHRlci10cy50cyJdLAogICJtYXBwaW5ncyI6ICI7QUFRQSxTQUFTLGdCQUFnQixtQkFBNkI7QUFDdEQsT0FBTyx5QkFBeUI7QUFFekIsSUFBTSxTQUFTO0FBRXRCLElBQU0sYUFBYSxZQUFZLFlBQVksQ0FBQyxTQUFTLG9CQUFvQixJQUFJLENBQUM7QUFFOUUsSUFBTSxPQUFPLFdBQVc7QUFBQSxFQUN0QixNQUFNO0FBQUEsRUFDTixNQUFNO0FBQUEsSUFDSixNQUFNO0FBQUEsSUFDTixNQUFNO0FBQUEsTUFDSixhQUFhO0FBQUEsSUFDZjtBQUFBLElBQ0EsVUFBVTtBQUFBLE1BQ1IsV0FBVztBQUFBLE1BQ1gsY0FBYztBQUFBLElBQ2hCO0FBQUEsSUFDQSxTQUFTO0FBQUEsSUFDVCxRQUFRLENBQUM7QUFBQSxFQUNYO0FBQUEsRUFDQSxnQkFBZ0IsQ0FBQztBQUFBLEVBQ2pCLE9BQU8sU0FBUztBQUNkLFVBQU0saUJBQWlCLFlBQVksa0JBQWtCLE9BQU87QUFDNUQsVUFBTSxjQUFjLGVBQWUsUUFBUSxlQUFlO0FBQzFELFVBQU0sYUFBYSxRQUFRO0FBRTNCLFdBQU87QUFBQSxNQUNMLG9EQUFvRCxDQUFDLDBCQUFxRDtBQUN4RyxZQUFJO0FBQ0YsY0FDRSxzQkFBc0IsU0FBUyxTQUFTLGVBQWUsY0FDdkQsc0JBQXNCLFNBQVMsU0FBUyxPQUN4QztBQUVBO0FBQUEsVUFDRjtBQUVBLGdCQUFNLHdCQUF3QixlQUFlLHNCQUFzQixJQUFJLHNCQUFzQixNQUFNO0FBQ25HLGdCQUFNLGVBQWUsWUFBWSxrQkFBa0IscUJBQXFCO0FBRXhFLGdCQUFNLGdCQUFnQixhQUFhLGNBQWMsRUFBRSxLQUFLLENBQUMsV0FBVyxPQUFPLFNBQVMsS0FBSztBQUN6RixjQUFJLENBQUMsZUFBZTtBQUNsQjtBQUFBLFVBQ0Y7QUFNQSxjQUFJO0FBQ0osY0FBSSxzQkFBc0IsU0FBUyxTQUFTLGVBQWUsWUFBWTtBQUNyRSw4QkFBa0IsR0FBRyxXQUFXLFFBQVEsc0JBQXNCLE1BQU0sQ0FBQyxRQUFRLFdBQVcsUUFBUSxzQkFBc0IsUUFBUSxDQUFDO0FBQUEsVUFDakksV0FBVyxzQkFBc0IsU0FBUyxTQUFTLGVBQWUsaUJBQWlCO0FBQ2pGLDhCQUFrQixHQUFHLFdBQVcsUUFBUSxzQkFBc0IsTUFBTSxDQUFDLFFBQVEsV0FBVyxRQUFRLHNCQUFzQixRQUFRLENBQUM7QUFBQSxVQUNqSSxXQUFXLHNCQUFzQixTQUFTLFNBQVMsZUFBZSxTQUFTO0FBQ3pFLDhCQUFrQixzQkFBc0IsV0FDcEMsR0FBRyxXQUFXLFFBQVEsc0JBQXNCLE1BQU0sQ0FBQyxRQUFRLFdBQVcsUUFBUSxzQkFBc0IsUUFBUSxDQUFDLE1BQzdHLEdBQUcsV0FBVyxRQUFRLHNCQUFzQixNQUFNLENBQUMsU0FBUyxXQUFXLFFBQVEsc0JBQXNCLFFBQVEsQ0FBQztBQUFBLFVBQ3BILE9BQU87QUFDTCxrQkFBTSxJQUFJLE1BQU0sNkJBQTZCLHNCQUFzQixTQUFTLElBQUksRUFBRTtBQUFBLFVBQ3BGO0FBRUEsa0JBQVEsT0FBTztBQUFBLFlBQ2IsV0FBVztBQUFBLFlBQ1gsTUFBTSxzQkFBc0I7QUFBQSxZQUM1QixJQUFJLE9BQU87QUFDVCxxQkFBTyxNQUFNLFlBQVksdUJBQXVCLGVBQWU7QUFBQSxZQUNqRTtBQUFBLFVBQ0YsQ0FBQztBQUFBLFFBQ0gsU0FBUyxPQUFPO0FBRWQsa0JBQVEsTUFBTSxtQkFBbUIsTUFBTSxtQkFBbUIsUUFBUSxRQUFRLE1BQU0sS0FBSztBQUNyRixrQkFBUSxPQUFPO0FBQUEsWUFDYixNQUFNO0FBQUEsWUFDTixXQUFXO0FBQUEsWUFDWCxNQUFNO0FBQUEsY0FDSixVQUFVLFFBQVE7QUFBQSxjQUNsQixPQUFPLGlCQUFpQixRQUFRLE1BQU0sU0FBUyxJQUFJLEtBQUssVUFBVSxLQUFLO0FBQUEsWUFDekU7QUFBQSxVQUNGLENBQUM7QUFBQSxRQUNIO0FBQUEsTUFDRjtBQUFBLElBQ0Y7QUFBQSxFQUNGO0FBQ0YsQ0FBQztBQUVELElBQU8sMENBQVE7IiwKICAibmFtZXMiOiBbXQp9Cg==
106
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL2ZpeHR1cmUvZmV0Y2gtcmVzcG9uc2UtaGVhZGVyLWdldHRlci10cy50cyJdLAogICJtYXBwaW5ncyI6ICI7QUFRQSxTQUFTLGdCQUFnQixtQkFBNkI7QUFDdEQsT0FBTyx5QkFBeUI7QUFFekIsSUFBTSxTQUFTO0FBRXRCLElBQU0sYUFBYSxZQUFZLFlBQVksQ0FBQyxTQUFTLG9CQUFvQixJQUFJLENBQUM7QUFFOUUsSUFBTSxPQUFPLFdBQVc7QUFBQSxFQUN0QixNQUFNO0FBQUEsRUFDTixNQUFNO0FBQUEsSUFDSixNQUFNO0FBQUEsSUFDTixNQUFNO0FBQUEsTUFDSixhQUFhO0FBQUEsSUFDZjtBQUFBLElBQ0EsVUFBVTtBQUFBLE1BQ1IsV0FBVztBQUFBLE1BQ1gsY0FBYztBQUFBLElBQ2hCO0FBQUEsSUFDQSxTQUFTO0FBQUEsSUFDVCxRQUFRLENBQUM7QUFBQSxFQUNYO0FBQUEsRUFDQSxnQkFBZ0IsQ0FBQztBQUFBLEVBQ2pCLE9BQU8sU0FBUztBQUNkLFVBQU0saUJBQWlCLFlBQVksa0JBQWtCLE9BQU87QUFDNUQsVUFBTSxjQUFjLGVBQWUsUUFBUSxlQUFlO0FBQzFELFVBQU0sYUFBYSxRQUFRO0FBRTNCLFdBQU87QUFBQSxNQUNMLG9EQUFvRCxDQUFDLDBCQUFxRDtBQUN4RyxZQUFJO0FBQ0YsY0FDRSxzQkFBc0IsU0FBUyxTQUFTLGVBQWUsY0FDdkQsc0JBQXNCLFNBQVMsU0FBUyxPQUN4QztBQUVBO0FBQUEsVUFDRjtBQUVBLGdCQUFNLHdCQUF3QixlQUFlLHNCQUFzQixJQUFJLHNCQUFzQixNQUFNO0FBQ25HLGdCQUFNLGVBQWUsWUFBWSxrQkFBa0IscUJBQXFCO0FBRXhFLGdCQUFNLGdCQUFnQixhQUFhLGNBQWMsRUFBRSxLQUFLLENBQUMsV0FBVyxPQUFPLFNBQVMsS0FBSztBQUN6RixjQUFJLENBQUMsZUFBZTtBQUNsQjtBQUFBLFVBQ0Y7QUFNQSxjQUFJO0FBQ0osY0FBSSxzQkFBc0IsU0FBUyxTQUFT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
@@ -104,6 +104,9 @@ var rule = createRule({
104
104
  return {
105
105
  "CallExpression[callee.property.name=/^(head|get|put|post|del|patch)$/]": (serviceCall) => {
106
106
  try {
107
+ if (!isCalleeServiceWrapper(serviceCall)) {
108
+ return;
109
+ }
107
110
  const enclosingScopeNode = getEnclosingScopeNode(serviceCall);
108
111
  assert.ok(enclosingScopeNode, "enclosingScopeNode is undefined");
109
112
  const scope = scopeManager?.acquire(enclosingScopeNode);
@@ -112,9 +115,6 @@ var rule = createRule({
112
115
  if (!isUrlArgumentValid(urlArgument, scope)) {
113
116
  return;
114
117
  }
115
- if (!isCalleeServiceWrapper(serviceCall)) {
116
- return;
117
- }
118
118
  assert.ok(serviceCall.callee.type === AST_NODE_TYPES.MemberExpression);
119
119
  assert.ok(serviceCall.callee.property.type === AST_NODE_TYPES.Identifier);
120
120
  const method = serviceCall.callee.property.name;
@@ -181,4 +181,4 @@ export {
181
181
  no_service_wrapper_default as default,
182
182
  ruleId
183
183
  };
184
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL2ZpeHR1cmUvbm8tc2VydmljZS13cmFwcGVyLnRzIl0sCiAgIm1hcHBpbmdzIjogIjtBQVFBLFNBQVMsZ0JBQWdCLG1CQUE2QjtBQUN0RCxTQUFTLHNCQUFrQztBQUMzQyxTQUFTLGtCQUFrQixzQkFBc0IsMENBQTBDO0FBQzNGLFNBQVMsVUFBVSxjQUFjO0FBQ2pDLE9BQU8seUJBQXlCO0FBQ2hDLFNBQVMsNkJBQTZCO0FBQ3RDLFNBQVMsc0JBQXNCO0FBRXhCLElBQU0sU0FBUztBQUV0QixJQUFNLGFBQWEsWUFBWSxZQUFZLENBQUMsU0FBUyxvQkFBb0IsSUFBSSxDQUFDO0FBRTlFLElBQU0sT0FBTyxXQUFXO0FBQUEsRUFDdEIsTUFBTTtBQUFBLEVBQ04sTUFBTTtBQUFBLElBQ0osTUFBTTtBQUFBLElBQ04sTUFBTTtBQUFBLE1BQ0osYUFBYTtBQUFBLElBQ2Y7QUFBQSxJQUNBLFVBQVU7QUFBQSxNQUNSLG1CQUFtQjtBQUFBLE1BQ25CLGdCQUNFO0FBQUEsTUFDRixjQUNFO0FBQUEsSUFDSjtBQUFBLElBQ0EsU0FBUztBQUFBLElBQ1QsUUFBUSxDQUFDO0FBQUEsRUFDWDtBQUFBLEVBQ0EsZ0JBQWdCLENBQUM7QUFBQSxFQUNqQixPQUFPLFNBQVM7QUFDZCxVQUFNLGFBQWEsUUFBUTtBQUMzQixVQUFNLGVBQWUsV0FBVztBQUNoQyxVQUFNLGdCQUFnQixZQUFZLGtCQUFrQixPQUFPO0FBQzNELFVBQU0sY0FBYyxjQUFjLFFBQVEsZUFBZTtBQUV6RCxhQUFTLG1CQUFtQixhQUF3QyxPQUFjO0FBQ2hGLFVBQ0csYUFBYSxTQUFTLGVBQWUsV0FBVyxPQUFPLFlBQVksVUFBVSxZQUM5RSxhQUFhLFNBQVMsZUFBZSxpQkFDckM7QUFDQSxjQUFNLFVBQVUsV0FBVyxRQUFRLFdBQVc7QUFDOUMsZUFBTyxpQkFBaUIsS0FBSyxPQUFPLEtBQUsscUJBQXFCLEtBQUssT0FBTztBQUFBLE1BQzVFO0FBRUEsVUFBSSxhQUFhLFNBQVMs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
184
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL2ZpeHR1cmUvbm8tc2VydmljZS13cmFwcGVyLnRzIl0sCiAgIm1hcHBpbmdzIjogIjtBQVFBLFNBQVMsZ0JBQWdCLG1CQUE2QjtBQUN0RCxTQUFTLHNCQUFrQztBQUMzQyxTQUFTLGtCQUFrQixzQkFBc0IsMENBQTBDO0FBQzNGLFNBQVMsVUFBVSxjQUFjO0FBQ2pDLE9BQU8seUJBQXlCO0FBQ2hDLFNBQVMsNkJBQTZCO0FBQ3RDLFNBQVMsc0JBQXNCO0FBRXhCLElBQU0sU0FBUztBQUV0QixJQUFNLGFBQWEsWUFBWSxZQUFZLENBQUMsU0FBUyxvQkFBb0IsSUFBSSxDQUFDO0FBRTlFLElBQU0sT0FBTyxXQUFXO0FBQUEsRUFDdEIsTUFBTTtBQUFBLEVBQ04sTUFBTTtBQUFBLElBQ0osTUFBTTtBQUFBLElBQ04sTUFBTTtBQUFBLE1BQ0osYUFBYTtBQUFBLElBQ2Y7QUFBQSxJQUNBLFVBQVU7QUFBQSxNQUNSLG1CQUFtQjtBQUFBLE1BQ25CLGdCQUNFO0FBQUEsTUFDRixjQUNFO0FBQUEsSUFDSjtBQUFBLElBQ0EsU0FBUztBQUFBLElBQ1QsUUFBUSxDQUFDO0FBQUEsRUFDWDtBQUFBLEVBQ0EsZ0JBQWdCLENBQUM7QUFBQSxFQUNqQixPQUFPLFNBQVM7QUFDZCxVQUFNLGFBQWEsUUFBUTtBQUMzQixVQUFNLGVBQWUsV0FBVztBQUNoQyxVQUFNLGdCQUFnQixZQUFZLGtCQUFrQixPQUFPO0FBQzNELFVBQU0sY0FBYyxjQUFjLFFBQVEsZUFBZTtBQUV6RCxhQUFTLG1CQUFtQixhQUF3QyxPQUFjO0FBQ2hGLFVBQ0csYUFBYSxTQUFTLGVBQWUsV0FBVyxPQUFPLFlBQVksVUFBVSxZQUM5RSxhQUFhLFNBQVMsZUFBZSxpQkFDckM7QUFDQSxjQUFNLFVBQVUsV0FBVyxRQUFRLFdBQVc7QUFDOUMsZUFBTyxpQkFBaUIsS0FBSyxPQUFPLEtBQUsscUJBQXFCLEtBQUssT0FBTztBQUFBLE1BQzVFO0FBRUEsVUFBSSxhQUFhLFNBQVMs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
@@ -5,12 +5,22 @@ function replaceEndpointUrlPrefixWithBasePath(url) {
5
5
  return url.replace(/^`\/\w+(?<parts>-\w+)*\/v\d+\//u, "`${BASE_PATH}/");
6
6
  }
7
7
  function replaceEndpointUrlPrefixWithDomain(url) {
8
- return url.replace(/\/(?<servicename>\w+(?<parts>-\w+)*)(?<path>\/v\d+\/.*$)/u, "https://$1.checkdigit/$1$3");
8
+ return url.replace(
9
+ /^(?<quotStart>[`'])\/(?<servicename>\w+(?<parts>-\w+)*)(?<path>\/v\d+\/(?<any>.|\r|\n)+(?<quotEnd>[`'])$)/u,
10
+ "$1https://$2.checkdigit/$2$4"
11
+ );
12
+ }
13
+ function addBasePathUrlDomain(url) {
14
+ return url.replace(
15
+ /^(?<quotStart>[`'])\/(?<servicename>\w+(?<parts>-\w+)*)(?<path>\/v\d+(?<quotEnd>[`'])$)/u,
16
+ "$1https://$2.checkdigit/$2$4"
17
+ );
9
18
  }
10
19
  export {
11
20
  PLAIN_URL_REGEXP,
12
21
  TOKENIZED_URL_REGEXP,
22
+ addBasePathUrlDomain,
13
23
  replaceEndpointUrlPrefixWithBasePath,
14
24
  replaceEndpointUrlPrefixWithDomain
15
25
  };
16
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL2ZpeHR1cmUvdXJsLnRzIl0sCiAgIm1hcHBpbmdzIjogIjtBQUVPLElBQU0sbUJBQW1CO0FBQ3pCLElBQU0sdUJBQXVCO0FBRTdCLFNBQVMscUNBQXFDLEtBQWE7QUFFaEUsU0FBTyxJQUFJLFFBQVEsbUNBQW1DLGdCQUFnQjtBQUN4RTtBQUVPLFNBQVMsbUNBQW1DLEtBQWE7QUFFOUQsU0FBTyxJQUFJLFFBQVEsNkRBQTZELDRCQUE0QjtBQUM5RzsiLAogICJuYW1lcyI6IFtdCn0K
26
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL2ZpeHR1cmUvdXJsLnRzIl0sCiAgIm1hcHBpbmdzIjogIjtBQUVPLElBQU0sbUJBQW1CO0FBQ3pCLElBQU0sdUJBQXVCO0FBRTdCLFNBQVMscUNBQXFDLEtBQWE7QUFFaEUsU0FBTyxJQUFJLFFBQVEsbUNBQW1DLGdCQUFnQjtBQUN4RTtBQUVPLFNBQVMsbUNBQW1DLEtBQWE7QUFDOUQsU0FBTyxJQUFJO0FBQUEsSUFDVDtBQUFBLElBQ0E7QUFBQSxFQUNGO0FBQ0Y7QUFFTyxTQUFTLHFCQUFxQixLQUFhO0FBQ2hELFNBQU8sSUFBSTtBQUFBLElBQ1Q7QUFBQSxJQUNBO0FBQUEsRUFDRjtBQUNGOyIsCiAgIm5hbWVzIjogW10KfQo=
@@ -1,4 +1,5 @@
1
1
  // src/index.ts
2
+ import addUrlDomain, { ruleId as addUrlDomainRuleId } from "./fixture/add-url-domain.mjs";
2
3
  import fetchHeaderGetter, { ruleId as fetchHeaderGetterRuleId } from "./fixture/fetch-header-getter.mjs";
3
4
  import fetchResponseBodyJson, { ruleId as fetchResponseBodyJsonRuleId } from "./fixture/fetch-response-body-json.mjs";
4
5
  import fetchResponseHeaderGetterTs, {
@@ -38,7 +39,8 @@ var src_default = {
38
39
  [noServiceWrapperRuleId]: noServiceWrapper,
39
40
  [noStatusCodeRuleId]: noStatusCode,
40
41
  [fetchResponseBodyJsonRuleId]: fetchResponseBodyJson,
41
- [fetchResponseHeaderGetterTsRuleId]: fetchResponseHeaderGetterTs
42
+ [fetchResponseHeaderGetterTsRuleId]: fetchResponseHeaderGetterTs,
43
+ [addUrlDomainRuleId]: addUrlDomain
42
44
  },
43
45
  configs: {
44
46
  all: {
@@ -60,7 +62,8 @@ var src_default = {
60
62
  [`@checkdigit/${noServiceWrapperRuleId}`]: "error",
61
63
  [`@checkdigit/${noStatusCodeRuleId}`]: "error",
62
64
  [`@checkdigit/${fetchResponseBodyJsonRuleId}`]: "error",
63
- [`@checkdigit/${fetchResponseHeaderGetterTsRuleId}`]: "error"
65
+ [`@checkdigit/${fetchResponseHeaderGetterTsRuleId}`]: "error",
66
+ [`@checkdigit/${addUrlDomainRuleId}`]: "error"
64
67
  }
65
68
  },
66
69
  recommended: {
@@ -83,4 +86,4 @@ var src_default = {
83
86
  export {
84
87
  src_default as default
85
88
  };
86
- //# sourceMappingURL=data:application/json;base64,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
89
+ //# sourceMappingURL=data:application/json;base64,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
@@ -0,0 +1,4 @@
1
+ import { ESLintUtils } from '@typescript-eslint/utils';
2
+ export declare const ruleId = "add-url-domain";
3
+ declare const rule: ESLintUtils.RuleModule<"addDomain" | "unknownError", never[], ESLintUtils.RuleListener>;
4
+ export default rule;
@@ -1,4 +1,4 @@
1
1
  import { ESLintUtils } from '@typescript-eslint/utils';
2
2
  export declare const ruleId = "fetch-response-body-json";
3
- declare const rule: ESLintUtils.RuleModule<"replaceBodyWithJson" | "unknownError", never[], ESLintUtils.RuleListener>;
3
+ declare const rule: ESLintUtils.RuleModule<"unknownError" | "replaceBodyWithJson", never[], ESLintUtils.RuleListener>;
4
4
  export default rule;
@@ -2,3 +2,4 @@ export declare const PLAIN_URL_REGEXP: RegExp;
2
2
  export declare const TOKENIZED_URL_REGEXP: RegExp;
3
3
  export declare function replaceEndpointUrlPrefixWithBasePath(url: string): string;
4
4
  export declare function replaceEndpointUrlPrefixWithDomain(url: string): string;
5
+ export declare function addBasePathUrlDomain(url: string): string;
@@ -16,8 +16,9 @@ declare const _default: {
16
16
  "fetch-then": import("eslint").Rule.RuleModule;
17
17
  "no-service-wrapper": import("@typescript-eslint/utils/ts-eslint").RuleModule<"unknownError" | "preferNativeFetch" | "invalidOptions", never[], import("@typescript-eslint/utils/ts-eslint").RuleListener>;
18
18
  "no-status-code": import("@typescript-eslint/utils/ts-eslint").RuleModule<"unknownError" | "replaceStatusCode", never[], import("@typescript-eslint/utils/ts-eslint").RuleListener>;
19
- "fetch-response-body-json": import("@typescript-eslint/utils/ts-eslint").RuleModule<"replaceBodyWithJson" | "unknownError", never[], import("@typescript-eslint/utils/ts-eslint").RuleListener>;
19
+ "fetch-response-body-json": import("@typescript-eslint/utils/ts-eslint").RuleModule<"unknownError" | "replaceBodyWithJson", never[], import("@typescript-eslint/utils/ts-eslint").RuleListener>;
20
20
  "fetch-response-header-getter-ts": import("@typescript-eslint/utils/ts-eslint").RuleModule<"unknownError" | "useGetter", never[], import("@typescript-eslint/utils/ts-eslint").RuleListener>;
21
+ "add-url-domain": import("@typescript-eslint/utils/ts-eslint").RuleModule<"addDomain" | "unknownError", never[], import("@typescript-eslint/utils/ts-eslint").RuleListener>;
21
22
  };
22
23
  configs: {
23
24
  all: {
@@ -40,6 +41,7 @@ declare const _default: {
40
41
  "@checkdigit/no-status-code": string;
41
42
  "@checkdigit/fetch-response-body-json": string;
42
43
  "@checkdigit/fetch-response-header-getter-ts": string;
44
+ "@checkdigit/add-url-domain": string;
43
45
  };
44
46
  };
45
47
  recommended: {
package/package.json CHANGED
@@ -1 +1 @@
1
- {"name":"@checkdigit/eslint-plugin","version":"6.6.0-PR.75-0869","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","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"},"peerDependencies":{"eslint":">=8 <9"},"engines":{"node":">=20.14"}}
1
+ {"name":"@checkdigit/eslint-plugin","version":"6.6.0-PR.75-e4e7","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","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"},"peerDependencies":{"eslint":">=8 <9"},"engines":{"node":">=20.14"}}
@@ -0,0 +1,75 @@
1
+ // fixture/add-url-domain.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
+ import { addBasePathUrlDomain } from './url';
11
+ import getDocumentationUrl from '../get-documentation-url';
12
+
13
+ export const ruleId = 'add-url-domain';
14
+
15
+ const createRule = ESLintUtils.RuleCreator((name) => getDocumentationUrl(name));
16
+
17
+ const rule = createRule({
18
+ name: ruleId,
19
+ meta: {
20
+ type: 'suggestion',
21
+ docs: {
22
+ description: 'Add HTTP domain to the BASE_PATH like url constant variable.',
23
+ },
24
+ messages: {
25
+ addDomain: 'Add HTTP domain to the BASE_PATH like url constant variable.',
26
+ unknownError: 'Unknown error occurred in file "{{fileName}}": {{ error }}.',
27
+ },
28
+ fixable: 'code',
29
+ schema: [],
30
+ },
31
+ defaultOptions: [],
32
+ create(context) {
33
+ const sourceCode = context.sourceCode;
34
+
35
+ return {
36
+ 'VariableDeclarator[id.name=/^([A-Z]+_)*BASE_PATH$/]': (basePathDeclarator: TSESTree.VariableDeclarator) => {
37
+ try {
38
+ if (
39
+ basePathDeclarator.init === null ||
40
+ (basePathDeclarator.init.type !== AST_NODE_TYPES.Literal &&
41
+ basePathDeclarator.init.type !== AST_NODE_TYPES.TemplateLiteral)
42
+ ) {
43
+ return;
44
+ }
45
+
46
+ const urlText = sourceCode.getText(basePathDeclarator.init); /*?*/
47
+ const replacement = addBasePathUrlDomain(urlText); /*?*/
48
+
49
+ if (replacement !== urlText) {
50
+ context.report({
51
+ messageId: 'addDomain',
52
+ node: basePathDeclarator.init,
53
+ fix(fixer) {
54
+ return fixer.replaceText(basePathDeclarator.init as TSESTree.Node, replacement);
55
+ },
56
+ });
57
+ }
58
+ } catch (error) {
59
+ // eslint-disable-next-line no-console
60
+ console.error(`Failed to apply ${ruleId} rule for file "${context.filename}":`, error);
61
+ context.report({
62
+ node: basePathDeclarator,
63
+ messageId: 'unknownError',
64
+ data: {
65
+ fileName: context.filename,
66
+ error: error instanceof Error ? error.toString() : JSON.stringify(error),
67
+ },
68
+ });
69
+ }
70
+ },
71
+ };
72
+ },
73
+ });
74
+
75
+ export default rule;
@@ -89,6 +89,41 @@ const rule = createRule({
89
89
  });
90
90
  }
91
91
  },
92
+ 'CallExpression[callee.property.name="get"]': (responseHeadersAccess: TSESTree.CallExpression) => {
93
+ try {
94
+ if (responseHeadersAccess.callee.type !== AST_NODE_TYPES.MemberExpression) {
95
+ return;
96
+ }
97
+
98
+ const responseNode = responseHeadersAccess.callee.object;
99
+ const responseHeadersTsNode = parserServices.esTreeNodeToTSNodeMap.get(responseNode);
100
+ const responseType = typeChecker.getTypeAtLocation(responseHeadersTsNode);
101
+ const hasHeadersProperty = responseType.getProperties().some((symbol) => symbol.name === 'headers');
102
+ if (!hasHeadersProperty) {
103
+ return;
104
+ }
105
+
106
+ const replacementText = `${sourceCode.getText(responseNode)}.headers`;
107
+ context.report({
108
+ messageId: 'useGetter',
109
+ node: responseHeadersAccess,
110
+ fix(fixer) {
111
+ return fixer.replaceText(responseNode, replacementText);
112
+ },
113
+ });
114
+ } catch (error) {
115
+ // eslint-disable-next-line no-console
116
+ console.error(`Failed to apply ${ruleId} rule for file "${context.filename}":`, error);
117
+ context.report({
118
+ node: responseHeadersAccess,
119
+ messageId: 'unknownError',
120
+ data: {
121
+ fileName: context.filename,
122
+ error: error instanceof Error ? error.toString() : JSON.stringify(error),
123
+ },
124
+ });
125
+ }
126
+ },
92
127
  };
93
128
  },
94
129
  });
@@ -135,21 +135,19 @@ const rule = createRule({
135
135
  serviceCall: TSESTree.CallExpression,
136
136
  ) => {
137
137
  try {
138
+ if (!isCalleeServiceWrapper(serviceCall)) {
139
+ return;
140
+ }
141
+
138
142
  const enclosingScopeNode = getEnclosingScopeNode(serviceCall);
139
143
  assert.ok(enclosingScopeNode, 'enclosingScopeNode is undefined');
140
144
  const scope = scopeManager?.acquire(enclosingScopeNode);
141
145
  assert.ok(scope, 'scope is undefined');
142
-
143
146
  const urlArgument = serviceCall.arguments[0];
144
-
145
147
  if (!isUrlArgumentValid(urlArgument, scope)) {
146
148
  return;
147
149
  }
148
150
 
149
- if (!isCalleeServiceWrapper(serviceCall)) {
150
- return;
151
- }
152
-
153
151
  assert.ok(serviceCall.callee.type === AST_NODE_TYPES.MemberExpression);
154
152
  assert.ok(serviceCall.callee.property.type === AST_NODE_TYPES.Identifier);
155
153
 
@@ -9,6 +9,15 @@ export function replaceEndpointUrlPrefixWithBasePath(url: string) {
9
9
  }
10
10
 
11
11
  export function replaceEndpointUrlPrefixWithDomain(url: string) {
12
- // eslint-disable-next-line no-template-curly-in-string
13
- return url.replace(/\/(?<servicename>\w+(?<parts>-\w+)*)(?<path>\/v\d+\/.*$)/u, 'https://$1.checkdigit/$1$3');
12
+ return url.replace(
13
+ /^(?<quotStart>[`'])\/(?<servicename>\w+(?<parts>-\w+)*)(?<path>\/v\d+\/(?<any>.|\r|\n)+(?<quotEnd>[`'])$)/u,
14
+ '$1https://$2.checkdigit/$2$4',
15
+ );
16
+ }
17
+
18
+ export function addBasePathUrlDomain(url: string) {
19
+ return url.replace(
20
+ /^(?<quotStart>[`'])\/(?<servicename>\w+(?<parts>-\w+)*)(?<path>\/v\d+(?<quotEnd>[`'])$)/u,
21
+ '$1https://$2.checkdigit/$2$4',
22
+ );
14
23
  }
package/src/index.ts CHANGED
@@ -6,6 +6,7 @@
6
6
  * This code is licensed under the MIT license (see LICENSE.txt for details).
7
7
  */
8
8
 
9
+ import addUrlDomain, { ruleId as addUrlDomainRuleId } from './fixture/add-url-domain';
9
10
  import fetchHeaderGetter, { ruleId as fetchHeaderGetterRuleId } from './fixture/fetch-header-getter';
10
11
  import fetchResponseBodyJson, { ruleId as fetchResponseBodyJsonRuleId } from './fixture/fetch-response-body-json';
11
12
  import fetchResponseHeaderGetterTs, {
@@ -47,6 +48,7 @@ export default {
47
48
  [noStatusCodeRuleId]: noStatusCode,
48
49
  [fetchResponseBodyJsonRuleId]: fetchResponseBodyJson,
49
50
  [fetchResponseHeaderGetterTsRuleId]: fetchResponseHeaderGetterTs,
51
+ [addUrlDomainRuleId]: addUrlDomain,
50
52
  },
51
53
  configs: {
52
54
  all: {
@@ -69,6 +71,7 @@ export default {
69
71
  [`@checkdigit/${noStatusCodeRuleId}`]: 'error',
70
72
  [`@checkdigit/${fetchResponseBodyJsonRuleId}`]: 'error',
71
73
  [`@checkdigit/${fetchResponseHeaderGetterTsRuleId}`]: 'error',
74
+ [`@checkdigit/${addUrlDomainRuleId}`]: 'error',
72
75
  },
73
76
  },
74
77
  recommended: {