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

Sign up to get free protection for your applications and to get access to all the features.
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 };