@checkdigit/eslint-plugin 6.6.0-PR.75-b2d2 → 6.6.0-PR.75-1cd1

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.
@@ -3,11 +3,11 @@ import { strict as assert } from "node:assert";
3
3
  function getIndentation(node, sourceCode) {
4
4
  assert.ok(node.loc);
5
5
  const line = sourceCode.lines[node.loc.start.line - 1];
6
- assert.ok(line);
6
+ assert.ok(line !== void 0);
7
7
  const indentMatch = line.match(/^\s*/u);
8
8
  return indentMatch ? indentMatch[0] : "";
9
9
  }
10
10
  export {
11
11
  getIndentation
12
12
  };
13
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL2FzdC9mb3JtYXQudHMiXSwKICAibWFwcGluZ3MiOiAiO0FBVUEsU0FBUyxVQUFVLGNBQWM7QUFFMUIsU0FBUyxlQUFlLE1BQVksWUFBd0I7QUFDakUsU0FBTyxHQUFHLEtBQUssR0FBRztBQUNsQixRQUFNLE9BQU8sV0FBVyxNQUFNLEtBQUssSUFBSSxNQUFNLE9BQU8sQ0FBQztBQUNyRCxTQUFPLEdBQUcsSUFBSTtBQUNkLFFBQU0sY0FBYyxLQUFLLE1BQU0sT0FBTztBQUN0QyxTQUFPLGNBQWMsWUFBWSxDQUFDLElBQUk7QUFDeEM7IiwKICAibmFtZXMiOiBbXQp9Cg==
13
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL2FzdC9mb3JtYXQudHMiXSwKICAibWFwcGluZ3MiOiAiO0FBVUEsU0FBUyxVQUFVLGNBQWM7QUFFMUIsU0FBUyxlQUFlLE1BQVksWUFBd0I7QUFDakUsU0FBTyxHQUFHLEtBQUssR0FBRztBQUNsQixRQUFNLE9BQU8sV0FBVyxNQUFNLEtBQUssSUFBSSxNQUFNLE9BQU8sQ0FBQztBQUNyRCxTQUFPLEdBQUcsU0FBUyxNQUFTO0FBQzVCLFFBQU0sY0FBYyxLQUFLLE1BQU0sT0FBTztBQUN0QyxTQUFPLGNBQWMsWUFBWSxDQUFDLElBQUk7QUFDeEM7IiwKICAibmFtZXMiOiBbXQp9Cg==
@@ -2,19 +2,37 @@
2
2
  function getParent(node) {
3
3
  return node.parent;
4
4
  }
5
- function getAncestor(node, matcher, typeToExit) {
5
+ function getAncestor(node, matcher, exitMatcher) {
6
6
  const parent = getParent(node);
7
- if (!parent || typeToExit !== void 0 && parent.type === typeToExit) {
7
+ if (!parent) {
8
8
  return void 0;
9
9
  } else if (typeof matcher === "string" && parent.type === matcher) {
10
10
  return parent;
11
11
  } else if (typeof matcher === "function" && matcher(parent)) {
12
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;
13
17
  }
14
- return getAncestor(parent, matcher, typeToExit);
18
+ return getAncestor(parent, matcher, exitMatcher);
19
+ }
20
+ function getEnclosingStatement(node) {
21
+ return getAncestor(
22
+ node,
23
+ (parentNode) => parentNode.type.endsWith("Statement") || parentNode.type.endsWith("Declaration")
24
+ );
25
+ }
26
+ function getEnclosingScopeNode(node) {
27
+ return getAncestor(
28
+ node,
29
+ (parentNode) => ["FunctionExpression", "FunctionDeclaration", "ArrowFunctionExpression"].includes(parentNode.type)
30
+ );
15
31
  }
16
32
  export {
17
33
  getAncestor,
34
+ getEnclosingScopeNode,
35
+ getEnclosingStatement,
18
36
  getParent
19
37
  };
20
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL2FzdC90cmVlLnRzIl0sCiAgIm1hcHBpbmdzIjogIjtBQWdCTyxTQUFTLFVBQVUsTUFBcUM7QUFDN0QsU0FBUSxLQUF3QztBQUNsRDtBQUVPLFNBQVMsWUFBWSxNQUFZLFNBQWlELFlBQXFCO0FBQzVHLFFBQU0sU0FBUyxVQUFVLElBQUk7QUFDN0IsTUFBSSxDQUFDLFVBQVcsZUFBZSxVQUFhLE9BQU8sU0FBUyxZQUFhO0FBQ3ZFLFdBQU87QUFBQSxFQUNULFdBQVcsT0FBTyxZQUFZLFlBQVksT0FBTyxTQUFTLFNBQVM7QUFDakUsV0FBTztBQUFBLEVBQ1QsV0FBVyxPQUFPLFlBQVksY0FBYyxRQUFRLE1BQU0sR0FBRztBQUMzRCxXQUFPO0FBQUEsRUFDVDtBQUNBLFNBQU8sWUFBWSxRQUFRLFNBQVMsVUFBVTtBQUNoRDsiLAogICJuYW1lcyI6IFtdCn0K
38
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL2FzdC90cmVlLnRzIl0sCiAgIm1hcHBpbmdzIjogIjtBQWdCTyxTQUFTLFVBQVUsTUFBcUM7QUFDN0QsU0FBUSxLQUF3QztBQUNsRDtBQUVPLFNBQVMsWUFDZCxNQUNBLFNBQ0EsYUFDa0I7QUFDbEIsUUFBTSxTQUFTLFVBQVUsSUFBSTtBQUM3QixNQUFJLENBQUMsUUFBUTtBQUNYLFdBQU87QUFBQSxFQUNULFdBQVcsT0FBTyxZQUFZLFlBQVksT0FBTyxTQUFTLFNBQVM7QUFDakUsV0FBTztBQUFBLEVBQ1QsV0FBVyxPQUFPLFlBQVksY0FBYyxRQUFRLE1BQU0sR0FBRztBQUMzRCxXQUFPO0FBQUEsRUFDVCxXQUFXLE9BQU8sZ0JBQWdCLFlBQVksT0FBTyxTQUFTLGFBQWE7QUFDekUsV0FBTztBQUFBLEVBQ1QsV0FBVyxPQUFPLGdCQUFnQixjQUFjLFlBQVksTUFBTSxHQUFHO0FBQ25FLFdBQU87QUFBQSxFQUNUO0FBQ0EsU0FBTyxZQUFZLFFBQVEsU0FBUyxXQUFXO0FBQ2pEO0FBRU8sU0FBUyxzQkFBc0IsTUFBWTtBQUNoRCxTQUFPO0FBQUEsSUFDTDtBQUFBLElBQ0EsQ0FBQyxlQUFlLFdBQVcsS0FBSyxTQUFTLFdBQVcsS0FBSyxXQUFXLEtBQUssU0FBUyxhQUFhO0FBQUEsRUFDakc7QUFDRjtBQUVPLFNBQVMsc0JBQXNCLE1BQVk7QUFDaEQsU0FBTztBQUFBLElBQVk7QUFBQSxJQUFNLENBQUMsZUFDeEIsQ0FBQyxzQkFBc0IsdUJBQXVCLHlCQUF5QixFQUFFLFNBQVMsV0FBVyxJQUFJO0FBQUEsRUFDbkc7QUFDRjsiLAogICJuYW1lcyI6IFtdCn0K
@@ -1,6 +1,7 @@
1
1
  // src/index.ts
2
2
  import invalidJsonStringify, { ruleId as invalidJsonStringifyRuleId } from "./invalid-json-stringify.mjs";
3
3
  import noFixture, { ruleId as noFixtureRuleId } from "./no-fixture.mjs";
4
+ import noFixtureHeaders, { ruleId as noFixtureHeadersRuleId } from "./no-fixture-headers.mjs";
4
5
  import noPromiseInstanceMethod, { ruleId as noPromiseInstanceMethodRuleId } from "./no-promise-instance-method.mjs";
5
6
  import filePathComment from "./file-path-comment.mjs";
6
7
  import noCardNumbers from "./no-card-numbers.mjs";
@@ -24,7 +25,8 @@ var src_default = {
24
25
  "object-literal-response": objectLiteralResponse,
25
26
  [invalidJsonStringifyRuleId]: invalidJsonStringify,
26
27
  [noPromiseInstanceMethodRuleId]: noPromiseInstanceMethod,
27
- [noFixtureRuleId]: noFixture
28
+ [noFixtureRuleId]: noFixture,
29
+ [noFixtureHeadersRuleId]: noFixtureHeaders
28
30
  },
29
31
  configs: {
30
32
  all: {
@@ -40,7 +42,8 @@ var src_default = {
40
42
  "@checkdigit/no-test-import": "error",
41
43
  [`@checkdigit/${invalidJsonStringifyRuleId}`]: "error",
42
44
  [`@checkdigit/${noPromiseInstanceMethodRuleId}`]: "error",
43
- [`@checkdigit/${noFixtureRuleId}`]: "error"
45
+ [`@checkdigit/${noFixtureRuleId}`]: "error",
46
+ [`@checkdigit/${noFixtureHeadersRuleId}`]: "error"
44
47
  }
45
48
  },
46
49
  recommended: {
@@ -55,8 +58,7 @@ var src_default = {
55
58
  "@checkdigit/object-literal-response": "error",
56
59
  "@checkdigit/no-test-import": "error",
57
60
  [`@checkdigit/${invalidJsonStringifyRuleId}`]: "error",
58
- [`@checkdigit/${noPromiseInstanceMethodRuleId}`]: "error",
59
- [`@checkdigit/${noFixtureRuleId}`]: "error"
61
+ [`@checkdigit/${noPromiseInstanceMethodRuleId}`]: "error"
60
62
  }
61
63
  }
62
64
  }
@@ -64,4 +66,4 @@ var src_default = {
64
66
  export {
65
67
  src_default as default
66
68
  };
67
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL2luZGV4LnRzIl0sCiAgIm1hcHBpbmdzIjogIjtBQVFBLE9BQU8sd0JBQXdCLFVBQVUsa0NBQWtDO0FBQzNFLE9BQU8sYUFBYSxVQUFVLHVCQUF1QjtBQUNyRCxPQUFPLDJCQUEyQixVQUFVLHFDQUFxQztBQUNqRixPQUFPLHFCQUFxQjtBQUM1QixPQUFPLG1CQUFtQjtBQUMxQixPQUFPLGtCQUFrQjtBQUN6QixPQUFPLFlBQVk7QUFDbkIsT0FBTyxzQkFBc0I7QUFDN0IsT0FBTywyQkFBMkI7QUFDbEMsT0FBTyxrQkFBa0I7QUFDekIsT0FBTyx5Q0FBeUM7QUFDaEQsT0FBTyx5QkFBeUI7QUFFaEMsSUFBTyxjQUFRO0FBQUEsRUFDYixPQUFPO0FBQUEsSUFDTCxxQkFBcUI7QUFBQSxJQUNyQixtQkFBbUI7QUFBQSxJQUNuQixXQUFXO0FBQUEsSUFDWCx5QkFBeUI7QUFBQSxJQUN6QixrQkFBa0I7QUFBQSxJQUNsQixzQkFBc0I7QUFBQSxJQUN0Qiw4QkFBOEI7QUFBQSxJQUM5QiwyQ0FBMkM7QUFBQSxJQUMzQywyQkFBMkI7QUFBQSxJQUMzQixDQUFDLDBCQUEwQixHQUFHO0FBQUEsSUFDOUIsQ0FBQyw2QkFBNkIsR0FBRztBQUFBLElBQ2pDLENBQUMsZUFBZSxHQUFHO0FBQUEsRUFDckI7QUFBQSxFQUNBLFNBQVM7QUFBQSxJQUNQLEtBQUs7QUFBQSxNQUNILE9BQU87QUFBQSxRQUNMLCtCQUErQjtBQUFBLFFBQy9CLGlDQUFpQztBQUFBLFFBQ2pDLHVCQUF1QjtBQUFBLFFBQ3ZCLHFDQUFxQztBQUFBLFFBQ3JDLGtDQUFrQztBQUFBLFFBQ2xDLDBDQUEwQztBQUFBLFFBQzFDLHVEQUF1RDtBQUFBLFFBQ3ZELHVDQUF1QztBQUFBLFFBQ3ZDLDhCQUE4QjtBQUFBLFFBQzlCLENBQUMsZUFBZSwwQkFBMEIsRUFBRSxHQUFHO0FBQUEsUUFDL0MsQ0FBQyxlQUFlLDZCQUE2QixFQUFFLEdBQUc7QUFBQSxRQUNsRCxDQUFDLGVBQWUsZUFBZSxFQUFFLEdBQUc7QUFBQSxNQUN0QztBQUFBLElBQ0Y7QUFBQSxJQUNBLGFBQWE7QUFBQSxNQUNYLE9BQU87QUFBQSxRQUNMLCtCQUErQjtBQUFBLFFBQy9CLGlDQUFpQztBQUFBLFFBQ2pDLHVCQUF1QjtBQUFBLFFBQ3ZCLHFDQUFxQztBQUFBLFFBQ3JDLGtDQUFrQztBQUFBLFFBQ2xDLDBDQUEwQztBQUFBLFFBQzFDLHVEQUF1RDtBQUFBLFFBQ3ZELHVDQUF1QztBQUFBLFFBQ3ZDLDhCQUE4QjtBQUFBLFFBQzlCLENBQUMsZUFBZSwwQkFBMEIsRUFBRSxHQUFHO0FBQUEsUUFDL0MsQ0FBQyxlQUFlLDZCQUE2QixFQUFFLEdBQUc7QUFBQSxRQUNsRCxDQUFDLGVBQWUsZUFBZSxFQUFFLEdBQUc7QUFBQSxNQUN0QztBQUFBLElBQ0Y7QUFBQSxFQUNGO0FBQ0Y7IiwKICAibmFtZXMiOiBbXQp9Cg==
69
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL2luZGV4LnRzIl0sCiAgIm1hcHBpbmdzIjogIjtBQVFBLE9BQU8sd0JBQXdCLFVBQVUsa0NBQWtDO0FBQzNFLE9BQU8sYUFBYSxVQUFVLHVCQUF1QjtBQUNyRCxPQUFPLG9CQUFvQixVQUFVLDhCQUE4QjtBQUNuRSxPQUFPLDJCQUEyQixVQUFVLHFDQUFxQztBQUNqRixPQUFPLHFCQUFxQjtBQUM1QixPQUFPLG1CQUFtQjtBQUMxQixPQUFPLGtCQUFrQjtBQUN6QixPQUFPLFlBQVk7QUFDbkIsT0FBTyxzQkFBc0I7QUFDN0IsT0FBTywyQkFBMkI7QUFDbEMsT0FBTyxrQkFBa0I7QUFDekIsT0FBTyx5Q0FBeUM7QUFDaEQsT0FBTyx5QkFBeUI7QUFFaEMsSUFBTyxjQUFRO0FBQUEsRUFDYixPQUFPO0FBQUEsSUFDTCxxQkFBcUI7QUFBQSxJQUNyQixtQkFBbUI7QUFBQSxJQUNuQixXQUFXO0FBQUEsSUFDWCx5QkFBeUI7QUFBQSxJQUN6QixrQkFBa0I7QUFBQSxJQUNsQixzQkFBc0I7QUFBQSxJQUN0Qiw4QkFBOEI7QUFBQSxJQUM5QiwyQ0FBMkM7QUFBQSxJQUMzQywyQkFBMkI7QUFBQSxJQUMzQixDQUFDLDBCQUEwQixHQUFHO0FBQUEsSUFDOUIsQ0FBQyw2QkFBNkIsR0FBRztBQUFBLElBQ2pDLENBQUMsZUFBZSxHQUFHO0FBQUEsSUFDbkIsQ0FBQyxzQkFBc0IsR0FBRztBQUFBLEVBQzVCO0FBQUEsRUFDQSxTQUFTO0FBQUEsSUFDUCxLQUFLO0FBQUEsTUFDSCxPQUFPO0FBQUEsUUFDTCwrQkFBK0I7QUFBQSxRQUMvQixpQ0FBaUM7QUFBQSxRQUNqQyx1QkFBdUI7QUFBQSxRQUN2QixxQ0FBcUM7QUFBQSxRQUNyQyxrQ0FBa0M7QUFBQSxRQUNsQywwQ0FBMEM7QUFBQSxRQUMxQyx1REFBdUQ7QUFBQSxRQUN2RCx1Q0FBdUM7QUFBQSxRQUN2Qyw4QkFBOEI7QUFBQSxRQUM5QixDQUFDLGVBQWUsMEJBQTBCLEVBQUUsR0FBRztBQUFBLFFBQy9DLENBQUMsZUFBZSw2QkFBNkIsRUFBRSxHQUFHO0FBQUEsUUFDbEQsQ0FBQyxlQUFlLGVBQWUsRUFBRSxHQUFHO0FBQUEsUUFDcEMsQ0FBQyxlQUFlLHNCQUFzQixFQUFFLEdBQUc7QUFBQSxNQUM3QztBQUFBLElBQ0Y7QUFBQSxJQUNBLGFBQWE7QUFBQSxNQUNYLE9BQU87QUFBQSxRQUNMLCtCQUErQjtBQUFBLFFBQy9CLGlDQUFpQztBQUFBLFFBQ2pDLHVCQUF1QjtBQUFBLFFBQ3ZCLHFDQUFxQztBQUFBLFFBQ3JDLGtDQUFrQztBQUFBLFFBQ2xDLDBDQUEwQztBQUFBLFFBQzFDLHVEQUF1RDtBQUFBLFFBQ3ZELHVDQUF1QztBQUFBLFFBQ3ZDLDhCQUE4QjtBQUFBLFFBQzlCLENBQUMsZUFBZSwwQkFBMEIsRUFBRSxHQUFHO0FBQUEsUUFDL0MsQ0FBQyxlQUFlLDZCQUE2QixFQUFFLEdBQUc7QUFBQSxNQUNwRDtBQUFBLElBQ0Y7QUFBQSxFQUNGO0FBQ0Y7IiwKICAibmFtZXMiOiBbXQp9Cg==
@@ -0,0 +1,98 @@
1
+ // src/no-fixture-headers.ts
2
+ import { getEnclosingScopeNode, getParent } from "./ast/tree.mjs";
3
+ import "eslint";
4
+ import { strict as assert } from "node:assert";
5
+ import getDocumentationUrl from "./get-documentation-url.mjs";
6
+ var ruleId = "no-fixture-headers";
7
+ var rule = {
8
+ meta: {
9
+ type: "suggestion",
10
+ docs: {
11
+ description: "Prefer native fetch API over customized fixture API.",
12
+ url: getDocumentationUrl(ruleId)
13
+ },
14
+ messages: {
15
+ preferNativeFetch: "Prefer native fetch API over customized fixture API.",
16
+ unknownError: 'Unknown error occurred in file "{{fileName}}": {{ error }}. Please manually convert the fixture API call to fetch API call.'
17
+ },
18
+ fixable: "code",
19
+ schema: []
20
+ },
21
+ // eslint-disable-next-line max-lines-per-function
22
+ create(context) {
23
+ const sourceCode = context.sourceCode;
24
+ const scopeManager = sourceCode.scopeManager;
25
+ return {
26
+ // eslint-disable-next-line max-lines-per-function
27
+ 'VariableDeclarator[init.argument.callee.name="fetch"]': (fetchCall) => {
28
+ try {
29
+ const enclosingScopeNode = getEnclosingScopeNode(fetchCall);
30
+ assert.ok(fetchCall.id.type === "Identifier");
31
+ const fetchVariableName = fetchCall.id.name;
32
+ assert.ok(enclosingScopeNode !== void 0, "enclosing scope node should exist");
33
+ const scope = scopeManager.acquire(enclosingScopeNode);
34
+ const responseVariable = scope?.variables.find((variable) => {
35
+ const identifier = variable.identifiers[0];
36
+ return identifier?.type === "Identifier" && identifier.name === fetchVariableName;
37
+ });
38
+ if (responseVariable === void 0) {
39
+ return;
40
+ }
41
+ const headersReferences = responseVariable.references.map((reference) => getParent(reference.identifier)).filter(
42
+ (parent) => parent?.type === "MemberExpression" && parent.property.type === "Identifier" && parent.property.name === "headers"
43
+ );
44
+ const directHeadersReferences = headersReferences.map(getParent).filter(
45
+ (parent) => parent?.type === "MemberExpression" && !(parent.property.type === "Identifier" && parent.property.name === "get")
46
+ );
47
+ directHeadersReferences.map((reference) => sourceCode.getText(reference));
48
+ const reDeclaredHeadersVariableNames = headersReferences.map((reference) => getParent(reference)).filter((parent) => parent?.type === "VariableDeclarator").map((declarator) => declarator.id.name);
49
+ const indirectHeadersReferences = reDeclaredHeadersVariableNames.map((variableName) => {
50
+ const headersVariable = scope?.variables.find((variable) => {
51
+ const identifier = variable.identifiers[0];
52
+ return identifier?.type === "Identifier" && identifier.name === variableName;
53
+ });
54
+ return headersVariable?.references.map((reference) => getParent(reference.identifier)).filter(
55
+ (parent) => parent?.type === "MemberExpression" && !(parent.property.type === "Identifier" && parent.property.name === "get")
56
+ ) ?? [];
57
+ }).flat();
58
+ indirectHeadersReferences.map((reference) => sourceCode.getText(reference));
59
+ const invalidHeadersReferences = [...directHeadersReferences, ...indirectHeadersReferences].map((reference) => {
60
+ sourceCode.getText(reference);
61
+ const headerNameNode = reference.property;
62
+ const headerName = (
63
+ // eslint-disable-next-line no-nested-ternary, @typescript-eslint/restrict-template-expressions
64
+ reference.computed ? sourceCode.getText(headerNameNode) : `'${sourceCode.getText(headerNameNode)}'`
65
+ );
66
+ const replacementText = `${sourceCode.getText(reference.object)}.get(${headerName})`;
67
+ return [reference, replacementText];
68
+ });
69
+ context.report({
70
+ node: fetchCall,
71
+ messageId: "preferNativeFetch",
72
+ *fix(fixer) {
73
+ for (const [node, replacementText] of invalidHeadersReferences) {
74
+ yield fixer.replaceText(node, replacementText);
75
+ }
76
+ }
77
+ });
78
+ } catch (error) {
79
+ console.error(`Failed to apply ${ruleId} rule for file "${context.filename}":`, error);
80
+ context.report({
81
+ node: fetchCall,
82
+ messageId: "unknownError",
83
+ data: {
84
+ fileName: context.filename,
85
+ error: error instanceof Error ? error.toString() : JSON.stringify(error)
86
+ }
87
+ });
88
+ }
89
+ }
90
+ };
91
+ }
92
+ };
93
+ var no_fixture_headers_default = rule;
94
+ export {
95
+ no_fixture_headers_default as default,
96
+ ruleId
97
+ };
98
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL25vLWZpeHR1cmUtaGVhZGVycy50cyJdLAogICJtYXBwaW5ncyI6ICI7QUFTQSxTQUFTLHVCQUF1QixpQkFBaUI7QUFDakQsT0FBMEI7QUFDMUIsU0FBUyxVQUFVLGNBQWM7QUFDakMsT0FBTyx5QkFBeUI7QUFFekIsSUFBTSxTQUFTO0FBRXRCLElBQU0sT0FBd0I7QUFBQSxFQUM1QixNQUFNO0FBQUEsSUFDSixNQUFNO0FBQUEsSUFDTixNQUFNO0FBQUEsTUFDSixhQUFhO0FBQUEsTUFDYixLQUFLLG9CQUFvQixNQUFNO0FBQUEsSUFDakM7QUFBQSxJQUNBLFVBQVU7QUFBQSxNQUNSLG1CQUFtQjtBQUFBLE1BQ25CLGNBQ0U7QUFBQSxJQUNKO0FBQUEsSUFDQSxTQUFTO0FBQUEsSUFDVCxRQUFRLENBQUM7QUFBQSxFQUNYO0FBQUE7QUFBQSxFQUVBLE9BQU8sU0FBUztBQUNkLFVBQU0sYUFBYSxRQUFRO0FBQzNCLFVBQU0sZUFBZSxXQUFXO0FBRWhDLFdBQU87QUFBQTtBQUFBLE1BRUwseURBQXlELENBQUMsY0FBa0M7QUFDMUYsWUFBSTtBQUNGLGdCQUFNLHFCQUFxQixzQkFBc0IsU0FBUztBQUMxRCxpQkFBTyxHQUFHLFVBQVUsR0FBRyxTQUFTLFlBQVk7QUFDNUMsZ0JBQU0sb0JBQW9CLFVBQVUsR0FBRztBQUN2QyxpQkFBTyxHQUFHLHVCQUF1QixRQUFXLG1DQUFtQztBQUMvRSxnQkFBTSxRQUFRLGFBQWEsUUFBUSxrQkFBa0I7QUFDckQsZ0JBQU0sbUJBQW1CLE9BQU8sVUFBVSxLQUFLLENBQUMsYUFBYTtBQUMzRCxrQkFBTSxhQUFhLFNBQVMsWUFBWSxDQUFDO0FBQ3pDLG1CQUFPLFlBQVksU0FBUyxnQkFBZ0IsV0FBVyxTQUFTO0FBQUEsVUFDbEUsQ0FBQztBQUNELGNBQUkscUJBQXFCLFFBQVc7QUFDbEM7QUFBQSxVQUNGO0FBRUEsZ0JBQU0sb0JBQW9CLGlCQUFpQixXQUN4QyxJQUFJLENBQUMsY0FBYyxVQUFVLFVB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
@@ -1,10 +1,11 @@
1
1
  // src/no-fixture.ts
2
- import { getAncestor, getParent } from "./ast/tree.mjs";
2
+ import "eslint";
3
+ import { getEnclosingScopeNode, getEnclosingStatement, getParent } from "./ast/tree.mjs";
3
4
  import { strict as assert } from "node:assert";
4
5
  import getDocumentationUrl from "./get-documentation-url.mjs";
5
6
  import { getIndentation } from "./ast/format.mjs";
6
7
  var ruleId = "no-fixture";
7
- function analyzeFixtureCall(call, results) {
8
+ function analyzeFixtureCall(call, results, sourceCode) {
8
9
  const parent = getParent(call);
9
10
  assert.ok(parent, "parent should exist for fixture/supertest call node");
10
11
  let nextCall;
@@ -13,10 +14,18 @@ function analyzeFixtureCall(call, results) {
13
14
  results.rootNode = parent;
14
15
  } else if (parent.type === "AwaitExpression") {
15
16
  results.fixtureNode = call;
16
- const variableDeclaration = getAncestor(parent, "VariableDeclaration", "FunctionDeclaration");
17
- if (variableDeclaration?.type === "VariableDeclaration") {
18
- results.variableDeclaration = variableDeclaration;
19
- results.rootNode = variableDeclaration;
17
+ const enclosingStatement = getEnclosingStatement(parent);
18
+ assert.ok(enclosingStatement);
19
+ const awaitParent = getParent(parent);
20
+ if (awaitParent?.type === "MemberExpression") {
21
+ results.rootNode = parent;
22
+ results.inlineStatementNode = enclosingStatement;
23
+ if (awaitParent.property.type === "Identifier" && awaitParent.property.name === "body") {
24
+ results.inlineBodyReference = awaitParent;
25
+ }
26
+ } else if (enclosingStatement.type === "VariableDeclaration") {
27
+ results.variableDeclaration = enclosingStatement;
28
+ results.rootNode = enclosingStatement;
20
29
  } else {
21
30
  results.rootNode = parent;
22
31
  }
@@ -39,10 +48,10 @@ function analyzeFixtureCall(call, results) {
39
48
  nextCall = setRequestHeaderCall;
40
49
  }
41
50
  } else {
42
- throw new Error(`Unexpected expression in fixture/supertest call ${String(parent)}`);
51
+ throw new Error(`Unexpected expression in fixture/supertest call ${sourceCode.getText(parent)}`);
43
52
  }
44
53
  if (nextCall) {
45
- analyzeFixtureCall(nextCall, results);
54
+ analyzeFixtureCall(nextCall, results, sourceCode);
46
55
  }
47
56
  }
48
57
  function analyzeResponseReferences(fixtureInformation, scopeManager) {
@@ -54,31 +63,38 @@ function analyzeResponseReferences(fixtureInformation, scopeManager) {
54
63
  if (fixtureInformation.variableDeclaration) {
55
64
  const responseVariables = scopeManager.getDeclaredVariables(fixtureInformation.variableDeclaration);
56
65
  for (const responseVariable of responseVariables) {
66
+ const scope = responseVariable.scope;
57
67
  const identifier = responseVariable.identifiers[0];
58
68
  assert.ok(identifier);
59
69
  const identifierParent = getParent(identifier);
60
70
  assert.ok(identifierParent);
61
71
  if (identifierParent.type === "VariableDeclarator") {
62
72
  results.variable = responseVariable;
63
- results.bodyReferences = responseVariable.references.map((responseBodyReference) => getParent(responseBodyReference.identifier)).filter(
73
+ const responseReferences = responseVariable.references.map(
74
+ (responseReference) => getParent(responseReference.identifier)
75
+ );
76
+ results.bodyReferences = responseReferences.filter(
64
77
  (node) => node !== null && node !== void 0 && node.type === "MemberExpression" && node.property.type === "Identifier" && node.property.name === "body"
65
78
  );
66
- results.headersReferences = responseVariable.references.map((responseHeadersReference) => getParent(responseHeadersReference.identifier)).filter(
79
+ results.headersReferences = responseReferences.filter(
67
80
  (node) => node !== null && node !== void 0 && node.type === "MemberExpression" && node.property.type === "Identifier" && (node.property.name === "header" || node.property.name === "headers" || node.property.name === "get")
68
81
  );
69
- results.statusReferences = responseVariable.references.map((responseHeadersReference) => getParent(responseHeadersReference.identifier)).filter(
82
+ results.statusReferences = responseReferences.filter(
70
83
  (node) => node !== null && node !== void 0 && node.type === "MemberExpression" && node.property.type === "Identifier" && (node.property.name === "status" || node.property.name === "statusCode")
71
84
  );
72
85
  } else if (
73
86
  // body reference through destruction/renaming, e.g. "const { body } = ..."
74
87
  identifierParent.type === "Property" && identifierParent.key.type === "Identifier" && identifierParent.key.name === "body"
75
88
  ) {
76
- results.spreadBodyVariable = responseVariable;
89
+ results.destructuringBodyVariable = responseVariable;
77
90
  } else if (
78
91
  // header reference through destruction/renaming, e.g. "const { headers } = ..."
79
92
  identifierParent.type === "Property" && identifierParent.key.type === "Identifier" && identifierParent.key.name === "headers"
80
93
  ) {
81
- results.spreadHeadersVariable = responseVariable;
94
+ results.destructuringHeadersVariable = responseVariable;
95
+ results.destructuringHeadersReferences = scope.set.get(responseVariable.name)?.references.map((reference) => reference.identifier).map(getParent).filter(
96
+ (parent) => parent?.type === "MemberExpression" && parent.property.type === "Identifier" && parent.property.name !== "get" && getParent(parent)?.type !== "CallExpression"
97
+ );
82
98
  } else {
83
99
  throw new Error(`Unknown response variable reference: ${responseVariable.name}`);
84
100
  }
@@ -92,22 +108,32 @@ function replaceEndpointUrlPrefixWithBasePath(url) {
92
108
  function isValidPropertyName(name) {
93
109
  return typeof name === "string" && /^[a-zA-Z_$][a-zA-Z_$0-9]*$/u.test(name);
94
110
  }
95
- function createResponseAssertions(fixtureCallInformation, sourceCode, variableName) {
111
+ function createResponseAssertions(fixtureCallInformation, sourceCode, responseVariableName, destructuringResponseHeadersVariable) {
96
112
  let statusAssertion;
97
113
  const nonStatusAssertions = [];
98
114
  for (const expectArguments of fixtureCallInformation.assertions ?? []) {
99
115
  if (expectArguments.length === 1) {
100
116
  const [assertionArgument] = expectArguments;
101
117
  assert.ok(assertionArgument);
102
- if (assertionArgument.type === "MemberExpression" && assertionArgument.object.type === "Identifier" && assertionArgument.object.name === "StatusCodes" || assertionArgument.type === "Literal") {
103
- statusAssertion = `assert.equal(${variableName}.status, ${sourceCode.getText(assertionArgument)})`;
118
+ if (assertionArgument.type === "MemberExpression" && assertionArgument.object.type === "Identifier" && assertionArgument.object.name === "StatusCodes" || assertionArgument.type === "Literal" || sourceCode.getText(assertionArgument).includes("StatusCodes.")) {
119
+ statusAssertion = `assert.equal(${responseVariableName}.status, ${sourceCode.getText(assertionArgument)})`;
104
120
  } else if (assertionArgument.type === "ArrowFunctionExpression") {
105
- nonStatusAssertions.push(`assert.ok(${sourceCode.getText(assertionArgument)})`);
121
+ let functionBody = sourceCode.getText(assertionArgument.body);
122
+ const [originalResponseArgument] = assertionArgument.params;
123
+ assert.ok(originalResponseArgument?.type === "Identifier");
124
+ const originalResponseArgumentName = originalResponseArgument.name;
125
+ if (originalResponseArgumentName !== responseVariableName) {
126
+ functionBody = functionBody.replace(
127
+ new RegExp(`\\b${originalResponseArgumentName}\\b`, "ug"),
128
+ responseVariableName
129
+ );
130
+ }
131
+ nonStatusAssertions.push(`assert.ok(${functionBody})`);
106
132
  } else if (assertionArgument.type === "Identifier") {
107
- nonStatusAssertions.push(`assert.ok(${sourceCode.getText(assertionArgument)}(${variableName}))`);
133
+ nonStatusAssertions.push(`assert.ok(${sourceCode.getText(assertionArgument)}(${responseVariableName}))`);
108
134
  } else if (assertionArgument.type === "ObjectExpression" || assertionArgument.type === "CallExpression") {
109
135
  nonStatusAssertions.push(
110
- `assert.deepEqual(await ${variableName}.json(), ${sourceCode.getText(assertionArgument)})`
136
+ `assert.deepEqual(await ${responseVariableName}.json(), ${sourceCode.getText(assertionArgument)})`
111
137
  );
112
138
  } else {
113
139
  throw new Error(`Unexpected Supertest assertion argument: ".expect(${sourceCode.getText(assertionArgument)})`);
@@ -115,13 +141,14 @@ function createResponseAssertions(fixtureCallInformation, sourceCode, variableNa
115
141
  } else if (expectArguments.length === 2) {
116
142
  const [headerName, headerValue] = expectArguments;
117
143
  assert.ok(headerName && headerValue);
144
+ const headersReference = destructuringResponseHeadersVariable !== void 0 ? destructuringResponseHeadersVariable.name : `${responseVariableName}.headers`;
118
145
  if (headerValue.type === "Literal" && headerValue.value instanceof RegExp) {
119
146
  nonStatusAssertions.push(
120
- `assert.ok(${variableName}.headers.get(${sourceCode.getText(headerName)}).match(${sourceCode.getText(headerValue)}))`
147
+ `assert.ok(${headersReference}.get(${sourceCode.getText(headerName)}).match(${sourceCode.getText(headerValue)}))`
121
148
  );
122
149
  } else {
123
150
  nonStatusAssertions.push(
124
- `assert.equal(${variableName}.headers.get(${sourceCode.getText(headerName)}), ${sourceCode.getText(headerValue)})`
151
+ `assert.equal(${headersReference}.get(${sourceCode.getText(headerName)}), ${sourceCode.getText(headerValue)})`
125
152
  );
126
153
  }
127
154
  }
@@ -138,13 +165,10 @@ function getResponseVariableNameToUse(scopeManager, fixtureCallInformation, scop
138
165
  return firstDeclaration.id.name;
139
166
  }
140
167
  }
141
- const closestFunctionExpression = getAncestor(
142
- fixtureCallInformation.rootNode,
143
- (node) => ["FunctionExpression", "ArrowFunctionExpression"].includes(node.type)
144
- );
168
+ const enclosingScopeNode = getEnclosingScopeNode(fixtureCallInformation.rootNode);
145
169
  scopeManager.getDeclaredVariables(fixtureCallInformation.rootNode);
146
- assert.ok(closestFunctionExpression);
147
- const scope = scopeManager.acquire(closestFunctionExpression);
170
+ assert.ok(enclosingScopeNode);
171
+ const scope = scopeManager.acquire(enclosingScopeNode);
148
172
  assert.ok(scope !== null);
149
173
  let scopeVariables = scopeVariablesMap.get(scope);
150
174
  if (!scopeVariables) {
@@ -163,6 +187,13 @@ function getResponseVariableNameToUse(scopeManager, fixtureCallInformation, scop
163
187
  scopeVariables.push(responseVariableNameToUse);
164
188
  return responseVariableNameToUse;
165
189
  }
190
+ function isResponseBodyRedefinition(responseBodyReference) {
191
+ const parent = getParent(responseBodyReference);
192
+ return parent?.type === "VariableDeclarator" && parent.id.type === "Identifier";
193
+ }
194
+ function getResponseBodyRetrievalText(responseVariableName) {
195
+ return `await ${responseVariableName}.json()`;
196
+ }
166
197
  var rule = {
167
198
  meta: {
168
199
  type: "suggestion",
@@ -172,16 +203,18 @@ var rule = {
172
203
  },
173
204
  messages: {
174
205
  preferNativeFetch: "Prefer native fetch API over customized fixture API.",
175
- unknownError: "Unknown error occurred: {{ error }}. Please manually convert the fixture API call to fetch API call."
206
+ unknownError: 'Unknown error occurred in file "{{fileName}}": {{ error }}. Please manually convert the fixture API call to fetch API call.'
176
207
  },
177
208
  fixable: "code",
178
209
  schema: []
179
210
  },
211
+ // eslint-disable-next-line max-lines-per-function
180
212
  create(context) {
181
213
  const sourceCode = context.sourceCode;
182
214
  const scopeManager = sourceCode.scopeManager;
183
215
  const scopeVariablesMap = /* @__PURE__ */ new Map();
184
216
  return {
217
+ // eslint-disable-next-line max-lines-per-function
185
218
  'CallExpression[callee.object.object.name="fixture"][callee.object.property.name="api"]': (fixtureCall) => {
186
219
  try {
187
220
  assert.ok(fixtureCall.type === "CallExpression");
@@ -191,14 +224,15 @@ var rule = {
191
224
  const [urlArgumentNode] = fixtureCall.arguments;
192
225
  assert.ok(urlArgumentNode !== void 0);
193
226
  const fixtureCallInformation = {};
194
- analyzeFixtureCall(fixtureCall, fixtureCallInformation);
227
+ analyzeFixtureCall(fixtureCall, fixtureCallInformation, sourceCode);
195
228
  const {
196
229
  variable: responseVariable,
197
230
  bodyReferences: responseBodyReferences,
198
231
  headersReferences: responseHeadersReferences,
199
232
  statusReferences: responseStatusReferences,
200
- spreadBodyVariable: spreadResponseBodyVariable,
201
- spreadHeadersVariable: spreadResponseHeadersVariable
233
+ destructuringBodyVariable: destructuringResponseBodyVariable,
234
+ destructuringHeadersVariable: destructuringResponseHeadersVariable
235
+ // destructuringHeadersReferences: destructuringResponseHeadersReferences,
202
236
  } = analyzeResponseReferences(fixtureCallInformation, scopeManager);
203
237
  const originalUrlArgumentText = sourceCode.getText(urlArgumentNode);
204
238
  const fetchUrlArgumentText = replaceEndpointUrlPrefixWithBasePath(originalUrlArgumentText);
@@ -226,19 +260,27 @@ ${indentation}`);
226
260
  fixtureCallInformation,
227
261
  scopeVariablesMap
228
262
  );
229
- const needResponseVariableRedefine = spreadResponseBodyVariable !== void 0 || responseVariable === void 0 && fixtureCallInformation.assertions !== void 0;
230
- const responseBodyHeadersVariableRedefineLines = needResponseVariableRedefine ? [
231
- ...spreadResponseBodyVariable ? [`const ${spreadResponseBodyVariable.name} = await ${responseVariableNameToUse}.json()`] : [],
232
- ...spreadResponseHeadersVariable ? [`const ${spreadResponseHeadersVariable.name} = ${responseVariableNameToUse}.headers`] : []
263
+ const isResponseBodyVariableRedefinitionNeeded = destructuringResponseBodyVariable !== void 0 || fixtureCallInformation.inlineBodyReference !== void 0 || responseBodyReferences.length > 0 && !responseBodyReferences.some(isResponseBodyRedefinition);
264
+ const redefineResponseBodyVariableName = `${responseVariableNameToUse}Body`;
265
+ const isResponseVariableRedefinitionNeeded = responseVariable === void 0 && fixtureCallInformation.assertions !== void 0 || isResponseBodyVariableRedefinitionNeeded;
266
+ const responseBodyHeadersVariableRedefineLines = isResponseVariableRedefinitionNeeded ? [
267
+ // eslint-disable-next-line no-nested-ternary
268
+ ...destructuringResponseBodyVariable ? [
269
+ `const ${destructuringResponseBodyVariable.name} = ${getResponseBodyRetrievalText(responseVariableNameToUse)}`
270
+ ] : isResponseBodyVariableRedefinitionNeeded ? [
271
+ `const ${redefineResponseBodyVariableName} = ${getResponseBodyRetrievalText(responseVariableNameToUse)}`
272
+ ] : [],
273
+ ...destructuringResponseHeadersVariable ? [`const ${destructuringResponseHeadersVariable.name} = ${responseVariableNameToUse}.headers`] : []
233
274
  ] : [];
234
275
  const { statusAssertion, nonStatusAssertions } = createResponseAssertions(
235
276
  fixtureCallInformation,
236
277
  sourceCode,
237
- responseVariableNameToUse
278
+ responseVariableNameToUse,
279
+ destructuringResponseHeadersVariable
238
280
  );
239
281
  const fetchCallText = `fetch(${fetchUrlArgumentText}, ${fetchRequestArgumentLines})`;
240
- const fetchStatementText = !needResponseVariableRedefine ? fetchCallText : `const ${responseVariableNameToUse} = await ${fetchCallText}`;
241
- const nodeToReplace = needResponseVariableRedefine ? fixtureCallInformation.rootNode : fixtureCallInformation.fixtureNode;
282
+ const fetchStatementText = !isResponseVariableRedefinitionNeeded ? fetchCallText : `const ${responseVariableNameToUse} = await ${fetchCallText}`;
283
+ const nodeToReplace = isResponseVariableRedefinitionNeeded ? fixtureCallInformation.rootNode : fixtureCallInformation.fixtureNode;
242
284
  const appendingAssignmentAndAssertionText = [
243
285
  "",
244
286
  ...statusAssertion !== void 0 ? [statusAssertion] : [],
@@ -249,15 +291,31 @@ ${indentation}`);
249
291
  context.report({
250
292
  node: fixtureCall,
251
293
  messageId: "preferNativeFetch",
294
+ // eslint-disable-next-line sonarjs/cognitive-complexity
252
295
  *fix(fixer) {
253
- yield fixer.replaceText(nodeToReplace, fetchStatementText);
254
- const needEndingSemiColon = sourceCode.getText(nodeToReplace).endsWith(";");
255
- yield fixer.insertTextAfter(
256
- nodeToReplace,
257
- needEndingSemiColon ? `${appendingAssignmentAndAssertionText};` : appendingAssignmentAndAssertionText
258
- );
296
+ if (fixtureCallInformation.inlineStatementNode) {
297
+ const preInlineDeclaration = [
298
+ fetchStatementText,
299
+ `${appendingAssignmentAndAssertionText};
300
+ ${indentation}`
301
+ ].join(``);
302
+ yield fixer.insertTextBefore(fixtureCallInformation.inlineStatementNode, preInlineDeclaration);
303
+ } else {
304
+ yield fixer.replaceText(nodeToReplace, fetchStatementText);
305
+ const needEndingSemiColon = sourceCode.getText(nodeToReplace).endsWith(";");
306
+ yield fixer.insertTextAfter(
307
+ nodeToReplace,
308
+ needEndingSemiColon ? `${appendingAssignmentAndAssertionText};` : appendingAssignmentAndAssertionText
309
+ );
310
+ }
259
311
  for (const responseBodyReference of responseBodyReferences) {
260
- yield fixer.replaceText(responseBodyReference, `await ${responseVariableNameToUse}.json()`);
312
+ yield fixer.replaceText(
313
+ responseBodyReference,
314
+ isResponseBodyVariableRedefinitionNeeded || !isResponseBodyRedefinition(responseBodyReference) ? redefineResponseBodyVariableName : getResponseBodyRetrievalText(responseVariableNameToUse)
315
+ );
316
+ }
317
+ if (fixtureCallInformation.inlineBodyReference) {
318
+ yield fixer.replaceText(fixtureCallInformation.inlineBodyReference, redefineResponseBodyVariableName);
261
319
  }
262
320
  for (const responseHeadersReference of responseHeadersReferences) {
263
321
  const parent = getParent(responseHeadersReference);
@@ -271,7 +329,7 @@ ${indentation}`);
271
329
  const headerNameNode = parent.arguments[0];
272
330
  headerName = sourceCode.getText(headerNameNode);
273
331
  }
274
- assert.ok(headerName);
332
+ assert.ok(headerName !== void 0);
275
333
  yield fixer.replaceText(parent, `${responseVariableNameToUse}.headers.get(${headerName})`);
276
334
  }
277
335
  for (const responseStatusReference of responseStatusReferences) {
@@ -289,12 +347,13 @@ ${indentation}return ${responseVariableNameToUse};`
289
347
  }
290
348
  });
291
349
  } catch (error) {
292
- console.error(`Failed to apply ${ruleId} rule. Error:`, error);
350
+ console.error(`Failed to apply ${ruleId} rule for file "${context.filename}":`, error);
293
351
  context.report({
294
352
  node: fixtureCall,
295
353
  messageId: "unknownError",
296
354
  data: {
297
- error: String(error)
355
+ fileName: context.filename,
356
+ error: error instanceof Error ? error.toString() : JSON.stringify(error)
298
357
  }
299
358
  });
300
359
  }
@@ -307,4 +366,4 @@ export {
307
366
  no_fixture_default as default,
308
367
  ruleId
309
368
  };
310
- //# sourceMappingURL=data:application/json;base64,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
369
+ //# sourceMappingURL=data:application/json;base64,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
@@ -1,3 +1,5 @@
1
1
  import type { Node } from 'estree';
2
2
  export declare function getParent(node: Node): Node | undefined | null;
3
- export declare function getAncestor(node: Node, matcher: string | ((testNode: Node) => boolean), typeToExit?: string): import("estree").Property | import("estree").CatchClause | import("estree").ClassDeclaration | import("estree").ClassExpression | import("estree").ClassBody | import("estree").Identifier | import("estree").SimpleLiteral | import("estree").RegExpLiteral | import("estree").BigIntLiteral | import("estree").ArrayExpression | import("estree").ArrowFunctionExpression | import("estree").AssignmentExpression | import("estree").AwaitExpression | import("estree").BinaryExpression | import("estree").SimpleCallExpression | import("estree").NewExpression | import("estree").ChainExpression | import("estree").ConditionalExpression | import("estree").FunctionExpression | import("estree").ImportExpression | import("estree").LogicalExpression | import("estree").MemberExpression | import("estree").MetaProperty | import("estree").ObjectExpression | import("estree").SequenceExpression | import("estree").TaggedTemplateExpression | import("estree").TemplateLiteral | import("estree").ThisExpression | import("estree").UnaryExpression | import("estree").UpdateExpression | import("estree").YieldExpression | import("estree").FunctionDeclaration | import("estree").MethodDefinition | import("estree").ImportDeclaration | import("estree").ExportNamedDeclaration | import("estree").ExportDefaultDeclaration | import("estree").ExportAllDeclaration | import("estree").ImportSpecifier | import("estree").ImportDefaultSpecifier | import("estree").ImportNamespaceSpecifier | import("estree").ExportSpecifier | import("estree").ObjectPattern | import("estree").ArrayPattern | import("estree").RestElement | import("estree").AssignmentPattern | import("estree").PrivateIdentifier | import("estree").Program | import("estree").PropertyDefinition | import("estree").SpreadElement | import("estree").ExpressionStatement | import("estree").BlockStatement | import("estree").StaticBlock | import("estree").EmptyStatement | import("estree").DebuggerStatement | import("estree").WithStatement | import("estree").ReturnStatement | import("estree").LabeledStatement | import("estree").BreakStatement | import("estree").ContinueStatement | import("estree").IfStatement | import("estree").SwitchStatement | import("estree").ThrowStatement | import("estree").TryStatement | import("estree").WhileStatement | import("estree").DoWhileStatement | import("estree").ForStatement | import("estree").ForInStatement | import("estree").ForOfStatement | import("estree").VariableDeclaration | import("estree").Super | import("estree").SwitchCase | import("estree").TemplateElement | import("estree").VariableDeclarator | undefined;
3
+ export declare function getAncestor(node: Node, matcher: string | ((testNode: Node) => boolean), exitMatcher?: string | ((testNode: Node) => boolean)): Node | undefined;
4
+ export declare function getEnclosingStatement(node: Node): Node | undefined;
5
+ export declare function getEnclosingScopeNode(node: Node): Node | undefined;
@@ -12,6 +12,7 @@ declare const _default: {
12
12
  "invalid-json-stringify": import("eslint").Rule.RuleModule;
13
13
  "no-promise-instance-method": import("eslint").Rule.RuleModule;
14
14
  "no-fixture": import("eslint").Rule.RuleModule;
15
+ "no-fixture-headers": import("eslint").Rule.RuleModule;
15
16
  };
16
17
  configs: {
17
18
  all: {
@@ -28,6 +29,7 @@ declare const _default: {
28
29
  "@checkdigit/invalid-json-stringify": string;
29
30
  "@checkdigit/no-promise-instance-method": string;
30
31
  "@checkdigit/no-fixture": string;
32
+ "@checkdigit/no-fixture-headers": string;
31
33
  };
32
34
  };
33
35
  recommended: {
@@ -43,7 +45,6 @@ declare const _default: {
43
45
  '@checkdigit/no-test-import': string;
44
46
  "@checkdigit/invalid-json-stringify": string;
45
47
  "@checkdigit/no-promise-instance-method": string;
46
- "@checkdigit/no-fixture": string;
47
48
  };
48
49
  };
49
50
  };
@@ -0,0 +1,4 @@
1
+ import { type Rule } from 'eslint';
2
+ export declare const ruleId = "no-fixture-headers";
3
+ declare const rule: Rule.RuleModule;
4
+ export default rule;