@graphql-eslint/eslint-plugin 4.0.0-alpha-20220821140530-e968cfc → 4.0.0-alpha-20230810155929-e89edf7

Sign up to get free protection for your applications and to get access to all the features.
Files changed (346) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +14 -252
  3. package/cjs/cache.d.ts +12 -0
  4. package/cjs/cache.js +53 -0
  5. package/cjs/configs/index.d.ts +174 -0
  6. package/cjs/configs/index.js +40 -0
  7. package/cjs/configs/operations-all.d.ts +23 -0
  8. package/cjs/configs/operations-all.js +28 -0
  9. package/cjs/configs/operations-recommended.d.ts +54 -0
  10. package/{configs/operations-recommended.json → cjs/configs/operations-recommended.js} +19 -15
  11. package/cjs/configs/schema-all.d.ts +24 -0
  12. package/cjs/configs/schema-all.js +24 -0
  13. package/cjs/configs/schema-recommended.d.ts +67 -0
  14. package/cjs/configs/schema-recommended.js +68 -0
  15. package/cjs/configs/schema-relay.d.ts +12 -0
  16. package/{configs/relay.json → cjs/configs/schema-relay.js} +6 -4
  17. package/cjs/documents.d.ts +6 -0
  18. package/cjs/documents.js +66 -0
  19. package/cjs/estree-converter/converter.d.ts +8 -0
  20. package/cjs/estree-converter/converter.js +70 -0
  21. package/cjs/estree-converter/index.d.ts +8 -0
  22. package/cjs/estree-converter/index.js +23 -0
  23. package/cjs/estree-converter/types.d.ts +42 -0
  24. package/cjs/estree-converter/types.js +14 -0
  25. package/cjs/estree-converter/utils.d.ts +17 -0
  26. package/cjs/estree-converter/utils.js +105 -0
  27. package/cjs/flat-configs.d.ts +307 -0
  28. package/cjs/flat-configs.js +55 -0
  29. package/cjs/graphql-config.d.ts +14 -0
  30. package/cjs/graphql-config.js +65 -0
  31. package/cjs/index.d.ts +28 -0
  32. package/cjs/index.js +41 -0
  33. package/cjs/parser.d.ts +13 -0
  34. package/cjs/parser.js +96 -0
  35. package/cjs/processor.d.ts +13 -0
  36. package/cjs/processor.js +95 -0
  37. package/cjs/rules/alphabetize.d.ts +74 -0
  38. package/cjs/rules/alphabetize.js +323 -0
  39. package/cjs/rules/description-style.d.ts +29 -0
  40. package/cjs/rules/description-style.js +102 -0
  41. package/cjs/rules/graphql-js-validation.d.ts +13 -0
  42. package/cjs/rules/graphql-js-validation.js +595 -0
  43. package/cjs/rules/index.d.ts +127 -0
  44. package/cjs/rules/index.js +62 -0
  45. package/cjs/rules/input-name.d.ts +44 -0
  46. package/cjs/rules/input-name.js +154 -0
  47. package/cjs/rules/lone-executable-definition.d.ts +35 -0
  48. package/cjs/rules/lone-executable-definition.js +105 -0
  49. package/cjs/rules/match-document-filename.d.ts +81 -0
  50. package/cjs/rules/match-document-filename.js +251 -0
  51. package/cjs/rules/naming-convention.d.ts +108 -0
  52. package/cjs/rules/naming-convention.js +416 -0
  53. package/cjs/rules/no-anonymous-operations.d.ts +13 -0
  54. package/cjs/rules/no-anonymous-operations.js +91 -0
  55. package/cjs/rules/no-deprecated.d.ts +13 -0
  56. package/cjs/rules/no-deprecated.js +143 -0
  57. package/cjs/rules/no-duplicate-fields.d.ts +13 -0
  58. package/cjs/rules/no-duplicate-fields.js +136 -0
  59. package/cjs/rules/no-hashtag-description.d.ts +14 -0
  60. package/cjs/rules/no-hashtag-description.js +127 -0
  61. package/cjs/rules/no-one-place-fragments.d.ts +13 -0
  62. package/cjs/rules/no-one-place-fragments.js +101 -0
  63. package/cjs/rules/no-root-type.d.ts +34 -0
  64. package/cjs/rules/no-root-type.js +103 -0
  65. package/cjs/rules/no-scalar-result-type-on-mutation.d.ts +13 -0
  66. package/cjs/rules/no-scalar-result-type-on-mutation.js +88 -0
  67. package/cjs/rules/no-typename-prefix.d.ts +13 -0
  68. package/cjs/rules/no-typename-prefix.js +91 -0
  69. package/cjs/rules/no-unreachable-types.d.ts +13 -0
  70. package/cjs/rules/no-unreachable-types.js +177 -0
  71. package/cjs/rules/no-unused-fields.d.ts +13 -0
  72. package/cjs/rules/no-unused-fields.js +132 -0
  73. package/cjs/rules/relay-arguments.d.ts +30 -0
  74. package/cjs/rules/relay-arguments.js +126 -0
  75. package/cjs/rules/relay-connection-types.d.ts +14 -0
  76. package/cjs/rules/relay-connection-types.js +111 -0
  77. package/cjs/rules/relay-edge-types.d.ts +40 -0
  78. package/cjs/rules/relay-edge-types.js +161 -0
  79. package/cjs/rules/relay-page-info.d.ts +13 -0
  80. package/cjs/rules/relay-page-info.js +98 -0
  81. package/cjs/rules/require-deprecation-date.d.ts +27 -0
  82. package/cjs/rules/require-deprecation-date.js +148 -0
  83. package/cjs/rules/require-deprecation-reason.d.ts +13 -0
  84. package/cjs/rules/require-deprecation-reason.js +85 -0
  85. package/cjs/rules/require-description.d.ts +24 -0
  86. package/cjs/rules/require-description.js +179 -0
  87. package/cjs/rules/require-field-of-type-query-in-mutation-result.d.ts +13 -0
  88. package/cjs/rules/require-field-of-type-query-in-mutation-result.js +87 -0
  89. package/cjs/rules/require-import-fragment.d.ts +13 -0
  90. package/cjs/rules/require-import-fragment.js +148 -0
  91. package/cjs/rules/require-nullable-fields-with-oneof.d.ts +13 -0
  92. package/cjs/rules/require-nullable-fields-with-oneof.js +81 -0
  93. package/cjs/rules/require-nullable-result-in-root.d.ts +13 -0
  94. package/cjs/rules/require-nullable-result-in-root.js +99 -0
  95. package/cjs/rules/require-selections.d.ts +45 -0
  96. package/cjs/rules/require-selections.js +198 -0
  97. package/cjs/rules/require-type-pattern-with-oneof.d.ts +13 -0
  98. package/cjs/rules/require-type-pattern-with-oneof.js +83 -0
  99. package/cjs/rules/selection-set-depth.d.ts +37 -0
  100. package/cjs/rules/selection-set-depth.js +159 -0
  101. package/cjs/rules/strict-id-in-types.d.ts +66 -0
  102. package/cjs/rules/strict-id-in-types.js +168 -0
  103. package/cjs/rules/unique-enum-value-names.d.ts +13 -0
  104. package/cjs/rules/unique-enum-value-names.js +91 -0
  105. package/cjs/rules/unique-fragment-name.d.ts +14 -0
  106. package/cjs/rules/unique-fragment-name.js +106 -0
  107. package/cjs/rules/unique-operation-name.d.ts +13 -0
  108. package/cjs/rules/unique-operation-name.js +93 -0
  109. package/cjs/schema.d.ts +13 -0
  110. package/cjs/schema.js +52 -0
  111. package/{sibling-operations.d.ts → cjs/siblings.d.ts} +9 -6
  112. package/cjs/siblings.js +96 -0
  113. package/cjs/types.d.ts +75 -0
  114. package/cjs/types.js +14 -0
  115. package/cjs/utils.d.ts +45 -0
  116. package/cjs/utils.js +188 -0
  117. package/esm/cache.d.mts +12 -0
  118. package/esm/cache.js +25 -0
  119. package/esm/chunk-U3TKCM4X.js +8 -0
  120. package/esm/configs/index.d.mts +174 -0
  121. package/esm/configs/index.js +16 -0
  122. package/esm/configs/operations-all.d.mts +23 -0
  123. package/esm/configs/operations-all.js +35 -0
  124. package/esm/configs/operations-recommended.d.mts +54 -0
  125. package/esm/configs/operations-recommended.js +61 -0
  126. package/esm/configs/schema-all.d.mts +24 -0
  127. package/esm/configs/schema-all.js +31 -0
  128. package/esm/configs/schema-recommended.d.mts +67 -0
  129. package/esm/configs/schema-recommended.js +75 -0
  130. package/esm/configs/schema-relay.d.mts +12 -0
  131. package/esm/configs/schema-relay.js +18 -0
  132. package/esm/documents.d.mts +6 -0
  133. package/esm/documents.js +41 -0
  134. package/esm/estree-converter/converter.d.mts +8 -0
  135. package/esm/estree-converter/converter.js +56 -0
  136. package/esm/estree-converter/index.d.mts +8 -0
  137. package/esm/estree-converter/index.js +3 -0
  138. package/esm/estree-converter/types.d.mts +42 -0
  139. package/esm/estree-converter/types.js +0 -0
  140. package/esm/estree-converter/utils.d.mts +17 -0
  141. package/esm/estree-converter/utils.js +87 -0
  142. package/esm/flat-configs.d.mts +307 -0
  143. package/esm/flat-configs.js +36 -0
  144. package/esm/graphql-config.d.mts +14 -0
  145. package/esm/graphql-config.js +39 -0
  146. package/esm/index.d.mts +28 -0
  147. package/esm/index.js +18 -0
  148. package/esm/package.json +1 -0
  149. package/esm/parser.d.mts +13 -0
  150. package/esm/parser.js +76 -0
  151. package/esm/processor.d.mts +13 -0
  152. package/esm/processor.js +81 -0
  153. package/esm/rules/alphabetize.d.mts +74 -0
  154. package/esm/rules/alphabetize.js +299 -0
  155. package/esm/rules/description-style.d.mts +29 -0
  156. package/esm/rules/description-style.js +82 -0
  157. package/esm/rules/graphql-js-validation.d.mts +13 -0
  158. package/esm/rules/graphql-js-validation.js +618 -0
  159. package/esm/rules/index.d.mts +127 -0
  160. package/esm/rules/index.js +76 -0
  161. package/esm/rules/input-name.d.mts +44 -0
  162. package/esm/rules/input-name.js +136 -0
  163. package/esm/rules/lone-executable-definition.d.mts +35 -0
  164. package/esm/rules/lone-executable-definition.js +86 -0
  165. package/esm/rules/match-document-filename.d.mts +81 -0
  166. package/esm/rules/match-document-filename.js +237 -0
  167. package/esm/rules/naming-convention.d.mts +108 -0
  168. package/esm/rules/naming-convention.js +403 -0
  169. package/esm/rules/no-anonymous-operations.d.mts +13 -0
  170. package/esm/rules/no-anonymous-operations.js +72 -0
  171. package/esm/rules/no-deprecated.d.mts +13 -0
  172. package/esm/rules/no-deprecated.js +124 -0
  173. package/esm/rules/no-duplicate-fields.d.mts +13 -0
  174. package/esm/rules/no-duplicate-fields.js +116 -0
  175. package/esm/rules/no-hashtag-description.d.mts +14 -0
  176. package/esm/rules/no-hashtag-description.js +107 -0
  177. package/esm/rules/no-one-place-fragments.d.mts +13 -0
  178. package/esm/rules/no-one-place-fragments.js +83 -0
  179. package/esm/rules/no-root-type.d.mts +34 -0
  180. package/esm/rules/no-root-type.js +83 -0
  181. package/esm/rules/no-scalar-result-type-on-mutation.d.mts +13 -0
  182. package/esm/rules/no-scalar-result-type-on-mutation.js +69 -0
  183. package/esm/rules/no-typename-prefix.d.mts +13 -0
  184. package/esm/rules/no-typename-prefix.js +71 -0
  185. package/esm/rules/no-unreachable-types.d.mts +13 -0
  186. package/esm/rules/no-unreachable-types.js +156 -0
  187. package/esm/rules/no-unused-fields.d.mts +13 -0
  188. package/esm/rules/no-unused-fields.js +113 -0
  189. package/esm/rules/relay-arguments.d.mts +30 -0
  190. package/esm/rules/relay-arguments.js +107 -0
  191. package/esm/rules/relay-connection-types.d.mts +14 -0
  192. package/esm/rules/relay-connection-types.js +90 -0
  193. package/esm/rules/relay-edge-types.d.mts +40 -0
  194. package/esm/rules/relay-edge-types.js +148 -0
  195. package/esm/rules/relay-page-info.d.mts +13 -0
  196. package/esm/rules/relay-page-info.js +80 -0
  197. package/esm/rules/require-deprecation-date.d.mts +27 -0
  198. package/esm/rules/require-deprecation-date.js +129 -0
  199. package/esm/rules/require-deprecation-reason.d.mts +13 -0
  200. package/esm/rules/require-deprecation-reason.js +66 -0
  201. package/esm/rules/require-description.d.mts +24 -0
  202. package/esm/rules/require-description.js +165 -0
  203. package/esm/rules/require-field-of-type-query-in-mutation-result.d.mts +13 -0
  204. package/esm/rules/require-field-of-type-query-in-mutation-result.js +68 -0
  205. package/esm/rules/require-import-fragment.d.mts +13 -0
  206. package/esm/rules/require-import-fragment.js +121 -0
  207. package/esm/rules/require-nullable-fields-with-oneof.d.mts +13 -0
  208. package/esm/rules/require-nullable-fields-with-oneof.js +62 -0
  209. package/esm/rules/require-nullable-result-in-root.d.mts +13 -0
  210. package/esm/rules/require-nullable-result-in-root.js +80 -0
  211. package/esm/rules/require-selections.d.mts +45 -0
  212. package/esm/rules/require-selections.js +194 -0
  213. package/esm/rules/require-type-pattern-with-oneof.d.mts +13 -0
  214. package/esm/rules/require-type-pattern-with-oneof.js +63 -0
  215. package/esm/rules/selection-set-depth.d.mts +37 -0
  216. package/esm/rules/selection-set-depth.js +133 -0
  217. package/esm/rules/strict-id-in-types.d.mts +66 -0
  218. package/esm/rules/strict-id-in-types.js +155 -0
  219. package/esm/rules/unique-enum-value-names.d.mts +13 -0
  220. package/esm/rules/unique-enum-value-names.js +72 -0
  221. package/esm/rules/unique-fragment-name.d.mts +14 -0
  222. package/esm/rules/unique-fragment-name.js +87 -0
  223. package/esm/rules/unique-operation-name.d.mts +13 -0
  224. package/esm/rules/unique-operation-name.js +73 -0
  225. package/esm/schema.d.mts +13 -0
  226. package/esm/schema.js +27 -0
  227. package/esm/siblings.d.mts +24 -0
  228. package/esm/siblings.js +80 -0
  229. package/esm/types.d.mts +75 -0
  230. package/esm/types.js +0 -0
  231. package/esm/utils.d.mts +45 -0
  232. package/esm/utils.js +144 -0
  233. package/index.browser.mjs +5323 -0
  234. package/package.json +43 -35
  235. package/configs/base.json +0 -4
  236. package/configs/operations-all.json +0 -24
  237. package/configs/schema-all.json +0 -26
  238. package/configs/schema-recommended.json +0 -49
  239. package/docs/README.md +0 -75
  240. package/docs/custom-rules.md +0 -148
  241. package/docs/deprecated-rules.md +0 -21
  242. package/docs/parser-options.md +0 -85
  243. package/docs/parser.md +0 -49
  244. package/docs/rules/alphabetize.md +0 -178
  245. package/docs/rules/description-style.md +0 -54
  246. package/docs/rules/executable-definitions.md +0 -17
  247. package/docs/rules/fields-on-correct-type.md +0 -17
  248. package/docs/rules/fragments-on-composite-type.md +0 -17
  249. package/docs/rules/input-name.md +0 -76
  250. package/docs/rules/known-argument-names.md +0 -17
  251. package/docs/rules/known-directives.md +0 -44
  252. package/docs/rules/known-fragment-names.md +0 -69
  253. package/docs/rules/known-type-names.md +0 -17
  254. package/docs/rules/lone-anonymous-operation.md +0 -17
  255. package/docs/rules/lone-schema-definition.md +0 -17
  256. package/docs/rules/match-document-filename.md +0 -156
  257. package/docs/rules/naming-convention.md +0 -300
  258. package/docs/rules/no-anonymous-operations.md +0 -39
  259. package/docs/rules/no-case-insensitive-enum-values-duplicates.md +0 -43
  260. package/docs/rules/no-deprecated.md +0 -85
  261. package/docs/rules/no-duplicate-fields.md +0 -65
  262. package/docs/rules/no-fragment-cycles.md +0 -17
  263. package/docs/rules/no-hashtag-description.md +0 -59
  264. package/docs/rules/no-root-type.md +0 -53
  265. package/docs/rules/no-scalar-result-type-on-mutation.md +0 -37
  266. package/docs/rules/no-typename-prefix.md +0 -39
  267. package/docs/rules/no-undefined-variables.md +0 -17
  268. package/docs/rules/no-unreachable-types.md +0 -49
  269. package/docs/rules/no-unused-fields.md +0 -62
  270. package/docs/rules/no-unused-fragments.md +0 -17
  271. package/docs/rules/no-unused-variables.md +0 -17
  272. package/docs/rules/one-field-subscriptions.md +0 -17
  273. package/docs/rules/overlapping-fields-can-be-merged.md +0 -17
  274. package/docs/rules/possible-fragment-spread.md +0 -17
  275. package/docs/rules/possible-type-extension.md +0 -15
  276. package/docs/rules/provided-required-arguments.md +0 -17
  277. package/docs/rules/relay-arguments.md +0 -57
  278. package/docs/rules/relay-connection-types.md +0 -42
  279. package/docs/rules/relay-edge-types.md +0 -56
  280. package/docs/rules/relay-page-info.md +0 -32
  281. package/docs/rules/require-deprecation-date.md +0 -56
  282. package/docs/rules/require-deprecation-reason.md +0 -47
  283. package/docs/rules/require-description.md +0 -115
  284. package/docs/rules/require-field-of-type-query-in-mutation-result.md +0 -47
  285. package/docs/rules/require-id-when-available.md +0 -88
  286. package/docs/rules/scalar-leafs.md +0 -17
  287. package/docs/rules/selection-set-depth.md +0 -76
  288. package/docs/rules/strict-id-in-types.md +0 -130
  289. package/docs/rules/unique-argument-names.md +0 -17
  290. package/docs/rules/unique-directive-names-per-location.md +0 -17
  291. package/docs/rules/unique-directive-names.md +0 -17
  292. package/docs/rules/unique-enum-value-names.md +0 -15
  293. package/docs/rules/unique-field-definition-names.md +0 -17
  294. package/docs/rules/unique-fragment-name.md +0 -51
  295. package/docs/rules/unique-input-field-names.md +0 -17
  296. package/docs/rules/unique-operation-name.md +0 -55
  297. package/docs/rules/unique-operation-types.md +0 -17
  298. package/docs/rules/unique-type-names.md +0 -17
  299. package/docs/rules/unique-variable-names.md +0 -17
  300. package/docs/rules/value-literals-of-correct-type.md +0 -17
  301. package/docs/rules/variables-are-input-types.md +0 -17
  302. package/docs/rules/variables-in-allowed-position.md +0 -17
  303. package/estree-converter/converter.d.ts +0 -3
  304. package/estree-converter/index.d.ts +0 -3
  305. package/estree-converter/types.d.ts +0 -40
  306. package/estree-converter/utils.d.ts +0 -13
  307. package/graphql-config.d.ts +0 -3
  308. package/index.d.ts +0 -16
  309. package/index.js +0 -4653
  310. package/index.mjs +0 -4641
  311. package/parser.d.ts +0 -2
  312. package/processor.d.ts +0 -7
  313. package/rules/alphabetize.d.ts +0 -16
  314. package/rules/description-style.d.ts +0 -6
  315. package/rules/graphql-js-validation.d.ts +0 -2
  316. package/rules/index.d.ts +0 -41
  317. package/rules/input-name.d.ts +0 -9
  318. package/rules/match-document-filename.d.ts +0 -18
  319. package/rules/naming-convention.d.ts +0 -37
  320. package/rules/no-anonymous-operations.d.ts +0 -3
  321. package/rules/no-case-insensitive-enum-values-duplicates.d.ts +0 -3
  322. package/rules/no-deprecated.d.ts +0 -3
  323. package/rules/no-duplicate-fields.d.ts +0 -3
  324. package/rules/no-hashtag-description.d.ts +0 -3
  325. package/rules/no-root-type.d.ts +0 -7
  326. package/rules/no-scalar-result-type-on-mutation.d.ts +0 -3
  327. package/rules/no-typename-prefix.d.ts +0 -3
  328. package/rules/no-unreachable-types.d.ts +0 -3
  329. package/rules/no-unused-fields.d.ts +0 -3
  330. package/rules/relay-arguments.d.ts +0 -6
  331. package/rules/relay-connection-types.d.ts +0 -5
  332. package/rules/relay-edge-types.d.ts +0 -8
  333. package/rules/relay-page-info.d.ts +0 -3
  334. package/rules/require-deprecation-date.d.ts +0 -5
  335. package/rules/require-deprecation-reason.d.ts +0 -3
  336. package/rules/require-description.d.ts +0 -11
  337. package/rules/require-field-of-type-query-in-mutation-result.d.ts +0 -3
  338. package/rules/require-id-when-available.d.ts +0 -6
  339. package/rules/selection-set-depth.d.ts +0 -7
  340. package/rules/strict-id-in-types.d.ts +0 -11
  341. package/rules/unique-fragment-name.d.ts +0 -6
  342. package/rules/unique-operation-name.d.ts +0 -3
  343. package/schema.d.ts +0 -3
  344. package/testkit.d.ts +0 -27
  345. package/types.d.ts +0 -79
  346. package/utils.d.ts +0 -39
@@ -0,0 +1,116 @@
1
+ import "../chunk-U3TKCM4X.js";
2
+ import { Kind } from "graphql";
3
+ const RULE_ID = "no-duplicate-fields", rule = {
4
+ meta: {
5
+ type: "suggestion",
6
+ hasSuggestions: !0,
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: !0,
12
+ examples: [
13
+ {
14
+ title: "Incorrect",
15
+ code: (
16
+ /* GraphQL */
17
+ `
18
+ query {
19
+ user {
20
+ name
21
+ email
22
+ name # duplicate field
23
+ }
24
+ }
25
+ `
26
+ )
27
+ },
28
+ {
29
+ title: "Incorrect",
30
+ code: (
31
+ /* GraphQL */
32
+ `
33
+ query {
34
+ users(
35
+ first: 100
36
+ skip: 50
37
+ after: "cji629tngfgou0b73kt7vi5jo"
38
+ first: 100 # duplicate argument
39
+ ) {
40
+ id
41
+ }
42
+ }
43
+ `
44
+ )
45
+ },
46
+ {
47
+ title: "Incorrect",
48
+ code: (
49
+ /* GraphQL */
50
+ `
51
+ query (
52
+ $first: Int!
53
+ $first: Int! # duplicate variable
54
+ ) {
55
+ users(first: $first, skip: 50) {
56
+ id
57
+ }
58
+ }
59
+ `
60
+ )
61
+ }
62
+ ]
63
+ },
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
+ }
89
+ }
90
+ ]
91
+ });
92
+ } else
93
+ usedFields.add(fieldName);
94
+ }
95
+ return {
96
+ OperationDefinition(node) {
97
+ const set = /* @__PURE__ */ new Set();
98
+ for (const varDef of node.variableDefinitions || [])
99
+ checkNode(set, varDef.variable.name);
100
+ },
101
+ Field(node) {
102
+ const set = /* @__PURE__ */ new Set();
103
+ for (const arg of node.arguments || [])
104
+ checkNode(set, arg.name);
105
+ },
106
+ SelectionSet(node) {
107
+ const set = /* @__PURE__ */ new Set();
108
+ for (const selection of node.selections)
109
+ selection.kind === Kind.FIELD && checkNode(set, selection.alias || selection.name);
110
+ }
111
+ };
112
+ }
113
+ };
114
+ export {
115
+ rule
116
+ };
@@ -0,0 +1,14 @@
1
+ import { GraphQLESLintRule } from '../types.mjs';
2
+ import 'eslint';
3
+ import 'estree';
4
+ import 'graphql';
5
+ import 'json-schema-to-ts';
6
+ import '../siblings.mjs';
7
+ import '@graphql-tools/utils';
8
+ import '../estree-converter/types.mjs';
9
+ import 'graphql-config';
10
+
11
+ declare const RULE_ID = "HASHTAG_COMMENT";
12
+ declare const rule: GraphQLESLintRule;
13
+
14
+ export { RULE_ID, rule };
@@ -0,0 +1,107 @@
1
+ import "../chunk-U3TKCM4X.js";
2
+ import { TokenKind } from "graphql";
3
+ import { getNodeName } from "../utils.js";
4
+ const RULE_ID = "HASHTAG_COMMENT", rule = {
5
+ meta: {
6
+ type: "suggestion",
7
+ hasSuggestions: !0,
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
+ `
22
+ # Represents a user
23
+ type User {
24
+ id: ID!
25
+ name: String
26
+ }
27
+ `
28
+ )
29
+ },
30
+ {
31
+ title: "Correct",
32
+ code: (
33
+ /* GraphQL */
34
+ `
35
+ " Represents a user "
36
+ type User {
37
+ id: ID!
38
+ name: String
39
+ }
40
+ `
41
+ )
42
+ },
43
+ {
44
+ title: "Correct",
45
+ code: (
46
+ /* GraphQL */
47
+ `
48
+ # This file defines the basic User type.
49
+ # This comment is valid because it's not attached specifically to an AST object.
50
+
51
+ " Represents a user "
52
+ type User {
53
+ id: ID! # This one is also valid, since it comes after the AST object
54
+ name: String
55
+ }
56
+ `
57
+ )
58
+ }
59
+ ],
60
+ recommended: !0
61
+ }
62
+ },
63
+ create(context) {
64
+ return {
65
+ ["Document[definitions.0.kind!=/^(OperationDefinition|FragmentDefinition)$/]"](node) {
66
+ let token = node.rawNode().loc.startToken;
67
+ for (; token; ) {
68
+ const { kind, prev, next, value, line, column } = token;
69
+ if (kind === TokenKind.COMMENT && prev && next) {
70
+ const isEslintComment = value.trimStart().startsWith("eslint"), linesAfter = next.line - line;
71
+ if (!isEslintComment && line !== prev.line && next.kind === TokenKind.NAME && linesAfter < 2) {
72
+ const sourceCode = context.getSourceCode(), { tokens } = sourceCode.ast, t = tokens.find(
73
+ (token2) => token2.loc.start.line === next.line && token2.loc.start.column === next.column - 1
74
+ ), nextNode = sourceCode.getNodeByRangeIndex(t.range[1] + 1);
75
+ context.report({
76
+ messageId: RULE_ID,
77
+ data: {
78
+ nodeName: getNodeName(
79
+ "name" in nextNode ? nextNode : nextNode.parent
80
+ )
81
+ },
82
+ loc: {
83
+ line,
84
+ column: column - 1
85
+ },
86
+ suggest: ['"""', '"'].map((descriptionSyntax) => ({
87
+ desc: `Replace with \`${descriptionSyntax}\` description syntax`,
88
+ fix: (fixer) => fixer.replaceTextRange(
89
+ [token.start, token.end],
90
+ [descriptionSyntax, value.trim(), descriptionSyntax].join("")
91
+ )
92
+ }))
93
+ });
94
+ }
95
+ }
96
+ if (!next)
97
+ break;
98
+ token = next;
99
+ }
100
+ }
101
+ };
102
+ }
103
+ };
104
+ export {
105
+ RULE_ID,
106
+ rule
107
+ };
@@ -0,0 +1,13 @@
1
+ import { GraphQLESLintRule } from '../types.mjs';
2
+ import 'eslint';
3
+ import 'estree';
4
+ import 'graphql';
5
+ import 'json-schema-to-ts';
6
+ import '../siblings.mjs';
7
+ import '@graphql-tools/utils';
8
+ import '../estree-converter/types.mjs';
9
+ import 'graphql-config';
10
+
11
+ declare const rule: GraphQLESLintRule;
12
+
13
+ export { rule };
@@ -0,0 +1,83 @@
1
+ import "../chunk-U3TKCM4X.js";
2
+ import { relative } from "node:path";
3
+ import { visit } from "graphql";
4
+ import { CWD, requireSiblingsOperations } from "../utils.js";
5
+ const RULE_ID = "no-one-place-fragments", 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
+ `
18
+ fragment UserFields on User {
19
+ id
20
+ }
21
+
22
+ {
23
+ user {
24
+ ...UserFields
25
+ }
26
+ }
27
+ `
28
+ )
29
+ },
30
+ {
31
+ title: "Correct",
32
+ code: (
33
+ /* GraphQL */
34
+ `
35
+ fragment UserFields on User {
36
+ id
37
+ }
38
+
39
+ {
40
+ user {
41
+ ...UserFields
42
+ friends {
43
+ ...UserFields
44
+ }
45
+ }
46
+ }
47
+ `
48
+ )
49
+ }
50
+ ],
51
+ requiresSiblings: !0
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), allDocuments = [...operations.getOperations(), ...operations.getFragments()], usedFragmentsMap = /* @__PURE__ */ Object.create(null);
60
+ for (const { document, filePath } of allDocuments) {
61
+ const relativeFilePath = relative(CWD, filePath);
62
+ visit(document, {
63
+ FragmentSpread({ name }) {
64
+ const spreadName = name.value;
65
+ usedFragmentsMap[spreadName] ||= [], usedFragmentsMap[spreadName].push(relativeFilePath);
66
+ }
67
+ });
68
+ }
69
+ return {
70
+ "FragmentDefinition > Name"(node) {
71
+ const fragmentName = node.value, fragmentUsage = usedFragmentsMap[fragmentName];
72
+ fragmentUsage.length === 1 && context.report({
73
+ node,
74
+ messageId: RULE_ID,
75
+ data: { fragmentName, filePath: fragmentUsage[0] }
76
+ });
77
+ }
78
+ };
79
+ }
80
+ };
81
+ export {
82
+ rule
83
+ };
@@ -0,0 +1,34 @@
1
+ import { FromSchema } from 'json-schema-to-ts';
2
+ import { GraphQLESLintRule } from '../types.mjs';
3
+ import 'eslint';
4
+ import 'estree';
5
+ import 'graphql';
6
+ import '../siblings.mjs';
7
+ import '@graphql-tools/utils';
8
+ import '../estree-converter/types.mjs';
9
+ import 'graphql-config';
10
+
11
+ declare const schema: {
12
+ readonly type: "array";
13
+ readonly minItems: 1;
14
+ readonly maxItems: 1;
15
+ readonly items: {
16
+ readonly type: "object";
17
+ readonly additionalProperties: false;
18
+ readonly required: readonly ["disallow"];
19
+ readonly properties: {
20
+ readonly disallow: {
21
+ readonly items: {
22
+ readonly enum: readonly ["mutation", "subscription"];
23
+ };
24
+ readonly type: "array";
25
+ readonly uniqueItems: true;
26
+ readonly minItems: 1;
27
+ };
28
+ };
29
+ };
30
+ };
31
+ type RuleOptions = FromSchema<typeof schema>;
32
+ declare const rule: GraphQLESLintRule<RuleOptions>;
33
+
34
+ export { RuleOptions, rule };
@@ -0,0 +1,83 @@
1
+ import "../chunk-U3TKCM4X.js";
2
+ import { ARRAY_DEFAULT_OPTIONS, requireGraphQLSchemaFromContext, truthy } from "../utils.js";
3
+ const schema = {
4
+ type: "array",
5
+ minItems: 1,
6
+ maxItems: 1,
7
+ items: {
8
+ type: "object",
9
+ additionalProperties: !1,
10
+ required: ["disallow"],
11
+ properties: {
12
+ disallow: {
13
+ ...ARRAY_DEFAULT_OPTIONS,
14
+ items: {
15
+ enum: ["mutation", "subscription"]
16
+ }
17
+ }
18
+ }
19
+ }
20
+ }, rule = {
21
+ meta: {
22
+ type: "suggestion",
23
+ hasSuggestions: !0,
24
+ docs: {
25
+ category: "Schema",
26
+ description: "Disallow using root types `mutation` and/or `subscription`.",
27
+ url: "https://the-guild.dev/graphql/eslint/rules/no-root-type",
28
+ requiresSchema: !0,
29
+ examples: [
30
+ {
31
+ title: "Incorrect",
32
+ usage: [{ disallow: ["mutation", "subscription"] }],
33
+ code: (
34
+ /* GraphQL */
35
+ `
36
+ type Mutation {
37
+ createUser(input: CreateUserInput!): User!
38
+ }
39
+ `
40
+ )
41
+ },
42
+ {
43
+ title: "Correct",
44
+ usage: [{ disallow: ["mutation", "subscription"] }],
45
+ code: (
46
+ /* GraphQL */
47
+ `
48
+ type Query {
49
+ users: [User!]!
50
+ }
51
+ `
52
+ )
53
+ }
54
+ ],
55
+ configOptions: [{ disallow: ["mutation", "subscription"] }]
56
+ },
57
+ schema
58
+ },
59
+ create(context) {
60
+ const schema2 = requireGraphQLSchemaFromContext("no-root-type", context), disallow = new Set(context.options[0].disallow), rootTypeNames = [
61
+ disallow.has("mutation") && schema2.getMutationType(),
62
+ disallow.has("subscription") && schema2.getSubscriptionType()
63
+ ].filter(truthy).map((type) => type.name).join("|");
64
+ return rootTypeNames ? {
65
+ [`:matches(ObjectTypeDefinition, ObjectTypeExtension) > .name[value=/^(${rootTypeNames})$/]`](node) {
66
+ const typeName = node.value;
67
+ context.report({
68
+ node,
69
+ message: `Root type \`${typeName}\` is forbidden.`,
70
+ suggest: [
71
+ {
72
+ desc: `Remove \`${typeName}\` type`,
73
+ fix: (fixer) => fixer.remove(node.parent)
74
+ }
75
+ ]
76
+ });
77
+ }
78
+ } : {};
79
+ }
80
+ };
81
+ export {
82
+ rule
83
+ };
@@ -0,0 +1,13 @@
1
+ import { GraphQLESLintRule } from '../types.mjs';
2
+ import 'eslint';
3
+ import 'estree';
4
+ import 'graphql';
5
+ import 'json-schema-to-ts';
6
+ import '../siblings.mjs';
7
+ import '@graphql-tools/utils';
8
+ import '../estree-converter/types.mjs';
9
+ import 'graphql-config';
10
+
11
+ declare const rule: GraphQLESLintRule;
12
+
13
+ export { rule };
@@ -0,0 +1,69 @@
1
+ import "../chunk-U3TKCM4X.js";
2
+ import { isScalarType, Kind } from "graphql";
3
+ import { getNodeName, requireGraphQLSchemaFromContext } from "../utils.js";
4
+ const RULE_ID = "no-scalar-result-type-on-mutation", rule = {
5
+ meta: {
6
+ type: "suggestion",
7
+ hasSuggestions: !0,
8
+ docs: {
9
+ category: "Schema",
10
+ description: "Avoid scalar result type on mutation type to make sure to return a valid state.",
11
+ url: `https://the-guild.dev/graphql/eslint/rules/${RULE_ID}`,
12
+ requiresSchema: !0,
13
+ examples: [
14
+ {
15
+ title: "Incorrect",
16
+ code: (
17
+ /* GraphQL */
18
+ `
19
+ type Mutation {
20
+ createUser: Boolean
21
+ }
22
+ `
23
+ )
24
+ },
25
+ {
26
+ title: "Correct",
27
+ code: (
28
+ /* GraphQL */
29
+ `
30
+ type Mutation {
31
+ createUser: User!
32
+ }
33
+ `
34
+ )
35
+ }
36
+ ]
37
+ },
38
+ schema: []
39
+ },
40
+ create(context) {
41
+ const schema = requireGraphQLSchemaFromContext(RULE_ID, context), mutationType = schema.getMutationType();
42
+ return mutationType ? {
43
+ [[
44
+ `:matches(ObjectTypeDefinition, ObjectTypeExtension)[name.value=${mutationType.name}]`,
45
+ "> FieldDefinition > .gqlType Name"
46
+ ].join(" ")](node) {
47
+ const typeName = node.value, graphQLType = schema.getType(typeName);
48
+ if (isScalarType(graphQLType)) {
49
+ let fieldDef = node.parent;
50
+ for (; fieldDef.kind !== Kind.FIELD_DEFINITION; )
51
+ fieldDef = fieldDef.parent;
52
+ context.report({
53
+ node,
54
+ message: `Unexpected scalar result type \`${typeName}\` for ${getNodeName(fieldDef)}`,
55
+ suggest: [
56
+ {
57
+ desc: `Remove \`${typeName}\``,
58
+ fix: (fixer) => fixer.remove(node)
59
+ }
60
+ ]
61
+ });
62
+ }
63
+ }
64
+ } : {};
65
+ }
66
+ };
67
+ export {
68
+ rule
69
+ };
@@ -0,0 +1,13 @@
1
+ import { GraphQLESLintRule } from '../types.mjs';
2
+ import 'eslint';
3
+ import 'estree';
4
+ import 'graphql';
5
+ import 'json-schema-to-ts';
6
+ import '../siblings.mjs';
7
+ import '@graphql-tools/utils';
8
+ import '../estree-converter/types.mjs';
9
+ import 'graphql-config';
10
+
11
+ declare const rule: GraphQLESLintRule;
12
+
13
+ export { rule };
@@ -0,0 +1,71 @@
1
+ import "../chunk-U3TKCM4X.js";
2
+ const NO_TYPENAME_PREFIX = "NO_TYPENAME_PREFIX", rule = {
3
+ meta: {
4
+ type: "suggestion",
5
+ hasSuggestions: !0,
6
+ docs: {
7
+ category: "Schema",
8
+ description: "Enforces users to avoid using the type name in a field name while defining your schema.",
9
+ recommended: !0,
10
+ url: "https://the-guild.dev/graphql/eslint/rules/no-typename-prefix",
11
+ examples: [
12
+ {
13
+ title: "Incorrect",
14
+ code: (
15
+ /* GraphQL */
16
+ `
17
+ type User {
18
+ userId: ID!
19
+ }
20
+ `
21
+ )
22
+ },
23
+ {
24
+ title: "Correct",
25
+ code: (
26
+ /* GraphQL */
27
+ `
28
+ type User {
29
+ id: ID!
30
+ }
31
+ `
32
+ )
33
+ }
34
+ ]
35
+ },
36
+ messages: {
37
+ [NO_TYPENAME_PREFIX]: 'Field "{{ fieldName }}" starts with the name of the parent type "{{ typeName }}"'
38
+ },
39
+ schema: []
40
+ },
41
+ create(context) {
42
+ return {
43
+ "ObjectTypeDefinition, ObjectTypeExtension, InterfaceTypeDefinition, InterfaceTypeExtension"(node) {
44
+ const typeName = node.name.value, lowerTypeName = typeName.toLowerCase();
45
+ for (const field of node.fields || []) {
46
+ const fieldName = field.name.value;
47
+ fieldName.toLowerCase().startsWith(lowerTypeName) && context.report({
48
+ data: {
49
+ fieldName,
50
+ typeName
51
+ },
52
+ messageId: NO_TYPENAME_PREFIX,
53
+ node: field.name,
54
+ suggest: [
55
+ {
56
+ desc: `Remove \`${fieldName.slice(0, typeName.length)}\` prefix`,
57
+ fix: (fixer) => fixer.replaceText(
58
+ field.name,
59
+ fieldName.replace(new RegExp(`^${typeName}`, "i"), "")
60
+ )
61
+ }
62
+ ]
63
+ });
64
+ }
65
+ }
66
+ };
67
+ }
68
+ };
69
+ export {
70
+ rule
71
+ };
@@ -0,0 +1,13 @@
1
+ import { GraphQLESLintRule } from '../types.mjs';
2
+ import 'eslint';
3
+ import 'estree';
4
+ import 'graphql';
5
+ import 'json-schema-to-ts';
6
+ import '../siblings.mjs';
7
+ import '@graphql-tools/utils';
8
+ import '../estree-converter/types.mjs';
9
+ import 'graphql-config';
10
+
11
+ declare const rule: GraphQLESLintRule;
12
+
13
+ export { rule };