@graphql-eslint/eslint-plugin 3.19.3 → 3.20.0-alpha-20230703155329-a20556f

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 (302) hide show
  1. package/{typings → cjs}/cache.d.ts +3 -1
  2. package/cjs/cache.js +57 -26
  3. package/{typings → cjs}/configs/index.d.ts +3 -1
  4. package/cjs/configs/index.js +47 -14
  5. package/{typings → cjs}/configs/operations-all.d.ts +2 -1
  6. package/cjs/configs/operations-all.js +47 -30
  7. package/{typings → cjs}/configs/operations-recommended.d.ts +2 -1
  8. package/cjs/configs/operations-recommended.js +72 -55
  9. package/{typings → cjs}/configs/relay.d.ts +2 -1
  10. package/cjs/configs/relay.js +31 -11
  11. package/{typings → cjs}/configs/schema-all.d.ts +2 -1
  12. package/cjs/configs/schema-all.js +41 -24
  13. package/{typings → cjs}/configs/schema-recommended.d.ts +2 -1
  14. package/cjs/configs/schema-recommended.js +68 -51
  15. package/{typings → cjs}/documents.d.ts +4 -1
  16. package/cjs/documents.js +74 -43
  17. package/cjs/estree-converter/converter.d.ts +8 -0
  18. package/cjs/estree-converter/converter.js +80 -59
  19. package/cjs/estree-converter/index.d.ts +8 -0
  20. package/cjs/estree-converter/index.js +25 -5
  21. package/{typings → cjs}/estree-converter/types.d.ts +7 -5
  22. package/cjs/estree-converter/types.js +16 -0
  23. package/cjs/estree-converter/utils.d.ts +18 -0
  24. package/cjs/estree-converter/utils.js +119 -95
  25. package/{typings → cjs}/flat-configs.d.ts +12 -1
  26. package/cjs/flat-configs.js +56 -32
  27. package/cjs/graphql-config.d.ts +13 -0
  28. package/cjs/graphql-config.js +78 -47
  29. package/cjs/index.d.ts +22 -0
  30. package/cjs/index.js +50 -18
  31. package/cjs/parser.d.ts +12 -0
  32. package/cjs/parser.js +96 -76
  33. package/cjs/processor.d.ts +9 -0
  34. package/cjs/processor.js +119 -88
  35. package/{typings → cjs}/rules/alphabetize.d.ts +12 -4
  36. package/cjs/rules/alphabetize.js +337 -295
  37. package/{typings → cjs}/rules/description-style.d.ts +12 -4
  38. package/cjs/rules/description-style.js +96 -66
  39. package/cjs/rules/graphql-js-validation.d.ts +12 -0
  40. package/cjs/rules/graphql-js-validation.js +595 -433
  41. package/cjs/rules/index.d.ts +125 -0
  42. package/cjs/rules/index.js +97 -76
  43. package/{typings → cjs}/rules/input-name.d.ts +12 -4
  44. package/cjs/rules/input-name.js +153 -123
  45. package/{typings → cjs}/rules/lone-executable-definition.d.ts +12 -4
  46. package/cjs/rules/lone-executable-definition.js +101 -72
  47. package/{typings → cjs}/rules/match-document-filename.d.ts +14 -6
  48. package/cjs/rules/match-document-filename.js +229 -182
  49. package/{typings → cjs}/rules/naming-convention.d.ts +12 -4
  50. package/cjs/rules/naming-convention.js +380 -316
  51. package/cjs/rules/no-anonymous-operations.d.ts +12 -0
  52. package/cjs/rules/no-anonymous-operations.js +88 -57
  53. package/cjs/rules/no-case-insensitive-enum-values-duplicates.d.ts +12 -0
  54. package/cjs/rules/no-case-insensitive-enum-values-duplicates.js +82 -50
  55. package/cjs/rules/no-deprecated.d.ts +12 -0
  56. package/cjs/rules/no-deprecated.js +106 -75
  57. package/cjs/rules/no-duplicate-fields.d.ts +12 -0
  58. package/cjs/rules/no-duplicate-fields.js +116 -82
  59. package/cjs/rules/no-hashtag-description.d.ts +13 -0
  60. package/cjs/rules/no-hashtag-description.js +119 -82
  61. package/cjs/rules/no-one-place-fragments.d.ts +12 -0
  62. package/cjs/rules/no-one-place-fragments.js +88 -58
  63. package/{typings → cjs}/rules/no-root-type.d.ts +12 -4
  64. package/cjs/rules/no-root-type.js +101 -74
  65. package/cjs/rules/no-scalar-result-type-on-mutation.d.ts +12 -0
  66. package/cjs/rules/no-scalar-result-type-on-mutation.js +90 -60
  67. package/cjs/rules/no-typename-prefix.d.ts +12 -0
  68. package/cjs/rules/no-typename-prefix.js +88 -55
  69. package/cjs/rules/no-unreachable-types.d.ts +12 -0
  70. package/cjs/rules/no-unreachable-types.js +169 -134
  71. package/cjs/rules/no-unused-fields.d.ts +12 -0
  72. package/cjs/rules/no-unused-fields.js +117 -92
  73. package/{typings → cjs}/rules/relay-arguments.d.ts +12 -4
  74. package/cjs/rules/relay-arguments.js +136 -110
  75. package/cjs/rules/relay-connection-types.d.ts +13 -0
  76. package/cjs/rules/relay-connection-types.js +123 -94
  77. package/{typings → cjs}/rules/relay-edge-types.d.ts +12 -4
  78. package/cjs/rules/relay-edge-types.js +196 -179
  79. package/cjs/rules/relay-page-info.d.ts +12 -0
  80. package/cjs/rules/relay-page-info.js +108 -89
  81. package/{typings → cjs}/rules/require-deprecation-date.d.ts +12 -4
  82. package/cjs/rules/require-deprecation-date.js +143 -112
  83. package/cjs/rules/require-deprecation-reason.d.ts +12 -0
  84. package/cjs/rules/require-deprecation-reason.js +80 -46
  85. package/{typings → cjs}/rules/require-description.d.ts +13 -5
  86. package/cjs/rules/require-description.js +170 -132
  87. package/cjs/rules/require-field-of-type-query-in-mutation-result.d.ts +12 -0
  88. package/cjs/rules/require-field-of-type-query-in-mutation-result.js +81 -51
  89. package/{typings → cjs}/rules/require-id-when-available.d.ts +12 -4
  90. package/cjs/rules/require-id-when-available.js +196 -173
  91. package/cjs/rules/require-import-fragment.d.ts +12 -0
  92. package/cjs/rules/require-import-fragment.js +138 -88
  93. package/cjs/rules/require-nullable-fields-with-oneof.d.ts +12 -0
  94. package/cjs/rules/require-nullable-fields-with-oneof.js +80 -50
  95. package/cjs/rules/require-nullable-result-in-root.d.ts +12 -0
  96. package/cjs/rules/require-nullable-result-in-root.js +97 -68
  97. package/cjs/rules/require-type-pattern-with-oneof.d.ts +12 -0
  98. package/cjs/rules/require-type-pattern-with-oneof.js +70 -42
  99. package/{typings → cjs}/rules/selection-set-depth.d.ts +12 -4
  100. package/cjs/rules/selection-set-depth.js +147 -107
  101. package/{typings → cjs}/rules/strict-id-in-types.d.ts +12 -4
  102. package/cjs/rules/strict-id-in-types.js +143 -122
  103. package/cjs/rules/unique-fragment-name.d.ts +13 -0
  104. package/cjs/rules/unique-fragment-name.js +88 -62
  105. package/cjs/rules/unique-operation-name.d.ts +12 -0
  106. package/cjs/rules/unique-operation-name.js +65 -35
  107. package/cjs/schema.d.ts +12 -0
  108. package/cjs/schema.js +62 -30
  109. package/cjs/siblings.d.ts +8 -0
  110. package/cjs/siblings.js +124 -106
  111. package/cjs/testkit.d.ts +8 -0
  112. package/cjs/testkit.js +165 -144
  113. package/cjs/types-e3367e3c.d.ts +129 -0
  114. package/cjs/types.d.ts +8 -0
  115. package/cjs/types.js +16 -0
  116. package/cjs/utils.d.ts +44 -0
  117. package/cjs/utils.js +181 -124
  118. package/{typings/cache.d.cts → esm/cache.d.mts} +3 -1
  119. package/esm/cache.js +25 -23
  120. package/{typings/configs/index.d.cts → esm/configs/index.d.mts} +3 -1
  121. package/esm/configs/index.js +14 -11
  122. package/{typings/configs/operations-all.d.cts → esm/configs/operations-all.d.mts} +2 -1
  123. package/esm/configs/operations-all.js +28 -28
  124. package/{typings/configs/operations-recommended.d.cts → esm/configs/operations-recommended.d.mts} +2 -1
  125. package/esm/configs/operations-recommended.js +53 -53
  126. package/{typings/configs/relay.d.cts → esm/configs/relay.d.mts} +2 -1
  127. package/esm/configs/relay.js +12 -9
  128. package/{typings/configs/schema-all.d.cts → esm/configs/schema-all.d.mts} +2 -1
  129. package/esm/configs/schema-all.js +22 -22
  130. package/{typings/configs/schema-recommended.d.cts → esm/configs/schema-recommended.d.mts} +2 -1
  131. package/esm/configs/schema-recommended.js +49 -49
  132. package/{typings/documents.d.cts → esm/documents.d.mts} +4 -1
  133. package/esm/documents.js +41 -39
  134. package/esm/estree-converter/converter.d.mts +8 -0
  135. package/esm/estree-converter/converter.js +63 -57
  136. package/esm/estree-converter/index.d.mts +8 -0
  137. package/esm/estree-converter/index.js +3 -3
  138. package/{typings/estree-converter/types.d.cts → esm/estree-converter/types.d.mts} +7 -5
  139. package/esm/estree-converter/utils.d.mts +18 -0
  140. package/esm/estree-converter/utils.js +102 -93
  141. package/{typings/flat-configs.d.cts → esm/flat-configs.d.mts} +13 -2
  142. package/esm/flat-configs.js +33 -30
  143. package/esm/graphql-config.d.mts +13 -0
  144. package/esm/graphql-config.js +49 -44
  145. package/esm/index.d.mts +22 -0
  146. package/esm/index.js +18 -9
  147. package/esm/package.json +1 -1
  148. package/esm/parser.d.mts +12 -0
  149. package/esm/parser.js +64 -73
  150. package/esm/processor.d.mts +9 -0
  151. package/esm/processor.js +98 -86
  152. package/{typings/rules/alphabetize.d.cts → esm/rules/alphabetize.d.mts} +12 -4
  153. package/esm/rules/alphabetize.js +304 -290
  154. package/{typings/rules/description-style.d.cts → esm/rules/description-style.d.mts} +12 -4
  155. package/esm/rules/description-style.js +73 -64
  156. package/esm/rules/graphql-js-validation.d.mts +12 -0
  157. package/esm/rules/graphql-js-validation.js +580 -429
  158. package/esm/rules/index.d.mts +125 -0
  159. package/esm/rules/index.js +74 -74
  160. package/{typings/rules/input-name.d.cts → esm/rules/input-name.d.mts} +12 -4
  161. package/esm/rules/input-name.js +132 -121
  162. package/{typings/rules/lone-executable-definition.d.cts → esm/rules/lone-executable-definition.d.mts} +12 -4
  163. package/esm/rules/lone-executable-definition.js +78 -70
  164. package/{typings/rules/match-document-filename.d.cts → esm/rules/match-document-filename.d.mts} +14 -6
  165. package/esm/rules/match-document-filename.js +210 -180
  166. package/{typings/rules/naming-convention.d.cts → esm/rules/naming-convention.d.mts} +12 -4
  167. package/esm/rules/naming-convention.js +363 -314
  168. package/esm/rules/no-anonymous-operations.d.mts +12 -0
  169. package/esm/rules/no-anonymous-operations.js +65 -55
  170. package/esm/rules/no-case-insensitive-enum-values-duplicates.d.mts +12 -0
  171. package/esm/rules/no-case-insensitive-enum-values-duplicates.js +59 -48
  172. package/esm/rules/no-deprecated.d.mts +12 -0
  173. package/esm/rules/no-deprecated.js +83 -73
  174. package/esm/rules/no-duplicate-fields.d.mts +12 -0
  175. package/esm/rules/no-duplicate-fields.js +93 -80
  176. package/esm/rules/no-hashtag-description.d.mts +13 -0
  177. package/esm/rules/no-hashtag-description.js +95 -80
  178. package/esm/rules/no-one-place-fragments.d.mts +12 -0
  179. package/esm/rules/no-one-place-fragments.js +65 -56
  180. package/{typings/rules/no-root-type.d.cts → esm/rules/no-root-type.d.mts} +12 -4
  181. package/esm/rules/no-root-type.js +78 -72
  182. package/esm/rules/no-scalar-result-type-on-mutation.d.mts +12 -0
  183. package/esm/rules/no-scalar-result-type-on-mutation.js +67 -58
  184. package/esm/rules/no-typename-prefix.d.mts +12 -0
  185. package/esm/rules/no-typename-prefix.js +65 -53
  186. package/esm/rules/no-unreachable-types.d.mts +12 -0
  187. package/esm/rules/no-unreachable-types.js +141 -131
  188. package/esm/rules/no-unused-fields.d.mts +12 -0
  189. package/esm/rules/no-unused-fields.js +94 -90
  190. package/{typings/rules/relay-arguments.d.cts → esm/rules/relay-arguments.d.mts} +12 -4
  191. package/esm/rules/relay-arguments.js +113 -108
  192. package/esm/rules/relay-connection-types.d.mts +13 -0
  193. package/esm/rules/relay-connection-types.js +98 -91
  194. package/{typings/rules/relay-edge-types.d.cts → esm/rules/relay-edge-types.d.mts} +12 -4
  195. package/esm/rules/relay-edge-types.js +178 -177
  196. package/esm/rules/relay-page-info.d.mts +12 -0
  197. package/esm/rules/relay-page-info.js +84 -86
  198. package/{typings/rules/require-deprecation-date.d.cts → esm/rules/require-deprecation-date.d.mts} +12 -4
  199. package/esm/rules/require-deprecation-date.js +120 -110
  200. package/esm/rules/require-deprecation-reason.d.mts +12 -0
  201. package/esm/rules/require-deprecation-reason.js +57 -44
  202. package/{typings/rules/require-description.d.cts → esm/rules/require-description.d.mts} +13 -5
  203. package/esm/rules/require-description.js +151 -130
  204. package/esm/rules/require-field-of-type-query-in-mutation-result.d.mts +12 -0
  205. package/esm/rules/require-field-of-type-query-in-mutation-result.js +58 -49
  206. package/{typings/rules/require-id-when-available.d.cts → esm/rules/require-id-when-available.d.mts} +12 -4
  207. package/esm/rules/require-id-when-available.js +186 -171
  208. package/esm/rules/require-import-fragment.d.mts +12 -0
  209. package/esm/rules/require-import-fragment.js +105 -85
  210. package/esm/rules/require-nullable-fields-with-oneof.d.mts +12 -0
  211. package/esm/rules/require-nullable-fields-with-oneof.js +57 -48
  212. package/esm/rules/require-nullable-result-in-root.d.mts +12 -0
  213. package/esm/rules/require-nullable-result-in-root.js +74 -66
  214. package/esm/rules/require-type-pattern-with-oneof.d.mts +12 -0
  215. package/esm/rules/require-type-pattern-with-oneof.js +47 -40
  216. package/{typings/rules/selection-set-depth.d.cts → esm/rules/selection-set-depth.d.mts} +12 -4
  217. package/esm/rules/selection-set-depth.js +114 -104
  218. package/{typings/rules/strict-id-in-types.d.cts → esm/rules/strict-id-in-types.d.mts} +12 -4
  219. package/esm/rules/strict-id-in-types.js +125 -119
  220. package/esm/rules/unique-fragment-name.d.mts +13 -0
  221. package/esm/rules/unique-fragment-name.js +65 -60
  222. package/esm/rules/unique-operation-name.d.mts +12 -0
  223. package/esm/rules/unique-operation-name.js +42 -33
  224. package/esm/schema.d.mts +12 -0
  225. package/esm/schema.js +29 -26
  226. package/esm/siblings.d.mts +8 -0
  227. package/esm/siblings.js +105 -104
  228. package/esm/testkit.d.mts +8 -0
  229. package/esm/testkit.js +132 -141
  230. package/esm/types-2e1afd7c.d.ts +129 -0
  231. package/esm/types.d.mts +8 -0
  232. package/esm/utils.d.mts +44 -0
  233. package/esm/utils.js +138 -116
  234. package/package.json +40 -30
  235. package/typings/estree-converter/converter.d.cts +0 -3
  236. package/typings/estree-converter/converter.d.ts +0 -3
  237. package/typings/estree-converter/index.d.cts +0 -3
  238. package/typings/estree-converter/index.d.ts +0 -3
  239. package/typings/estree-converter/utils.d.cts +0 -13
  240. package/typings/estree-converter/utils.d.ts +0 -13
  241. package/typings/graphql-config.d.cts +0 -4
  242. package/typings/graphql-config.d.ts +0 -4
  243. package/typings/index.d.cts +0 -10
  244. package/typings/index.d.ts +0 -10
  245. package/typings/parser.d.cts +0 -2
  246. package/typings/parser.d.ts +0 -2
  247. package/typings/processor.d.cts +0 -6
  248. package/typings/processor.d.ts +0 -6
  249. package/typings/rules/graphql-js-validation.d.cts +0 -2
  250. package/typings/rules/graphql-js-validation.d.ts +0 -2
  251. package/typings/rules/index.d.cts +0 -111
  252. package/typings/rules/index.d.ts +0 -111
  253. package/typings/rules/no-anonymous-operations.d.cts +0 -2
  254. package/typings/rules/no-anonymous-operations.d.ts +0 -2
  255. package/typings/rules/no-case-insensitive-enum-values-duplicates.d.cts +0 -2
  256. package/typings/rules/no-case-insensitive-enum-values-duplicates.d.ts +0 -2
  257. package/typings/rules/no-deprecated.d.cts +0 -2
  258. package/typings/rules/no-deprecated.d.ts +0 -2
  259. package/typings/rules/no-duplicate-fields.d.cts +0 -2
  260. package/typings/rules/no-duplicate-fields.d.ts +0 -2
  261. package/typings/rules/no-hashtag-description.d.cts +0 -3
  262. package/typings/rules/no-hashtag-description.d.ts +0 -3
  263. package/typings/rules/no-one-place-fragments.d.cts +0 -2
  264. package/typings/rules/no-one-place-fragments.d.ts +0 -2
  265. package/typings/rules/no-scalar-result-type-on-mutation.d.cts +0 -2
  266. package/typings/rules/no-scalar-result-type-on-mutation.d.ts +0 -2
  267. package/typings/rules/no-typename-prefix.d.cts +0 -2
  268. package/typings/rules/no-typename-prefix.d.ts +0 -2
  269. package/typings/rules/no-unreachable-types.d.cts +0 -2
  270. package/typings/rules/no-unreachable-types.d.ts +0 -2
  271. package/typings/rules/no-unused-fields.d.cts +0 -2
  272. package/typings/rules/no-unused-fields.d.ts +0 -2
  273. package/typings/rules/relay-connection-types.d.cts +0 -4
  274. package/typings/rules/relay-connection-types.d.ts +0 -4
  275. package/typings/rules/relay-page-info.d.cts +0 -2
  276. package/typings/rules/relay-page-info.d.ts +0 -2
  277. package/typings/rules/require-deprecation-reason.d.cts +0 -2
  278. package/typings/rules/require-deprecation-reason.d.ts +0 -2
  279. package/typings/rules/require-field-of-type-query-in-mutation-result.d.cts +0 -2
  280. package/typings/rules/require-field-of-type-query-in-mutation-result.d.ts +0 -2
  281. package/typings/rules/require-import-fragment.d.cts +0 -2
  282. package/typings/rules/require-import-fragment.d.ts +0 -2
  283. package/typings/rules/require-nullable-fields-with-oneof.d.cts +0 -2
  284. package/typings/rules/require-nullable-fields-with-oneof.d.ts +0 -2
  285. package/typings/rules/require-nullable-result-in-root.d.cts +0 -2
  286. package/typings/rules/require-nullable-result-in-root.d.ts +0 -2
  287. package/typings/rules/require-type-pattern-with-oneof.d.cts +0 -2
  288. package/typings/rules/require-type-pattern-with-oneof.d.ts +0 -2
  289. package/typings/rules/unique-fragment-name.d.cts +0 -5
  290. package/typings/rules/unique-fragment-name.d.ts +0 -5
  291. package/typings/rules/unique-operation-name.d.cts +0 -2
  292. package/typings/rules/unique-operation-name.d.ts +0 -2
  293. package/typings/schema.d.cts +0 -3
  294. package/typings/schema.d.ts +0 -3
  295. package/typings/siblings.d.cts +0 -22
  296. package/typings/siblings.d.ts +0 -22
  297. package/typings/testkit.d.cts +0 -29
  298. package/typings/testkit.d.ts +0 -29
  299. package/typings/types.d.cts +0 -83
  300. package/typings/types.d.ts +0 -83
  301. package/typings/utils.d.cts +0 -40
  302. package/typings/utils.d.ts +0 -40
@@ -1,18 +1,20 @@
1
- import { Kind } from 'graphql';
2
- const RULE_ID = 'no-duplicate-fields';
3
- export const rule = {
4
- meta: {
5
- type: 'suggestion',
6
- hasSuggestions: true,
7
- docs: {
8
- description: 'Checks for duplicate fields in selection set, variables in operation definition, or in arguments set of a field.',
9
- category: 'Operations',
10
- url: `https://the-guild.dev/graphql/eslint/rules/${RULE_ID}`,
11
- recommended: true,
12
- examples: [
13
- {
14
- title: 'Incorrect',
15
- code: /* GraphQL */ `
1
+ import { Kind } from "graphql";
2
+ const RULE_ID = "no-duplicate-fields";
3
+ const rule = {
4
+ meta: {
5
+ type: "suggestion",
6
+ hasSuggestions: true,
7
+ docs: {
8
+ description: "Checks for duplicate fields in selection set, variables in operation definition, or in arguments set of a field.",
9
+ category: "Operations",
10
+ url: `https://the-guild.dev/graphql/eslint/rules/${RULE_ID}`,
11
+ recommended: true,
12
+ examples: [
13
+ {
14
+ title: "Incorrect",
15
+ code: (
16
+ /* GraphQL */
17
+ `
16
18
  query {
17
19
  user {
18
20
  name
@@ -20,11 +22,14 @@ export const rule = {
20
22
  name # duplicate field
21
23
  }
22
24
  }
23
- `,
24
- },
25
- {
26
- title: 'Incorrect',
27
- code: /* GraphQL */ `
25
+ `
26
+ )
27
+ },
28
+ {
29
+ title: "Incorrect",
30
+ code: (
31
+ /* GraphQL */
32
+ `
28
33
  query {
29
34
  users(
30
35
  first: 100
@@ -35,11 +40,14 @@ export const rule = {
35
40
  id
36
41
  }
37
42
  }
38
- `,
39
- },
40
- {
41
- title: 'Incorrect',
42
- code: /* GraphQL */ `
43
+ `
44
+ )
45
+ },
46
+ {
47
+ title: "Incorrect",
48
+ code: (
49
+ /* GraphQL */
50
+ `
43
51
  query (
44
52
  $first: Int!
45
53
  $first: Int! # duplicate variable
@@ -48,62 +56,67 @@ export const rule = {
48
56
  id
49
57
  }
50
58
  }
51
- `,
52
- },
53
- ],
54
- },
55
- messages: {
56
- [RULE_ID]: '{{ type }} `{{ fieldName }}` defined multiple times.',
57
- },
58
- schema: [],
59
+ `
60
+ )
61
+ }
62
+ ]
59
63
  },
60
- create(context) {
61
- function checkNode(usedFields, node) {
62
- const fieldName = node.value;
63
- if (usedFields.has(fieldName)) {
64
- const { parent } = node;
65
- context.report({
66
- node,
67
- messageId: RULE_ID,
68
- data: {
69
- type: parent.type,
70
- fieldName,
71
- },
72
- suggest: [
73
- {
74
- desc: `Remove \`${fieldName}\` ${parent.type.toLowerCase()}`,
75
- fix(fixer) {
76
- return fixer.remove((parent.type === Kind.VARIABLE ? parent.parent : parent));
77
- },
78
- },
79
- ],
80
- });
81
- }
82
- else {
83
- usedFields.add(fieldName);
64
+ messages: {
65
+ [RULE_ID]: "{{ type }} `{{ fieldName }}` defined multiple times."
66
+ },
67
+ schema: []
68
+ },
69
+ create(context) {
70
+ function checkNode(usedFields, node) {
71
+ const fieldName = node.value;
72
+ if (usedFields.has(fieldName)) {
73
+ const { parent } = node;
74
+ context.report({
75
+ node,
76
+ messageId: RULE_ID,
77
+ data: {
78
+ type: parent.type,
79
+ fieldName
80
+ },
81
+ suggest: [
82
+ {
83
+ desc: `Remove \`${fieldName}\` ${parent.type.toLowerCase()}`,
84
+ fix(fixer) {
85
+ return fixer.remove(
86
+ parent.type === Kind.VARIABLE ? parent.parent : parent
87
+ );
88
+ }
84
89
  }
90
+ ]
91
+ });
92
+ } else {
93
+ usedFields.add(fieldName);
94
+ }
95
+ }
96
+ return {
97
+ OperationDefinition(node) {
98
+ const set = /* @__PURE__ */ new Set();
99
+ for (const varDef of node.variableDefinitions || []) {
100
+ checkNode(set, varDef.variable.name);
85
101
  }
86
- return {
87
- OperationDefinition(node) {
88
- const set = new Set();
89
- for (const varDef of node.variableDefinitions || []) {
90
- checkNode(set, varDef.variable.name);
91
- }
92
- },
93
- Field(node) {
94
- const set = new Set();
95
- for (const arg of node.arguments || []) {
96
- checkNode(set, arg.name);
97
- }
98
- },
99
- SelectionSet(node) {
100
- const set = new Set();
101
- for (const selection of node.selections) {
102
- if (selection.kind === Kind.FIELD) {
103
- checkNode(set, selection.alias || selection.name);
104
- }
105
- }
106
- },
107
- };
108
- },
102
+ },
103
+ Field(node) {
104
+ const set = /* @__PURE__ */ new Set();
105
+ for (const arg of node.arguments || []) {
106
+ checkNode(set, arg.name);
107
+ }
108
+ },
109
+ SelectionSet(node) {
110
+ const set = /* @__PURE__ */ new Set();
111
+ for (const selection of node.selections) {
112
+ if (selection.kind === Kind.FIELD) {
113
+ checkNode(set, selection.alias || selection.name);
114
+ }
115
+ }
116
+ }
117
+ };
118
+ }
119
+ };
120
+ export {
121
+ rule
109
122
  };
@@ -0,0 +1,13 @@
1
+ import { i as GraphQLESLintRule } from '../types-2e1afd7c.js';
2
+ import '@graphql-tools/utils';
3
+ import 'eslint';
4
+ import 'estree';
5
+ import 'graphql';
6
+ import 'graphql-config';
7
+ import 'json-schema-to-ts';
8
+ import '../estree-converter/types.mjs';
9
+
10
+ declare const RULE_ID = "HASHTAG_COMMENT";
11
+ declare const rule: GraphQLESLintRule;
12
+
13
+ export { RULE_ID, rule };
@@ -1,42 +1,50 @@
1
- import { TokenKind } from 'graphql';
2
- import { getNodeName } from '../utils.js';
3
- export const RULE_ID = 'HASHTAG_COMMENT';
4
- export const rule = {
5
- meta: {
6
- type: 'suggestion',
7
- hasSuggestions: true,
8
- schema: [],
9
- messages: {
10
- [RULE_ID]: 'Unexpected GraphQL descriptions as hashtag `#` for {{ nodeName }}.\nPrefer using `"""` for multiline, or `"` for a single line description.',
11
- },
12
- docs: {
13
- description: 'Requires to use `"""` or `"` for adding a GraphQL description instead of `#`.\nAllows to use hashtag for comments, as long as it\'s not attached to an AST definition.',
14
- category: 'Schema',
15
- url: 'https://the-guild.dev/graphql/eslint/rules/no-hashtag-description',
16
- examples: [
17
- {
18
- title: 'Incorrect',
19
- code: /* GraphQL */ `
1
+ import { TokenKind } from "graphql";
2
+ import { getNodeName } from "../utils.js";
3
+ const RULE_ID = "HASHTAG_COMMENT";
4
+ const rule = {
5
+ meta: {
6
+ type: "suggestion",
7
+ hasSuggestions: true,
8
+ schema: [],
9
+ messages: {
10
+ [RULE_ID]: 'Unexpected GraphQL descriptions as hashtag `#` for {{ nodeName }}.\nPrefer using `"""` for multiline, or `"` for a single line description.'
11
+ },
12
+ docs: {
13
+ description: 'Requires to use `"""` or `"` for adding a GraphQL description instead of `#`.\nAllows to use hashtag for comments, as long as it\'s not attached to an AST definition.',
14
+ category: "Schema",
15
+ url: "https://the-guild.dev/graphql/eslint/rules/no-hashtag-description",
16
+ examples: [
17
+ {
18
+ title: "Incorrect",
19
+ code: (
20
+ /* GraphQL */
21
+ `
20
22
  # Represents a user
21
23
  type User {
22
24
  id: ID!
23
25
  name: String
24
26
  }
25
- `,
26
- },
27
- {
28
- title: 'Correct',
29
- code: /* GraphQL */ `
27
+ `
28
+ )
29
+ },
30
+ {
31
+ title: "Correct",
32
+ code: (
33
+ /* GraphQL */
34
+ `
30
35
  " Represents a user "
31
36
  type User {
32
37
  id: ID!
33
38
  name: String
34
39
  }
35
- `,
36
- },
37
- {
38
- title: 'Correct',
39
- code: /* GraphQL */ `
40
+ `
41
+ )
42
+ },
43
+ {
44
+ title: "Correct",
45
+ code: (
46
+ /* GraphQL */
47
+ `
40
48
  # This file defines the basic User type.
41
49
  # This comment is valid because it's not attached specifically to an AST object.
42
50
 
@@ -45,56 +53,63 @@ export const rule = {
45
53
  id: ID! # This one is also valid, since it comes after the AST object
46
54
  name: String
47
55
  }
48
- `,
56
+ `
57
+ )
58
+ }
59
+ ],
60
+ recommended: true
61
+ }
62
+ },
63
+ create(context) {
64
+ const selector = "Document[definitions.0.kind!=/^(OperationDefinition|FragmentDefinition)$/]";
65
+ return {
66
+ [selector](node) {
67
+ const rawNode = node.rawNode();
68
+ let token = rawNode.loc.startToken;
69
+ while (token) {
70
+ const { kind, prev, next, value, line, column } = token;
71
+ if (kind === TokenKind.COMMENT && prev && next) {
72
+ const isEslintComment = value.trimStart().startsWith("eslint");
73
+ const linesAfter = next.line - line;
74
+ if (!isEslintComment && line !== prev.line && next.kind === TokenKind.NAME && linesAfter < 2) {
75
+ const sourceCode = context.getSourceCode();
76
+ const { tokens } = sourceCode.ast;
77
+ const t = tokens.find(
78
+ (token2) => token2.loc.start.line === next.line && token2.loc.start.column === next.column - 1
79
+ );
80
+ const nextNode = sourceCode.getNodeByRangeIndex(t.range[1] + 1);
81
+ context.report({
82
+ messageId: RULE_ID,
83
+ data: {
84
+ nodeName: getNodeName(
85
+ "name" in nextNode ? nextNode : nextNode.parent
86
+ )
49
87
  },
50
- ],
51
- recommended: true,
52
- },
53
- },
54
- create(context) {
55
- const selector = 'Document[definitions.0.kind!=/^(OperationDefinition|FragmentDefinition)$/]';
56
- return {
57
- [selector](node) {
58
- const rawNode = node.rawNode();
59
- let token = rawNode.loc.startToken;
60
- while (token) {
61
- const { kind, prev, next, value, line, column } = token;
62
- if (kind === TokenKind.COMMENT && prev && next) {
63
- // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion -- TODO: remove `!` when drop support of graphql@15
64
- const isEslintComment = value.trimStart().startsWith('eslint');
65
- const linesAfter = next.line - line;
66
- if (!isEslintComment &&
67
- line !== prev.line &&
68
- next.kind === TokenKind.NAME &&
69
- linesAfter < 2) {
70
- const sourceCode = context.getSourceCode();
71
- const { tokens } = sourceCode.ast;
72
- const t = tokens.find(token => token.loc.start.line === next.line && token.loc.start.column === next.column - 1);
73
- const nextNode = sourceCode.getNodeByRangeIndex(t.range[1] + 1);
74
- context.report({
75
- messageId: RULE_ID,
76
- data: {
77
- nodeName: getNodeName('name' in nextNode ? nextNode : nextNode.parent),
78
- },
79
- loc: {
80
- line,
81
- column: column - 1,
82
- },
83
- suggest: ['"""', '"'].map(descriptionSyntax => ({
84
- desc: `Replace with \`${descriptionSyntax}\` description syntax`,
85
- fix: fixer => fixer.replaceTextRange([token.start, token.end],
86
- // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion -- TODO: remove `!` when drop support of graphql@15
87
- [descriptionSyntax, value.trim(), descriptionSyntax].join('')),
88
- })),
89
- });
90
- }
91
- }
92
- if (!next) {
93
- break;
94
- }
95
- token = next;
96
- }
97
- },
98
- };
99
- },
88
+ loc: {
89
+ line,
90
+ column: column - 1
91
+ },
92
+ suggest: ['"""', '"'].map((descriptionSyntax) => ({
93
+ desc: `Replace with \`${descriptionSyntax}\` description syntax`,
94
+ fix: (fixer) => fixer.replaceTextRange(
95
+ [token.start, token.end],
96
+ // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion -- TODO: remove `!` when drop support of graphql@15
97
+ [descriptionSyntax, value.trim(), descriptionSyntax].join("")
98
+ )
99
+ }))
100
+ });
101
+ }
102
+ }
103
+ if (!next) {
104
+ break;
105
+ }
106
+ token = next;
107
+ }
108
+ }
109
+ };
110
+ }
111
+ };
112
+ export {
113
+ RULE_ID,
114
+ rule
100
115
  };
@@ -0,0 +1,12 @@
1
+ import { i as GraphQLESLintRule } from '../types-2e1afd7c.js';
2
+ import '@graphql-tools/utils';
3
+ import 'eslint';
4
+ import 'estree';
5
+ import 'graphql';
6
+ import 'graphql-config';
7
+ import 'json-schema-to-ts';
8
+ import '../estree-converter/types.mjs';
9
+
10
+ declare const rule: GraphQLESLintRule;
11
+
12
+ export { rule };
@@ -1,18 +1,20 @@
1
- import { relative } from 'path';
2
- import { visit } from 'graphql';
3
- import { CWD, requireSiblingsOperations } from '../utils.js';
4
- const RULE_ID = 'no-one-place-fragments';
5
- export const rule = {
6
- meta: {
7
- type: 'suggestion',
8
- docs: {
9
- category: 'Operations',
10
- description: 'Disallow fragments that are used only in one place.',
11
- url: `https://the-guild.dev/graphql/eslint/rules/${RULE_ID}`,
12
- examples: [
13
- {
14
- title: 'Incorrect',
15
- code: /* GraphQL */ `
1
+ import { relative } from "path";
2
+ import { visit } from "graphql";
3
+ import { CWD, requireSiblingsOperations } from "../utils.js";
4
+ const RULE_ID = "no-one-place-fragments";
5
+ const rule = {
6
+ meta: {
7
+ type: "suggestion",
8
+ docs: {
9
+ category: "Operations",
10
+ description: "Disallow fragments that are used only in one place.",
11
+ url: `https://the-guild.dev/graphql/eslint/rules/${RULE_ID}`,
12
+ examples: [
13
+ {
14
+ title: "Incorrect",
15
+ code: (
16
+ /* GraphQL */
17
+ `
16
18
  fragment UserFields on User {
17
19
  id
18
20
  }
@@ -22,11 +24,14 @@ export const rule = {
22
24
  ...UserFields
23
25
  }
24
26
  }
25
- `,
26
- },
27
- {
28
- title: 'Correct',
29
- code: /* GraphQL */ `
27
+ `
28
+ )
29
+ },
30
+ {
31
+ title: "Correct",
32
+ code: (
33
+ /* GraphQL */
34
+ `
30
35
  fragment UserFields on User {
31
36
  id
32
37
  }
@@ -39,42 +44,46 @@ export const rule = {
39
44
  }
40
45
  }
41
46
  }
42
- `,
43
- },
44
- ],
45
- requiresSiblings: true,
46
- },
47
- messages: {
48
- [RULE_ID]: 'Fragment `{{fragmentName}}` used only once. Inline him in "{{filePath}}".',
49
- },
50
- schema: [],
51
- },
52
- create(context) {
53
- const operations = requireSiblingsOperations(RULE_ID, context);
54
- const allDocuments = [...operations.getOperations(), ...operations.getFragments()];
55
- const usedFragmentsMap = Object.create(null);
56
- for (const { document, filePath } of allDocuments) {
57
- const relativeFilePath = relative(CWD, filePath);
58
- visit(document, {
59
- FragmentSpread({ name }) {
60
- const spreadName = name.value;
61
- usedFragmentsMap[spreadName] || (usedFragmentsMap[spreadName] = []);
62
- usedFragmentsMap[spreadName].push(relativeFilePath);
63
- },
64
- });
47
+ `
48
+ )
65
49
  }
66
- return {
67
- 'FragmentDefinition > Name'(node) {
68
- const fragmentName = node.value;
69
- const fragmentUsage = usedFragmentsMap[fragmentName];
70
- if (fragmentUsage.length === 1) {
71
- context.report({
72
- node,
73
- messageId: RULE_ID,
74
- data: { fragmentName, filePath: fragmentUsage[0] },
75
- });
76
- }
77
- },
78
- };
50
+ ],
51
+ requiresSiblings: true
79
52
  },
53
+ messages: {
54
+ [RULE_ID]: 'Fragment `{{fragmentName}}` used only once. Inline him in "{{filePath}}".'
55
+ },
56
+ schema: []
57
+ },
58
+ create(context) {
59
+ const operations = requireSiblingsOperations(RULE_ID, context);
60
+ const allDocuments = [...operations.getOperations(), ...operations.getFragments()];
61
+ const usedFragmentsMap = /* @__PURE__ */ Object.create(null);
62
+ for (const { document, filePath } of allDocuments) {
63
+ const relativeFilePath = relative(CWD, filePath);
64
+ visit(document, {
65
+ FragmentSpread({ name }) {
66
+ const spreadName = name.value;
67
+ usedFragmentsMap[spreadName] ||= [];
68
+ usedFragmentsMap[spreadName].push(relativeFilePath);
69
+ }
70
+ });
71
+ }
72
+ return {
73
+ "FragmentDefinition > Name"(node) {
74
+ const fragmentName = node.value;
75
+ const fragmentUsage = usedFragmentsMap[fragmentName];
76
+ if (fragmentUsage.length === 1) {
77
+ context.report({
78
+ node,
79
+ messageId: RULE_ID,
80
+ data: { fragmentName, filePath: fragmentUsage[0] }
81
+ });
82
+ }
83
+ }
84
+ };
85
+ }
86
+ };
87
+ export {
88
+ rule
80
89
  };
@@ -1,5 +1,12 @@
1
1
  import { FromSchema } from 'json-schema-to-ts';
2
- import { GraphQLESLintRule } from '../types.cjs';
2
+ import { i as GraphQLESLintRule } from '../types-2e1afd7c.js';
3
+ import '@graphql-tools/utils';
4
+ import 'eslint';
5
+ import 'estree';
6
+ import 'graphql';
7
+ import 'graphql-config';
8
+ import '../estree-converter/types.mjs';
9
+
3
10
  declare const schema: {
4
11
  readonly type: "array";
5
12
  readonly minItems: 1;
@@ -20,6 +27,7 @@ declare const schema: {
20
27
  };
21
28
  };
22
29
  };
23
- export type RuleOptions = FromSchema<typeof schema>;
24
- export declare const rule: GraphQLESLintRule<RuleOptions>;
25
- export {};
30
+ type RuleOptions = FromSchema<typeof schema>;
31
+ declare const rule: GraphQLESLintRule<RuleOptions>;
32
+
33
+ export { RuleOptions, rule };