@graphql-eslint/eslint-plugin 4.3.0 → 4.4.0-alpha-20241207210859-41eb4549764dc0314b5bd4f257ea6667b178540e

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.
Files changed (110) hide show
  1. package/cjs/cache.js +6 -2
  2. package/cjs/configs/operations-all.js +2 -2
  3. package/cjs/configs/schema-all.js +2 -2
  4. package/cjs/configs/schema-recommended.js +1 -1
  5. package/cjs/documents.js +13 -7
  6. package/cjs/estree-converter/converter.js +17 -8
  7. package/cjs/estree-converter/utils.js +22 -9
  8. package/cjs/graphql-config.js +13 -6
  9. package/cjs/index.d.cts +18 -4
  10. package/cjs/meta.js +1 -1
  11. package/cjs/parser.js +36 -9
  12. package/cjs/processor.js +48 -20
  13. package/cjs/rules/alphabetize/index.js +99 -47
  14. package/cjs/rules/description-style/index.js +10 -6
  15. package/cjs/rules/graphql-js-validation.js +142 -108
  16. package/cjs/rules/index.d.cts +18 -4
  17. package/cjs/rules/input-name/index.js +51 -38
  18. package/cjs/rules/lone-executable-definition/index.js +15 -6
  19. package/cjs/rules/match-document-filename/index.d.cts +4 -3
  20. package/cjs/rules/match-document-filename/index.js +63 -37
  21. package/cjs/rules/naming-convention/index.d.cts +6 -10
  22. package/cjs/rules/naming-convention/index.js +179 -82
  23. package/cjs/rules/no-anonymous-operations/index.js +8 -5
  24. package/cjs/rules/no-deprecated/index.js +27 -13
  25. package/cjs/rules/no-duplicate-fields/index.js +15 -8
  26. package/cjs/rules/no-hashtag-description/index.js +18 -10
  27. package/cjs/rules/no-one-place-fragments/index.js +17 -10
  28. package/cjs/rules/no-root-type/index.js +15 -8
  29. package/cjs/rules/no-scalar-result-type-on-mutation/index.js +20 -12
  30. package/cjs/rules/no-typename-prefix/index.js +25 -21
  31. package/cjs/rules/no-unreachable-types/index.js +34 -17
  32. package/cjs/rules/no-unused-fields/index.js +56 -30
  33. package/cjs/rules/relay-arguments/index.js +31 -13
  34. package/cjs/rules/relay-connection-types/index.js +31 -9
  35. package/cjs/rules/relay-edge-types/index.js +84 -41
  36. package/cjs/rules/relay-page-info/index.js +31 -14
  37. package/cjs/rules/require-deprecation-date/index.js +20 -9
  38. package/cjs/rules/require-deprecation-reason/index.js +8 -5
  39. package/cjs/rules/require-description/index.d.cts +79 -13
  40. package/cjs/rules/require-description/index.js +67 -49
  41. package/cjs/rules/require-field-of-type-query-in-mutation-result/index.js +21 -10
  42. package/cjs/rules/require-import-fragment/index.js +20 -11
  43. package/cjs/rules/require-nullable-fields-with-oneof/index.js +12 -5
  44. package/cjs/rules/require-nullable-result-in-root/index.js +32 -27
  45. package/cjs/rules/require-selections/index.js +88 -46
  46. package/cjs/rules/require-type-pattern-with-oneof/index.js +14 -10
  47. package/cjs/rules/selection-set-depth/index.js +19 -10
  48. package/cjs/rules/strict-id-in-types/index.js +32 -19
  49. package/cjs/rules/unique-enum-value-names/index.js +4 -3
  50. package/cjs/rules/unique-fragment-name/index.js +25 -18
  51. package/cjs/rules/unique-operation-name/index.js +5 -5
  52. package/cjs/schema.js +14 -8
  53. package/cjs/siblings.js +60 -32
  54. package/cjs/utils.js +23 -9
  55. package/esm/cache.js +6 -2
  56. package/esm/configs/operations-all.js +2 -2
  57. package/esm/configs/schema-all.js +2 -2
  58. package/esm/configs/schema-recommended.js +1 -1
  59. package/esm/documents.js +13 -7
  60. package/esm/estree-converter/converter.js +17 -8
  61. package/esm/estree-converter/utils.js +22 -9
  62. package/esm/graphql-config.js +13 -6
  63. package/esm/index.d.ts +18 -4
  64. package/esm/meta.js +1 -1
  65. package/esm/parser.js +36 -9
  66. package/esm/processor.js +48 -20
  67. package/esm/rules/alphabetize/index.js +99 -47
  68. package/esm/rules/description-style/index.js +10 -6
  69. package/esm/rules/graphql-js-validation.js +142 -108
  70. package/esm/rules/index.d.ts +18 -4
  71. package/esm/rules/input-name/index.js +51 -38
  72. package/esm/rules/lone-executable-definition/index.js +15 -6
  73. package/esm/rules/match-document-filename/index.d.ts +4 -3
  74. package/esm/rules/match-document-filename/index.js +63 -37
  75. package/esm/rules/naming-convention/index.d.ts +6 -10
  76. package/esm/rules/naming-convention/index.js +179 -82
  77. package/esm/rules/no-anonymous-operations/index.js +8 -5
  78. package/esm/rules/no-deprecated/index.js +27 -13
  79. package/esm/rules/no-duplicate-fields/index.js +15 -8
  80. package/esm/rules/no-hashtag-description/index.js +18 -10
  81. package/esm/rules/no-one-place-fragments/index.js +17 -10
  82. package/esm/rules/no-root-type/index.js +15 -8
  83. package/esm/rules/no-scalar-result-type-on-mutation/index.js +20 -12
  84. package/esm/rules/no-typename-prefix/index.js +25 -21
  85. package/esm/rules/no-unreachable-types/index.js +34 -17
  86. package/esm/rules/no-unused-fields/index.js +56 -30
  87. package/esm/rules/relay-arguments/index.js +31 -13
  88. package/esm/rules/relay-connection-types/index.js +31 -9
  89. package/esm/rules/relay-edge-types/index.js +84 -41
  90. package/esm/rules/relay-page-info/index.js +31 -14
  91. package/esm/rules/require-deprecation-date/index.js +20 -9
  92. package/esm/rules/require-deprecation-reason/index.js +8 -5
  93. package/esm/rules/require-description/index.d.ts +79 -13
  94. package/esm/rules/require-description/index.js +67 -49
  95. package/esm/rules/require-field-of-type-query-in-mutation-result/index.js +21 -10
  96. package/esm/rules/require-import-fragment/index.js +20 -11
  97. package/esm/rules/require-nullable-fields-with-oneof/index.js +12 -5
  98. package/esm/rules/require-nullable-result-in-root/index.js +32 -27
  99. package/esm/rules/require-selections/index.js +88 -46
  100. package/esm/rules/require-type-pattern-with-oneof/index.js +14 -10
  101. package/esm/rules/selection-set-depth/index.js +19 -10
  102. package/esm/rules/strict-id-in-types/index.js +32 -19
  103. package/esm/rules/unique-enum-value-names/index.js +4 -3
  104. package/esm/rules/unique-fragment-name/index.js +25 -18
  105. package/esm/rules/unique-operation-name/index.js +5 -5
  106. package/esm/schema.js +15 -8
  107. package/esm/siblings.js +60 -32
  108. package/esm/utils.js +23 -9
  109. package/index.browser.js +1871 -1160
  110. package/package.json +1 -1
package/esm/processor.js CHANGED
@@ -7,19 +7,25 @@ import { loadOnDiskGraphQLConfig } from "./graphql-config.js";
7
7
  import { version } from "./meta.js";
8
8
  import { CWD, REPORT_ON_FIRST_CHARACTER } from "./utils.js";
9
9
  const blocksMap = /* @__PURE__ */ new Map();
10
- let onDiskConfig, onDiskConfigLoaded = !1;
11
- const RELEVANT_KEYWORDS = ["gql", "graphql", "GraphQL"], processor = {
10
+ let onDiskConfig;
11
+ let onDiskConfigLoaded = false;
12
+ const RELEVANT_KEYWORDS = ["gql", "graphql", "GraphQL"];
13
+ const processor = {
12
14
  meta: {
13
15
  name: "@graphql-eslint/processor",
14
16
  version
15
17
  },
16
- supportsAutofix: !0,
18
+ supportsAutofix: true,
17
19
  preprocess(code, filePath) {
18
- if (process.env.ESLINT_USE_FLAT_CONFIG !== "false" && filePath.endsWith(".vue"))
20
+ if (process.env.ESLINT_USE_FLAT_CONFIG !== "false" && filePath.endsWith(".vue")) {
19
21
  throw new Error(
20
22
  "Processing of `.vue` files is no longer supported, follow the new official vue example for ESLint's flat config https://github.com/dimaMachina/graphql-eslint/tree/master/examples/vue-code-file"
21
23
  );
22
- onDiskConfigLoaded || (onDiskConfig = loadOnDiskGraphQLConfig(filePath), onDiskConfigLoaded = !0);
24
+ }
25
+ if (!onDiskConfigLoaded) {
26
+ onDiskConfig = loadOnDiskGraphQLConfig(filePath);
27
+ onDiskConfigLoaded = true;
28
+ }
23
29
  let keywords = RELEVANT_KEYWORDS;
24
30
  const pluckConfig = onDiskConfig?.getProjectForFile(filePath).extensions.pluckConfig;
25
31
  if (pluckConfig) {
@@ -27,34 +33,43 @@ const RELEVANT_KEYWORDS = ["gql", "graphql", "GraphQL"], processor = {
27
33
  modules = [],
28
34
  globalGqlIdentifierName = ["gql", "graphql"],
29
35
  gqlMagicComment = "GraphQL"
30
- } = pluckConfig, result = [...modules.map(({ identifier }) => identifier).filter((v) => !!v), ...asArray(globalGqlIdentifierName), gqlMagicComment];
36
+ } = pluckConfig;
37
+ const mods = modules.map(({ identifier }) => identifier).filter((v) => !!v);
38
+ const result = [...mods, ...asArray(globalGqlIdentifierName), gqlMagicComment];
31
39
  keywords = [...new Set(result)];
32
40
  }
33
- if (keywords.every((keyword) => !code.includes(keyword)))
41
+ if (keywords.every((keyword) => !code.includes(keyword))) {
34
42
  return [code];
43
+ }
35
44
  try {
36
- const blocks = gqlPluckFromCodeStringSync(filePath, code, {
37
- skipIndent: !0,
45
+ const sources = gqlPluckFromCodeStringSync(filePath, code, {
46
+ skipIndent: true,
38
47
  ...pluckConfig
39
- }).map((item) => ({
48
+ });
49
+ const blocks = sources.map((item) => ({
40
50
  filename: "document.graphql",
41
51
  text: item.body,
42
52
  lineOffset: item.locationOffset.line - 1,
43
53
  // @ts-expect-error -- `index` field exist but show ts error
44
54
  offset: item.locationOffset.index + 1
45
55
  }));
46
- return blocksMap.set(filePath, blocks), [
56
+ blocksMap.set(filePath, blocks);
57
+ return [
47
58
  ...blocks,
48
59
  code
49
60
  /* source code must be provided and be last */
50
61
  ];
51
62
  } catch (error) {
52
- return error instanceof Error && (error.message = `[graphql-eslint] Error while preprocessing "${relative(
53
- CWD,
54
- filePath
55
- )}" file
63
+ if (error instanceof Error) {
64
+ error.message = `[graphql-eslint] Error while preprocessing "${relative(
65
+ CWD,
66
+ filePath
67
+ )}" file
56
68
 
57
- ${error.message}`), console.error(error), [code];
69
+ ${error.message}`;
70
+ }
71
+ console.error(error);
72
+ return [code];
58
73
  }
59
74
  },
60
75
  postprocess(messages, filePath) {
@@ -62,18 +77,31 @@ ${error.message}`), console.error(error), [code];
62
77
  for (let i = 0; i < blocks.length; i += 1) {
63
78
  const { lineOffset, offset } = blocks[i];
64
79
  for (const message of messages[i] || []) {
65
- if (/\.(vue|svelte)$/.test(filePath)) {
66
- delete message.endLine, delete message.endColumn, delete message.fix, delete message.suggestions, Object.assign(message, REPORT_ON_FIRST_CHARACTER);
80
+ const isVueOrSvelte = /\.(vue|svelte)$/.test(filePath);
81
+ if (isVueOrSvelte) {
82
+ delete message.endLine;
83
+ delete message.endColumn;
84
+ delete message.fix;
85
+ delete message.suggestions;
86
+ Object.assign(message, REPORT_ON_FIRST_CHARACTER);
67
87
  continue;
68
88
  }
69
- message.line += lineOffset, typeof message.endLine == "number" && (message.endLine += lineOffset), message.fix && (message.fix.range[0] += offset, message.fix.range[1] += offset);
89
+ message.line += lineOffset;
90
+ if (typeof message.endLine === "number") {
91
+ message.endLine += lineOffset;
92
+ }
93
+ if (message.fix) {
94
+ message.fix.range[0] += offset;
95
+ message.fix.range[1] += offset;
96
+ }
70
97
  for (const suggestion of message.suggestions || []) {
71
98
  const [start, end] = suggestion.fix.range;
72
99
  suggestion.fix.range = [start + offset, end + offset];
73
100
  }
74
101
  }
75
102
  }
76
- return messages.flat().sort((a, b) => a.line - b.line || a.column - b.column);
103
+ const result = messages.flat();
104
+ return result.sort((a, b) => a.line - b.line || a.column - b.column);
77
105
  }
78
106
  };
79
107
  export {
@@ -3,25 +3,29 @@ import {
3
3
  } from "graphql";
4
4
  import lowerCase from "lodash.lowercase";
5
5
  import { ARRAY_DEFAULT_OPTIONS, displayNodeName } from "../../utils.js";
6
- const RULE_ID = "alphabetize", fieldsEnum = [
6
+ const RULE_ID = "alphabetize";
7
+ const fieldsEnum = [
7
8
  Kind.OBJECT_TYPE_DEFINITION,
8
9
  Kind.INTERFACE_TYPE_DEFINITION,
9
10
  Kind.INPUT_OBJECT_TYPE_DEFINITION
10
- ], selectionsEnum = [
11
+ ];
12
+ const selectionsEnum = [
11
13
  Kind.OPERATION_DEFINITION,
12
14
  Kind.FRAGMENT_DEFINITION
13
- ], argumentsEnum = [
15
+ ];
16
+ const argumentsEnum = [
14
17
  Kind.FIELD_DEFINITION,
15
18
  Kind.FIELD,
16
19
  Kind.DIRECTIVE_DEFINITION,
17
20
  Kind.DIRECTIVE
18
- ], schema = {
21
+ ];
22
+ const schema = {
19
23
  type: "array",
20
24
  minItems: 1,
21
25
  maxItems: 1,
22
26
  items: {
23
27
  type: "object",
24
- additionalProperties: !1,
28
+ additionalProperties: false,
25
29
  minProperties: 1,
26
30
  properties: {
27
31
  fields: {
@@ -66,12 +70,12 @@ const RULE_ID = "alphabetize", fieldsEnum = [
66
70
  "- `id` stands for field with name `id`",
67
71
  "- `*` stands for everything else",
68
72
  "- `{` stands for fields `selection set`"
69
- ].join(`
70
- `)
73
+ ].join("\n")
71
74
  }
72
75
  }
73
76
  }
74
- }, rule = {
77
+ };
78
+ const rule = {
75
79
  meta: {
76
80
  type: "suggestion",
77
81
  fixable: "code",
@@ -112,7 +116,7 @@ const RULE_ID = "alphabetize", fieldsEnum = [
112
116
  },
113
117
  {
114
118
  title: "Incorrect",
115
- usage: [{ values: !0 }],
119
+ usage: [{ values: true }],
116
120
  code: (
117
121
  /* GraphQL */
118
122
  `
@@ -127,7 +131,7 @@ const RULE_ID = "alphabetize", fieldsEnum = [
127
131
  },
128
132
  {
129
133
  title: "Correct",
130
- usage: [{ values: !0 }],
134
+ usage: [{ values: true }],
131
135
  code: (
132
136
  /* GraphQL */
133
137
  `
@@ -176,18 +180,18 @@ const RULE_ID = "alphabetize", fieldsEnum = [
176
180
  configOptions: {
177
181
  schema: [
178
182
  {
179
- definitions: !0,
183
+ definitions: true,
180
184
  fields: fieldsEnum,
181
- values: !0,
185
+ values: true,
182
186
  arguments: argumentsEnum,
183
187
  groups: ["id", "*", "createdAt", "updatedAt"]
184
188
  }
185
189
  ],
186
190
  operations: [
187
191
  {
188
- definitions: !0,
192
+ definitions: true,
189
193
  selections: selectionsEnum,
190
- variables: !0,
194
+ variables: true,
191
195
  arguments: [Kind.FIELD, Kind.DIRECTIVE],
192
196
  groups: ["...", "id", "*", "{"]
193
197
  }
@@ -206,43 +210,65 @@ const RULE_ID = "alphabetize", fieldsEnum = [
206
210
  }
207
211
  function getBeforeComments(node) {
208
212
  const commentsBefore = sourceCode.getCommentsBefore(node);
209
- if (commentsBefore.length === 0)
213
+ if (commentsBefore.length === 0) {
210
214
  return [];
215
+ }
211
216
  const tokenBefore = sourceCode.getTokenBefore(node);
212
- if (tokenBefore)
217
+ if (tokenBefore) {
213
218
  return commentsBefore.filter((comment) => !isNodeAndCommentOnSameLine(tokenBefore, comment));
214
- const filteredComments = [], nodeLine = node.loc.start.line;
219
+ }
220
+ const filteredComments = [];
221
+ const nodeLine = node.loc.start.line;
215
222
  for (let i = commentsBefore.length - 1; i >= 0; i -= 1) {
216
223
  const comment = commentsBefore[i];
217
- if (nodeLine - comment.loc.start.line - filteredComments.length > 1)
224
+ if (nodeLine - comment.loc.start.line - filteredComments.length > 1) {
218
225
  break;
226
+ }
219
227
  filteredComments.unshift(comment);
220
228
  }
221
229
  return filteredComments;
222
230
  }
223
231
  function getRangeWithComments(node) {
224
- node.kind === Kind.VARIABLE && (node = node.parent);
225
- const [firstBeforeComment] = getBeforeComments(node), [firstAfterComment] = sourceCode.getCommentsAfter(node), from = firstBeforeComment || node, to = firstAfterComment && isNodeAndCommentOnSameLine(node, firstAfterComment) ? firstAfterComment : node;
232
+ if (node.kind === Kind.VARIABLE) {
233
+ node = node.parent;
234
+ }
235
+ const [firstBeforeComment] = getBeforeComments(node);
236
+ const [firstAfterComment] = sourceCode.getCommentsAfter(node);
237
+ const from = firstBeforeComment || node;
238
+ const to = firstAfterComment && isNodeAndCommentOnSameLine(node, firstAfterComment) ? firstAfterComment : node;
226
239
  return [from.range[0], to.range[1]];
227
240
  }
228
241
  function checkNodes(nodes = []) {
229
242
  for (let i = 1; i < nodes.length; i += 1) {
230
- const currNode = nodes[i], currName = getName(currNode);
231
- if (!currName)
243
+ const currNode = nodes[i];
244
+ const currName = getName(currNode);
245
+ if (!currName) {
232
246
  continue;
233
- const prevNode = nodes[i - 1], prevName = getName(prevNode);
247
+ }
248
+ const prevNode = nodes[i - 1];
249
+ const prevName = getName(prevNode);
234
250
  if (prevName) {
235
- const compareResult = prevName.localeCompare(currName), { groups } = opts;
236
- let shouldSortByGroup = !1;
251
+ const compareResult = prevName.localeCompare(currName);
252
+ const { groups } = opts;
253
+ let shouldSortByGroup = false;
237
254
  if (groups?.length) {
238
- if (!groups.includes("*"))
255
+ if (!groups.includes("*")) {
239
256
  throw new Error("`groups` option should contain `*` string.");
240
- const indexForPrev = getIndex({ node: prevNode, groups }), indexForCurr = getIndex({ node: currNode, groups });
241
- if (shouldSortByGroup = indexForPrev - indexForCurr > 0, indexForPrev < indexForCurr)
257
+ }
258
+ const indexForPrev = getIndex({ node: prevNode, groups });
259
+ const indexForCurr = getIndex({ node: currNode, groups });
260
+ shouldSortByGroup = indexForPrev - indexForCurr > 0;
261
+ if (indexForPrev < indexForCurr) {
262
+ continue;
263
+ }
264
+ }
265
+ const shouldSort = compareResult === 1;
266
+ if (!shouldSortByGroup && !shouldSort) {
267
+ const isSameName = compareResult === 0;
268
+ if (!isSameName || !prevNode.kind.endsWith("Extension") || currNode.kind.endsWith("Extension")) {
242
269
  continue;
270
+ }
243
271
  }
244
- if (!shouldSortByGroup && !(compareResult === 1) && (!(compareResult === 0) || !prevNode.kind.endsWith("Extension") || currNode.kind.endsWith("Extension")))
245
- continue;
246
272
  }
247
273
  context.report({
248
274
  // @ts-expect-error can't be undefined
@@ -253,11 +279,13 @@ const RULE_ID = "alphabetize", fieldsEnum = [
253
279
  prevNode: prevName ? displayNodeName(prevNode) : lowerCase(prevNode.kind)
254
280
  },
255
281
  *fix(fixer) {
256
- const prevRange = getRangeWithComments(prevNode), currRange = getRangeWithComments(currNode);
282
+ const prevRange = getRangeWithComments(prevNode);
283
+ const currRange = getRangeWithComments(currNode);
257
284
  yield fixer.replaceTextRange(
258
285
  prevRange,
259
286
  sourceCode.getText({ range: currRange })
260
- ), yield fixer.replaceTextRange(
287
+ );
288
+ yield fixer.replaceTextRange(
261
289
  currRange,
262
290
  sourceCode.getText({ range: prevRange })
263
291
  );
@@ -265,7 +293,10 @@ const RULE_ID = "alphabetize", fieldsEnum = [
265
293
  });
266
294
  }
267
295
  }
268
- const opts = context.options[0], fields = new Set(opts.fields ?? []), listeners = {}, fieldsSelector = [
296
+ const opts = context.options[0];
297
+ const fields = new Set(opts.fields ?? []);
298
+ const listeners = {};
299
+ const kinds = [
269
300
  fields.has(Kind.OBJECT_TYPE_DEFINITION) && [
270
301
  Kind.OBJECT_TYPE_DEFINITION,
271
302
  Kind.OBJECT_TYPE_EXTENSION
@@ -278,24 +309,42 @@ const RULE_ID = "alphabetize", fieldsEnum = [
278
309
  Kind.INPUT_OBJECT_TYPE_DEFINITION,
279
310
  Kind.INPUT_OBJECT_TYPE_EXTENSION
280
311
  ]
281
- ].filter((v) => !!v).flat().join(","), selectionsSelector = opts.selections?.join(","), argumentsSelector = opts.arguments?.join(",");
282
- if (fieldsSelector && (listeners[fieldsSelector] = (node) => {
283
- checkNodes(node.fields);
284
- }), opts.values) {
312
+ ].filter((v) => !!v).flat();
313
+ const fieldsSelector = kinds.join(",");
314
+ const selectionsSelector = opts.selections?.join(",");
315
+ const argumentsSelector = opts.arguments?.join(",");
316
+ if (fieldsSelector) {
317
+ listeners[fieldsSelector] = (node) => {
318
+ checkNodes(node.fields);
319
+ };
320
+ }
321
+ if (opts.values) {
285
322
  const enumValuesSelector = [Kind.ENUM_TYPE_DEFINITION, Kind.ENUM_TYPE_EXTENSION].join(",");
286
323
  listeners[enumValuesSelector] = (node) => {
287
324
  checkNodes(node.values);
288
325
  };
289
326
  }
290
- return selectionsSelector && (listeners[`:matches(${selectionsSelector}) SelectionSet`] = (node) => {
291
- checkNodes(node.selections);
292
- }), opts.variables && (listeners.OperationDefinition = (node) => {
293
- checkNodes(node.variableDefinitions?.map((varDef) => varDef.variable));
294
- }), argumentsSelector && (listeners[argumentsSelector] = (node) => {
295
- checkNodes(node.arguments);
296
- }), opts.definitions && (listeners.Document = (node) => {
297
- checkNodes(node.definitions);
298
- }), listeners;
327
+ if (selectionsSelector) {
328
+ listeners[`:matches(${selectionsSelector}) SelectionSet`] = (node) => {
329
+ checkNodes(node.selections);
330
+ };
331
+ }
332
+ if (opts.variables) {
333
+ listeners.OperationDefinition = (node) => {
334
+ checkNodes(node.variableDefinitions?.map((varDef) => varDef.variable));
335
+ };
336
+ }
337
+ if (argumentsSelector) {
338
+ listeners[argumentsSelector] = (node) => {
339
+ checkNodes(node.arguments);
340
+ };
341
+ }
342
+ if (opts.definitions) {
343
+ listeners.Document = (node) => {
344
+ checkNodes(node.definitions);
345
+ };
346
+ }
347
+ return listeners;
299
348
  }
300
349
  };
301
350
  function getIndex({
@@ -303,7 +352,10 @@ function getIndex({
303
352
  groups
304
353
  }) {
305
354
  let index = groups.indexOf(getName(node));
306
- return index === -1 && "selectionSet" in node && node.selectionSet && (index = groups.indexOf("{")), index === -1 && node.kind === Kind.FRAGMENT_SPREAD && (index = groups.indexOf("...")), index === -1 && (index = groups.indexOf("*")), index;
355
+ if (index === -1 && "selectionSet" in node && node.selectionSet) index = groups.indexOf("{");
356
+ if (index === -1 && node.kind === Kind.FRAGMENT_SPREAD) index = groups.indexOf("...");
357
+ if (index === -1) index = groups.indexOf("*");
358
+ return index;
307
359
  }
308
360
  function getName(node) {
309
361
  return "alias" in node && node.alias?.value || //
@@ -4,7 +4,7 @@ const schema = {
4
4
  maxItems: 1,
5
5
  items: {
6
6
  type: "object",
7
- additionalProperties: !1,
7
+ additionalProperties: false,
8
8
  minProperties: 1,
9
9
  properties: {
10
10
  style: {
@@ -13,10 +13,11 @@ const schema = {
13
13
  }
14
14
  }
15
15
  }
16
- }, rule = {
16
+ };
17
+ const rule = {
17
18
  meta: {
18
19
  type: "suggestion",
19
- hasSuggestions: !0,
20
+ hasSuggestions: true,
20
21
  docs: {
21
22
  examples: [
22
23
  {
@@ -49,12 +50,13 @@ const schema = {
49
50
  description: "Require all comments to follow the same style (either block or inline).",
50
51
  category: "Schema",
51
52
  url: "https://the-guild.dev/graphql/eslint/rules/description-style",
52
- recommended: !0
53
+ recommended: true
53
54
  },
54
55
  schema
55
56
  },
56
57
  create(context) {
57
- const { style = "block" } = context.options[0] || {}, isBlock = style === "block";
58
+ const { style = "block" } = context.options[0] || {};
59
+ const isBlock = style === "block";
58
60
  return {
59
61
  [`.description[type=StringValue][block!=${isBlock}]`](node) {
60
62
  context.report({
@@ -66,7 +68,9 @@ const schema = {
66
68
  {
67
69
  desc: `Change to ${isBlock ? "block" : "inline"} style description`,
68
70
  fix(fixer) {
69
- const originalText = context.getSourceCode().getText(node), newText = isBlock ? originalText.replace(/(^")|("$)/g, '"""') : originalText.replace(/(^""")|("""$)/g, '"').replace(/\s+/g, " ");
71
+ const sourceCode = context.getSourceCode();
72
+ const originalText = sourceCode.getText(node);
73
+ const newText = isBlock ? originalText.replace(/(^")|("$)/g, '"""') : originalText.replace(/(^""")|("""$)/g, '"').replace(/\s+/g, " ");
70
74
  return fixer.replaceText(node, newText);
71
75
  }
72
76
  }