@graphql-eslint/eslint-plugin 4.0.0-alpha.0 → 4.0.0-alpha.10

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 (275) hide show
  1. package/README.md +1 -1
  2. package/{esm/cache.d.mts → cjs/cache.d.cts} +1 -1
  3. package/cjs/cache.js +8 -36
  4. package/cjs/chunk-UIAXBAMD.js +8 -0
  5. package/cjs/configs/index.d.cts +24 -0
  6. package/cjs/configs/index.js +35 -38
  7. package/cjs/configs/operations-all.js +33 -26
  8. package/cjs/configs/operations-recommended.js +59 -52
  9. package/cjs/configs/schema-all.js +29 -22
  10. package/cjs/configs/schema-recommended.js +73 -66
  11. package/cjs/configs/schema-relay.js +17 -10
  12. package/cjs/documents.js +18 -38
  13. package/{esm/estree-converter/converter.d.mts → cjs/estree-converter/converter.d.cts} +1 -1
  14. package/cjs/estree-converter/converter.js +16 -30
  15. package/cjs/estree-converter/index.d.cts +8 -0
  16. package/cjs/estree-converter/index.js +3 -23
  17. package/{esm/estree-converter/types.d.mts → cjs/estree-converter/types.d.cts} +1 -1
  18. package/cjs/estree-converter/types.js +1 -14
  19. package/{esm/estree-converter/utils.d.mts → cjs/estree-converter/utils.d.cts} +3 -3
  20. package/cjs/estree-converter/utils.js +22 -40
  21. package/{esm/graphql-config.d.mts → cjs/graphql-config.d.cts} +3 -3
  22. package/cjs/graphql-config.js +16 -42
  23. package/cjs/index.d.cts +184 -0
  24. package/cjs/index.js +24 -41
  25. package/cjs/meta.d.cts +3 -0
  26. package/cjs/meta.js +5 -0
  27. package/cjs/package.json +1 -0
  28. package/{esm/parser.d.mts → cjs/parser.d.cts} +12 -5
  29. package/cjs/parser.js +35 -46
  30. package/{esm/processor.d.mts → cjs/processor.d.cts} +5 -1
  31. package/cjs/processor.js +25 -34
  32. package/cjs/rules/{alphabetize.d.ts → alphabetize/index.d.cts} +6 -6
  33. package/cjs/rules/{alphabetize.js → alphabetize/index.js} +69 -77
  34. package/{esm/rules/description-style.d.mts → cjs/rules/description-style/index.d.cts} +5 -5
  35. package/cjs/rules/{description-style.js → description-style/index.js} +7 -27
  36. package/{esm/rules/graphql-js-validation.d.mts → cjs/rules/graphql-js-validation.d.cts} +4 -4
  37. package/cjs/rules/graphql-js-validation.js +93 -70
  38. package/{esm/rules/index.d.mts → cjs/rules/index.d.cts} +11 -12
  39. package/cjs/rules/index.js +74 -60
  40. package/cjs/rules/{input-name.d.ts → input-name/index.d.cts} +8 -6
  41. package/cjs/rules/{input-name.js → input-name/index.js} +10 -28
  42. package/cjs/rules/{lone-executable-definition.d.ts → lone-executable-definition/index.d.cts} +5 -5
  43. package/cjs/rules/{lone-executable-definition.js → lone-executable-definition/index.js} +13 -32
  44. package/cjs/rules/{match-document-filename.d.ts → match-document-filename/index.d.cts} +6 -6
  45. package/cjs/rules/{match-document-filename.js → match-document-filename/index.js} +21 -35
  46. package/{esm/rules/naming-convention.d.mts → cjs/rules/naming-convention/index.d.cts} +8 -6
  47. package/cjs/rules/{naming-convention.js → naming-convention/index.js} +41 -54
  48. package/cjs/rules/no-anonymous-operations/index.d.cts +13 -0
  49. package/cjs/rules/{no-anonymous-operations.js → no-anonymous-operations/index.js} +9 -28
  50. package/{esm/rules/no-deprecated.d.mts → cjs/rules/no-deprecated/index.d.cts} +4 -4
  51. package/cjs/rules/{no-deprecated.js → no-deprecated/index.js} +11 -30
  52. package/cjs/rules/no-duplicate-fields/index.d.cts +13 -0
  53. package/cjs/rules/{no-duplicate-fields.js → no-duplicate-fields/index.js} +8 -28
  54. package/cjs/rules/{no-hashtag-description.d.ts → no-hashtag-description/index.d.cts} +4 -4
  55. package/cjs/rules/{no-hashtag-description.js → no-hashtag-description/index.js} +11 -31
  56. package/cjs/rules/no-one-place-fragments/index.d.cts +13 -0
  57. package/cjs/rules/{no-one-place-fragments.js → no-one-place-fragments/index.js} +11 -29
  58. package/cjs/rules/{no-root-type.d.ts → no-root-type/index.d.cts} +5 -5
  59. package/cjs/rules/{no-root-type.js → no-root-type/index.js} +9 -29
  60. package/cjs/rules/no-scalar-result-type-on-mutation/index.d.cts +13 -0
  61. package/cjs/rules/no-scalar-result-type-on-mutation/index.js +69 -0
  62. package/cjs/rules/no-typename-prefix/index.d.cts +13 -0
  63. package/cjs/rules/{no-typename-prefix.js → no-typename-prefix/index.js} +5 -25
  64. package/cjs/rules/no-unreachable-types/index.d.cts +13 -0
  65. package/cjs/rules/no-unreachable-types/index.js +155 -0
  66. package/cjs/rules/no-unused-fields/index.d.cts +13 -0
  67. package/cjs/rules/{no-unused-fields.js → no-unused-fields/index.js} +16 -34
  68. package/{esm/rules/relay-arguments.d.mts → cjs/rules/relay-arguments/index.d.cts} +5 -5
  69. package/cjs/rules/{relay-arguments.js → relay-arguments/index.js} +11 -30
  70. package/{esm/rules/relay-connection-types.d.mts → cjs/rules/relay-connection-types/index.d.cts} +4 -4
  71. package/cjs/rules/{relay-connection-types.js → relay-connection-types/index.js} +19 -40
  72. package/cjs/rules/{relay-edge-types.d.ts → relay-edge-types/index.d.cts} +8 -6
  73. package/cjs/rules/{relay-edge-types.js → relay-edge-types/index.js} +31 -44
  74. package/cjs/rules/relay-page-info/index.d.cts +13 -0
  75. package/cjs/rules/{relay-page-info.js → relay-page-info/index.js} +13 -31
  76. package/{esm/rules/require-deprecation-date.d.mts → cjs/rules/require-deprecation-date/index.d.cts} +5 -5
  77. package/cjs/rules/{require-deprecation-date.js → require-deprecation-date/index.js} +13 -32
  78. package/cjs/rules/require-deprecation-reason/index.d.cts +13 -0
  79. package/cjs/rules/require-deprecation-reason/index.js +66 -0
  80. package/{esm/rules/require-description.d.mts → cjs/rules/require-description/index.d.cts} +5 -5
  81. package/cjs/rules/{require-description.js → require-description/index.js} +30 -44
  82. package/cjs/rules/require-field-of-type-query-in-mutation-result/index.d.cts +13 -0
  83. package/cjs/rules/{require-field-of-type-query-in-mutation-result.js → require-field-of-type-query-in-mutation-result/index.js} +10 -29
  84. package/cjs/rules/require-import-fragment/index.d.cts +13 -0
  85. package/cjs/rules/{require-import-fragment.js → require-import-fragment/index.js} +20 -46
  86. package/cjs/rules/require-nullable-fields-with-oneof/index.d.cts +13 -0
  87. package/cjs/rules/require-nullable-fields-with-oneof/index.js +62 -0
  88. package/cjs/rules/require-nullable-result-in-root/index.d.cts +13 -0
  89. package/cjs/rules/{require-nullable-result-in-root.js → require-nullable-result-in-root/index.js} +12 -31
  90. package/{esm/rules/require-selections.d.mts → cjs/rules/require-selections/index.d.cts} +5 -5
  91. package/cjs/rules/{require-selections.js → require-selections/index.js} +47 -45
  92. package/cjs/rules/require-type-pattern-with-oneof/index.d.cts +13 -0
  93. package/cjs/rules/require-type-pattern-with-oneof/index.js +63 -0
  94. package/{esm/rules/selection-set-depth.d.mts → cjs/rules/selection-set-depth/index.d.cts} +5 -5
  95. package/cjs/rules/{selection-set-depth.js → selection-set-depth/index.js} +16 -42
  96. package/cjs/rules/{strict-id-in-types.d.ts → strict-id-in-types/index.d.cts} +8 -6
  97. package/cjs/rules/{strict-id-in-types.js → strict-id-in-types/index.js} +26 -39
  98. package/cjs/rules/unique-enum-value-names/index.d.cts +13 -0
  99. package/cjs/rules/{unique-enum-value-names.js → unique-enum-value-names/index.js} +10 -29
  100. package/{esm/rules/unique-fragment-name.d.mts → cjs/rules/unique-fragment-name/index.d.cts} +4 -4
  101. package/cjs/rules/unique-fragment-name/index.js +87 -0
  102. package/cjs/rules/unique-operation-name/index.d.cts +13 -0
  103. package/cjs/rules/{unique-operation-name.js → unique-operation-name/index.js} +7 -27
  104. package/{esm/schema.d.mts → cjs/schema.d.cts} +3 -3
  105. package/cjs/schema.js +11 -36
  106. package/{esm/siblings.d.mts → cjs/siblings.d.cts} +2 -2
  107. package/cjs/siblings.js +17 -33
  108. package/{esm/types.d.mts → cjs/types.d.cts} +5 -4
  109. package/cjs/types.js +1 -14
  110. package/{esm/utils.d.mts → cjs/utils.d.cts} +6 -6
  111. package/cjs/utils.js +94 -115
  112. package/{cjs → esm}/cache.d.ts +1 -1
  113. package/esm/cache.js +1 -1
  114. package/esm/configs/index.d.ts +24 -0
  115. package/esm/configs/index.js +23 -2
  116. package/esm/configs/operations-all.js +2 -2
  117. package/esm/configs/operations-recommended.js +1 -1
  118. package/esm/configs/schema-all.js +1 -1
  119. package/esm/configs/schema-recommended.js +1 -1
  120. package/esm/configs/schema-relay.js +1 -1
  121. package/esm/documents.js +9 -4
  122. package/esm/estree-converter/converter.js +1 -1
  123. package/{cjs → esm}/estree-converter/index.d.ts +2 -2
  124. package/{cjs → esm}/estree-converter/types.d.ts +1 -1
  125. package/{cjs → esm}/estree-converter/utils.d.ts +3 -3
  126. package/esm/estree-converter/utils.js +1 -1
  127. package/esm/graphql-config.js +3 -3
  128. package/esm/index.d.ts +184 -0
  129. package/esm/index.js +11 -5
  130. package/esm/meta.d.ts +3 -0
  131. package/esm/meta.js +5 -0
  132. package/{cjs → esm}/parser.d.ts +10 -3
  133. package/esm/parser.js +13 -4
  134. package/{cjs → esm}/processor.d.ts +5 -1
  135. package/esm/processor.js +6 -1
  136. package/esm/rules/{alphabetize.d.mts → alphabetize/index.d.ts} +6 -6
  137. package/esm/rules/{alphabetize.js → alphabetize/index.js} +26 -10
  138. package/{cjs/rules/description-style.d.ts → esm/rules/description-style/index.d.ts} +5 -5
  139. package/esm/rules/{description-style.js → description-style/index.js} +2 -2
  140. package/esm/rules/graphql-js-validation.js +1 -1
  141. package/{cjs → esm}/rules/index.d.ts +9 -10
  142. package/esm/rules/index.js +35 -35
  143. package/esm/rules/{input-name.d.mts → input-name/index.d.ts} +8 -6
  144. package/esm/rules/{input-name.js → input-name/index.js} +1 -1
  145. package/esm/rules/{lone-executable-definition.d.mts → lone-executable-definition/index.d.ts} +5 -5
  146. package/esm/rules/{lone-executable-definition.js → lone-executable-definition/index.js} +2 -2
  147. package/esm/rules/{match-document-filename.d.mts → match-document-filename/index.d.ts} +6 -6
  148. package/esm/rules/{match-document-filename.js → match-document-filename/index.js} +4 -4
  149. package/{cjs/rules/naming-convention.d.ts → esm/rules/naming-convention/index.d.ts} +8 -6
  150. package/esm/rules/{naming-convention.js → naming-convention/index.js} +2 -2
  151. package/{cjs/rules/no-one-place-fragments.d.ts → esm/rules/no-anonymous-operations/index.d.ts} +4 -4
  152. package/esm/rules/{no-anonymous-operations.js → no-anonymous-operations/index.js} +2 -2
  153. package/{cjs/rules/no-deprecated.d.ts → esm/rules/no-deprecated/index.d.ts} +4 -4
  154. package/esm/rules/{no-deprecated.js → no-deprecated/index.js} +2 -2
  155. package/{cjs/rules/no-scalar-result-type-on-mutation.d.ts → esm/rules/no-duplicate-fields/index.d.ts} +4 -4
  156. package/esm/rules/{no-duplicate-fields.js → no-duplicate-fields/index.js} +1 -1
  157. package/esm/rules/{no-hashtag-description.d.mts → no-hashtag-description/index.d.ts} +4 -4
  158. package/esm/rules/{no-hashtag-description.js → no-hashtag-description/index.js} +2 -2
  159. package/{cjs/rules/no-anonymous-operations.d.ts → esm/rules/no-one-place-fragments/index.d.ts} +4 -4
  160. package/esm/rules/{no-one-place-fragments.js → no-one-place-fragments/index.js} +2 -2
  161. package/esm/rules/{no-root-type.d.mts → no-root-type/index.d.ts} +5 -5
  162. package/esm/rules/{no-root-type.js → no-root-type/index.js} +2 -2
  163. package/{cjs/rules/no-duplicate-fields.d.ts → esm/rules/no-scalar-result-type-on-mutation/index.d.ts} +4 -4
  164. package/esm/rules/{no-scalar-result-type-on-mutation.js → no-scalar-result-type-on-mutation/index.js} +2 -2
  165. package/esm/rules/no-typename-prefix/index.d.ts +13 -0
  166. package/esm/rules/{no-typename-prefix.js → no-typename-prefix/index.js} +1 -1
  167. package/esm/rules/no-unreachable-types/index.d.ts +13 -0
  168. package/esm/rules/{no-unreachable-types.js → no-unreachable-types/index.js} +9 -10
  169. package/esm/rules/no-unused-fields/index.d.ts +13 -0
  170. package/esm/rules/{no-unused-fields.js → no-unused-fields/index.js} +8 -7
  171. package/{cjs/rules/relay-arguments.d.ts → esm/rules/relay-arguments/index.d.ts} +5 -5
  172. package/esm/rules/{relay-arguments.js → relay-arguments/index.js} +2 -2
  173. package/{cjs/rules/relay-connection-types.d.ts → esm/rules/relay-connection-types/index.d.ts} +4 -4
  174. package/esm/rules/{relay-connection-types.js → relay-connection-types/index.js} +1 -1
  175. package/esm/rules/{relay-edge-types.d.mts → relay-edge-types/index.d.ts} +8 -6
  176. package/esm/rules/{relay-edge-types.js → relay-edge-types/index.js} +4 -4
  177. package/esm/rules/relay-page-info/index.d.ts +13 -0
  178. package/esm/rules/{relay-page-info.js → relay-page-info/index.js} +4 -4
  179. package/{cjs/rules/require-deprecation-date.d.ts → esm/rules/require-deprecation-date/index.d.ts} +5 -5
  180. package/esm/rules/{require-deprecation-date.js → require-deprecation-date/index.js} +3 -3
  181. package/esm/rules/require-deprecation-reason/index.d.ts +13 -0
  182. package/esm/rules/{require-deprecation-reason.js → require-deprecation-reason/index.js} +3 -3
  183. package/{cjs/rules/require-description.d.ts → esm/rules/require-description/index.d.ts} +5 -5
  184. package/esm/rules/{require-description.js → require-description/index.js} +3 -3
  185. package/esm/rules/require-field-of-type-query-in-mutation-result/index.d.ts +13 -0
  186. package/esm/rules/{require-field-of-type-query-in-mutation-result.js → require-field-of-type-query-in-mutation-result/index.js} +2 -2
  187. package/esm/rules/require-import-fragment/index.d.ts +13 -0
  188. package/esm/rules/{require-import-fragment.js → require-import-fragment/index.js} +13 -12
  189. package/esm/rules/require-nullable-fields-with-oneof/index.d.ts +13 -0
  190. package/esm/rules/{require-nullable-fields-with-oneof.js → require-nullable-fields-with-oneof/index.js} +2 -2
  191. package/esm/rules/require-nullable-result-in-root/index.d.ts +13 -0
  192. package/esm/rules/{require-nullable-result-in-root.js → require-nullable-result-in-root/index.js} +2 -2
  193. package/{cjs/rules/require-selections.d.ts → esm/rules/require-selections/index.d.ts} +5 -5
  194. package/esm/rules/{require-selections.js → require-selections/index.js} +14 -8
  195. package/esm/rules/require-type-pattern-with-oneof/index.d.ts +13 -0
  196. package/esm/rules/{require-type-pattern-with-oneof.js → require-type-pattern-with-oneof/index.js} +2 -2
  197. package/{cjs/rules/selection-set-depth.d.ts → esm/rules/selection-set-depth/index.d.ts} +5 -5
  198. package/esm/rules/{selection-set-depth.js → selection-set-depth/index.js} +3 -3
  199. package/esm/rules/{strict-id-in-types.d.mts → strict-id-in-types/index.d.ts} +8 -6
  200. package/esm/rules/{strict-id-in-types.js → strict-id-in-types/index.js} +2 -2
  201. package/esm/rules/unique-enum-value-names/index.d.ts +13 -0
  202. package/esm/rules/{unique-enum-value-names.js → unique-enum-value-names/index.js} +2 -2
  203. package/{cjs/rules/unique-fragment-name.d.ts → esm/rules/unique-fragment-name/index.d.ts} +4 -4
  204. package/esm/rules/{unique-fragment-name.js → unique-fragment-name/index.js} +3 -3
  205. package/esm/rules/unique-operation-name/index.d.ts +13 -0
  206. package/esm/rules/{unique-operation-name.js → unique-operation-name/index.js} +2 -2
  207. package/esm/schema.js +1 -1
  208. package/{cjs → esm}/siblings.d.ts +2 -2
  209. package/esm/siblings.js +1 -1
  210. package/{cjs → esm}/types.d.ts +4 -3
  211. package/{cjs → esm}/utils.d.ts +4 -4
  212. package/esm/utils.js +40 -17
  213. package/{index.browser.mjs → index.browser.js} +846 -790
  214. package/package.json +9 -13
  215. package/cjs/configs/index.d.ts +0 -174
  216. package/cjs/flat-configs.d.ts +0 -307
  217. package/cjs/flat-configs.js +0 -55
  218. package/cjs/index.d.ts +0 -27
  219. package/cjs/rules/no-scalar-result-type-on-mutation.js +0 -88
  220. package/cjs/rules/no-typename-prefix.d.ts +0 -13
  221. package/cjs/rules/no-unreachable-types.d.ts +0 -13
  222. package/cjs/rules/no-unreachable-types.js +0 -177
  223. package/cjs/rules/no-unused-fields.d.ts +0 -13
  224. package/cjs/rules/relay-page-info.d.ts +0 -13
  225. package/cjs/rules/require-deprecation-reason.d.ts +0 -13
  226. package/cjs/rules/require-deprecation-reason.js +0 -85
  227. package/cjs/rules/require-field-of-type-query-in-mutation-result.d.ts +0 -13
  228. package/cjs/rules/require-import-fragment.d.ts +0 -13
  229. package/cjs/rules/require-nullable-fields-with-oneof.d.ts +0 -13
  230. package/cjs/rules/require-nullable-fields-with-oneof.js +0 -81
  231. package/cjs/rules/require-nullable-result-in-root.d.ts +0 -13
  232. package/cjs/rules/require-type-pattern-with-oneof.d.ts +0 -13
  233. package/cjs/rules/require-type-pattern-with-oneof.js +0 -83
  234. package/cjs/rules/unique-enum-value-names.d.ts +0 -13
  235. package/cjs/rules/unique-fragment-name.js +0 -106
  236. package/cjs/rules/unique-operation-name.d.ts +0 -13
  237. package/esm/configs/index.d.mts +0 -174
  238. package/esm/estree-converter/index.d.mts +0 -8
  239. package/esm/flat-configs.d.mts +0 -307
  240. package/esm/flat-configs.js +0 -36
  241. package/esm/index.d.mts +0 -27
  242. package/esm/package.json +0 -1
  243. package/esm/rules/no-anonymous-operations.d.mts +0 -13
  244. package/esm/rules/no-duplicate-fields.d.mts +0 -13
  245. package/esm/rules/no-one-place-fragments.d.mts +0 -13
  246. package/esm/rules/no-scalar-result-type-on-mutation.d.mts +0 -13
  247. package/esm/rules/no-typename-prefix.d.mts +0 -13
  248. package/esm/rules/no-unreachable-types.d.mts +0 -13
  249. package/esm/rules/no-unused-fields.d.mts +0 -13
  250. package/esm/rules/relay-page-info.d.mts +0 -13
  251. package/esm/rules/require-deprecation-reason.d.mts +0 -13
  252. package/esm/rules/require-field-of-type-query-in-mutation-result.d.mts +0 -13
  253. package/esm/rules/require-import-fragment.d.mts +0 -13
  254. package/esm/rules/require-nullable-fields-with-oneof.d.mts +0 -13
  255. package/esm/rules/require-nullable-result-in-root.d.mts +0 -13
  256. package/esm/rules/require-type-pattern-with-oneof.d.mts +0 -13
  257. package/esm/rules/unique-enum-value-names.d.mts +0 -13
  258. package/esm/rules/unique-operation-name.d.mts +0 -13
  259. package/cjs/configs/{operations-all.d.ts → operations-all.d.cts} +0 -0
  260. package/cjs/configs/{operations-recommended.d.ts → operations-recommended.d.cts} +0 -0
  261. package/cjs/configs/{schema-all.d.ts → schema-all.d.cts} +0 -0
  262. package/cjs/configs/{schema-recommended.d.ts → schema-recommended.d.cts} +0 -0
  263. package/cjs/configs/{schema-relay.d.ts → schema-relay.d.cts} +0 -0
  264. package/{esm/documents.d.mts → cjs/documents.d.cts} +1 -1
  265. package/esm/{chunk-U3TKCM4X.js → chunk-UIAXBAMD.js} +0 -0
  266. package/esm/configs/{operations-all.d.mts → operations-all.d.ts} +0 -0
  267. package/esm/configs/{operations-recommended.d.mts → operations-recommended.d.ts} +0 -0
  268. package/esm/configs/{schema-all.d.mts → schema-all.d.ts} +0 -0
  269. package/esm/configs/{schema-recommended.d.mts → schema-recommended.d.ts} +0 -0
  270. package/esm/configs/{schema-relay.d.mts → schema-relay.d.ts} +0 -0
  271. package/{cjs → esm}/documents.d.ts +1 -1
  272. package/{cjs → esm}/estree-converter/converter.d.ts +0 -0
  273. package/{cjs → esm}/graphql-config.d.ts +1 -1
  274. package/{cjs → esm}/rules/graphql-js-validation.d.ts +2 -2
  275. package/{cjs → esm}/schema.d.ts +1 -1
@@ -35,7 +35,7 @@ var require_operations_all = __commonJS({
35
35
  selections: ["OperationDefinition", "FragmentDefinition"],
36
36
  variables: !0,
37
37
  arguments: ["Field", "Directive"],
38
- groups: ["id", "*", "createdAt", "updatedAt"]
38
+ groups: ["...", "id", "*", "{"]
39
39
  }
40
40
  ],
41
41
  "@graphql-eslint/lone-executable-definition": "error",
@@ -237,9 +237,22 @@ var require_schema_relay = __commonJS({
237
237
  });
238
238
 
239
239
  // src/parser.ts
240
+ import debugFactory2 from "debug";
241
+ import { buildSchema, GraphQLError } from "graphql";
240
242
  import { parseGraphQLSDL } from "@graphql-tools/utils";
243
+
244
+ // src/cache.ts
241
245
  import debugFactory from "debug";
242
- import { buildSchema, GraphQLError } from "graphql";
246
+ var log = debugFactory("graphql-eslint:ModuleCache"), ModuleCache = class {
247
+ map = /* @__PURE__ */ new Map();
248
+ set(cacheKey, result) {
249
+ }
250
+ get(cacheKey, settings = {
251
+ lifetime: 10
252
+ /* seconds */
253
+ }) {
254
+ }
255
+ };
243
256
 
244
257
  // src/estree-converter/converter.ts
245
258
  import {
@@ -374,6 +387,9 @@ function convertToESTree(node, schema15) {
374
387
  );
375
388
  }
376
389
 
390
+ // src/meta.ts
391
+ var version = process.env.VERSION;
392
+
377
393
  // src/siblings.ts
378
394
  import {
379
395
  Kind as Kind3,
@@ -411,7 +427,7 @@ var chalk = {
411
427
  // eslint-disable-next-line no-console
412
428
  console.warn(chalk.yellow("warning"), "[graphql-eslint]", ...args)
413
429
  )
414
- }, normalizePath = (path2) => (path2 || "").replace(/\\/g, "/"), VIRTUAL_DOCUMENT_REGEX = /\/\d+_document.graphql$/, CWD = process.cwd(), getTypeName = (node) => "type" in node ? getTypeName(node.type) : "name" in node && node.name ? node.name.value : "", TYPES_KINDS = [
430
+ }, slash = (path2) => path2.replaceAll("\\", "/"), VIRTUAL_DOCUMENT_REGEX = /[/\\]\d+_document.graphql$/, CWD = process.cwd(), getTypeName = (node) => "type" in node ? getTypeName(node.type) : "name" in node && node.name ? node.name.value : "", TYPES_KINDS = [
415
431
  Kind2.OBJECT_TYPE_DEFINITION,
416
432
  Kind2.INTERFACE_TYPE_DEFINITION,
417
433
  Kind2.ENUM_TYPE_DEFINITION,
@@ -460,26 +476,49 @@ function truthy(value) {
460
476
  return !!value;
461
477
  }
462
478
  var DisplayNodeNameMap = {
463
- [Kind2.OBJECT_TYPE_DEFINITION]: "type",
464
- [Kind2.OBJECT_TYPE_EXTENSION]: "type",
465
- [Kind2.INTERFACE_TYPE_DEFINITION]: "interface",
466
- [Kind2.INTERFACE_TYPE_EXTENSION]: "interface",
479
+ [Kind2.ARGUMENT]: "argument",
480
+ [Kind2.BOOLEAN]: "boolean",
481
+ [Kind2.DIRECTIVE_DEFINITION]: "directive",
482
+ [Kind2.DIRECTIVE]: "directive",
483
+ [Kind2.DOCUMENT]: "document",
467
484
  [Kind2.ENUM_TYPE_DEFINITION]: "enum",
468
485
  [Kind2.ENUM_TYPE_EXTENSION]: "enum",
469
- [Kind2.SCALAR_TYPE_DEFINITION]: "scalar",
486
+ [Kind2.ENUM_VALUE_DEFINITION]: "enum value",
487
+ [Kind2.ENUM]: "enum",
488
+ [Kind2.FIELD_DEFINITION]: "field",
489
+ [Kind2.FIELD]: "field",
490
+ [Kind2.FLOAT]: "float",
491
+ [Kind2.FRAGMENT_DEFINITION]: "fragment",
492
+ [Kind2.FRAGMENT_SPREAD]: "fragment spread",
493
+ [Kind2.INLINE_FRAGMENT]: "inline fragment",
470
494
  [Kind2.INPUT_OBJECT_TYPE_DEFINITION]: "input",
471
495
  [Kind2.INPUT_OBJECT_TYPE_EXTENSION]: "input",
472
- [Kind2.UNION_TYPE_DEFINITION]: "union",
473
- [Kind2.UNION_TYPE_EXTENSION]: "union",
474
- [Kind2.DIRECTIVE_DEFINITION]: "directive",
475
- [Kind2.FIELD_DEFINITION]: "field",
476
- [Kind2.ENUM_VALUE_DEFINITION]: "enum value",
477
496
  [Kind2.INPUT_VALUE_DEFINITION]: "input value",
478
- [Kind2.ARGUMENT]: "argument",
479
- [Kind2.VARIABLE]: "variable",
480
- [Kind2.FRAGMENT_DEFINITION]: "fragment",
497
+ [Kind2.INT]: "int",
498
+ [Kind2.INTERFACE_TYPE_DEFINITION]: "interface",
499
+ [Kind2.INTERFACE_TYPE_EXTENSION]: "interface",
500
+ [Kind2.LIST_TYPE]: "list type",
501
+ [Kind2.LIST]: "list",
502
+ [Kind2.NAME]: "name",
503
+ [Kind2.NAMED_TYPE]: "named type",
504
+ [Kind2.NON_NULL_TYPE]: "non-null type",
505
+ [Kind2.NULL]: "null",
506
+ [Kind2.OBJECT_FIELD]: "object field",
507
+ [Kind2.OBJECT_TYPE_DEFINITION]: "type",
508
+ [Kind2.OBJECT_TYPE_EXTENSION]: "type",
509
+ [Kind2.OBJECT]: "object",
481
510
  [Kind2.OPERATION_DEFINITION]: "operation",
482
- [Kind2.FIELD]: "field"
511
+ [Kind2.OPERATION_TYPE_DEFINITION]: "operation type",
512
+ [Kind2.SCALAR_TYPE_DEFINITION]: "scalar",
513
+ [Kind2.SCALAR_TYPE_EXTENSION]: "scalar",
514
+ [Kind2.SCHEMA_DEFINITION]: "schema",
515
+ [Kind2.SCHEMA_EXTENSION]: "schema",
516
+ [Kind2.SELECTION_SET]: "selection set",
517
+ [Kind2.STRING]: "string",
518
+ [Kind2.UNION_TYPE_DEFINITION]: "union",
519
+ [Kind2.UNION_TYPE_EXTENSION]: "union",
520
+ [Kind2.VARIABLE_DEFINITION]: "variable",
521
+ [Kind2.VARIABLE]: "variable"
483
522
  };
484
523
  function displayNodeName(node) {
485
524
  return `${node.kind === Kind2.OPERATION_DEFINITION ? node.operation : DisplayNodeNameMap[node.kind]} "${"alias" in node && node.alias?.value || "name" in node && node.name?.value}"`;
@@ -575,7 +614,7 @@ function getSiblings(documents) {
575
614
  }
576
615
 
577
616
  // src/parser.ts
578
- var debug = debugFactory("graphql-eslint:parser");
617
+ var debug = debugFactory2("graphql-eslint:parser");
579
618
  debug("cwd %o", CWD);
580
619
  var LEGACY_PARSER_OPTIONS_KEYS = [
581
620
  "schema",
@@ -640,184 +679,581 @@ function parseForESLint(code, options) {
640
679
  throw error;
641
680
  }
642
681
  }
682
+ var parser = {
683
+ parseForESLint,
684
+ meta: {
685
+ name: "@graphql-eslint/parser",
686
+ version
687
+ }
688
+ };
643
689
 
644
- // src/rules/graphql-js-validation.ts
690
+ // src/rules/alphabetize/index.ts
645
691
  import {
646
- Kind as Kind4,
647
- validate,
648
- visit as visit3
692
+ Kind as Kind4
649
693
  } from "graphql";
650
- import {
651
- ExecutableDefinitionsRule,
652
- FieldsOnCorrectTypeRule,
653
- FragmentsOnCompositeTypesRule,
654
- KnownArgumentNamesRule,
655
- KnownDirectivesRule,
656
- KnownFragmentNamesRule,
657
- KnownTypeNamesRule,
658
- LoneAnonymousOperationRule,
659
- LoneSchemaDefinitionRule,
660
- NoFragmentCyclesRule,
661
- NoUndefinedVariablesRule,
662
- NoUnusedFragmentsRule,
663
- NoUnusedVariablesRule,
664
- OverlappingFieldsCanBeMergedRule,
665
- PossibleFragmentSpreadsRule,
666
- PossibleTypeExtensionsRule,
667
- ProvidedRequiredArgumentsRule,
668
- ScalarLeafsRule,
669
- SingleFieldSubscriptionsRule,
670
- UniqueArgumentNamesRule,
671
- UniqueDirectiveNamesRule,
672
- UniqueDirectivesPerLocationRule,
673
- UniqueFieldDefinitionNamesRule,
674
- UniqueInputFieldNamesRule,
675
- UniqueOperationTypesRule,
676
- UniqueTypeNamesRule,
677
- UniqueVariableNamesRule,
678
- ValuesOfCorrectTypeRule,
679
- VariablesAreInputTypesRule,
680
- VariablesInAllowedPositionRule
681
- } from "graphql/validation/index.js";
682
- import { validateSDL } from "graphql/validation/validate.js";
683
- function validateDocument({
684
- context,
685
- schema: schema15 = null,
686
- documentNode,
687
- rule: rule35,
688
- hasDidYouMeanSuggestions
689
- }) {
690
- if (documentNode.definitions.length !== 0)
691
- try {
692
- let validationErrors = schema15 ? validate(schema15, documentNode, [rule35]) : validateSDL(documentNode, null, [rule35]);
693
- for (let error of validationErrors) {
694
- let { line, column } = error.locations[0], sourceCode = context.getSourceCode(), { tokens } = sourceCode.ast, token = tokens.find(
695
- (token2) => token2.loc.start.line === line && token2.loc.start.column === column - 1
696
- ), loc = {
697
- line,
698
- column: column - 1
699
- };
700
- token && (loc = // if cursor on `@` symbol than use next node
701
- token.type === "@" ? sourceCode.getNodeByRangeIndex(token.range[1] + 1).loc : token.loc);
702
- let didYouMeanContent = error.message.match(/Did you mean (?<content>.*)\?$/)?.groups.content, matches = didYouMeanContent ? [...didYouMeanContent.matchAll(/"(?<name>[^"]*)"/g)] : [];
703
- context.report({
704
- loc,
705
- message: error.message,
706
- suggest: hasDidYouMeanSuggestions ? matches.map((match) => {
707
- let { name } = match.groups;
708
- return {
709
- desc: `Rename to \`${name}\``,
710
- fix: (fixer) => fixer.replaceText(token, name)
711
- };
712
- }) : []
713
- });
714
- }
715
- } catch (error) {
716
- context.report({
717
- loc: REPORT_ON_FIRST_CHARACTER,
718
- message: error.message
719
- });
720
- }
721
- }
722
- var getFragmentDefsAndFragmentSpreads = (node) => {
723
- let fragmentDefs = /* @__PURE__ */ new Set(), fragmentSpreads = /* @__PURE__ */ new Set();
724
- return visit3(node, {
725
- FragmentDefinition(node2) {
726
- fragmentDefs.add(node2.name.value);
727
- },
728
- FragmentSpread(node2) {
729
- fragmentSpreads.add(node2.name.value);
730
- }
731
- }), { fragmentDefs, fragmentSpreads };
732
- }, getMissingFragments = (node) => {
733
- let { fragmentDefs, fragmentSpreads } = getFragmentDefsAndFragmentSpreads(node);
734
- return [...fragmentSpreads].filter((name) => !fragmentDefs.has(name));
735
- }, handleMissingFragments = ({ ruleId, context, node }) => {
736
- let missingFragments = getMissingFragments(node);
737
- if (missingFragments.length > 0) {
738
- let siblings = requireSiblingsOperations(ruleId, context), fragmentsToAdd = [];
739
- for (let fragmentName of missingFragments) {
740
- let [foundFragment] = siblings.getFragment(fragmentName).map((source) => source.document);
741
- foundFragment && fragmentsToAdd.push(foundFragment);
742
- }
743
- if (fragmentsToAdd.length > 0)
744
- return handleMissingFragments({
745
- ruleId,
746
- context,
747
- node: {
748
- kind: Kind4.DOCUMENT,
749
- definitions: [...node.definitions, ...fragmentsToAdd]
750
- }
751
- });
752
- }
753
- return node;
754
- }, validationToRule = ({
755
- ruleId,
756
- rule: rule35,
757
- getDocumentNode,
758
- schema: schema15 = [],
759
- hasDidYouMeanSuggestions
760
- }, docs) => ({
761
- [ruleId]: {
762
- meta: {
763
- docs: {
764
- recommended: !0,
765
- ...docs,
766
- graphQLJSRuleName: rule35.name,
767
- url: `https://the-guild.dev/graphql/eslint/rules/${ruleId}`,
768
- description: `${docs.description}
769
- > This rule is a wrapper around a \`graphql-js\` validation function.`
694
+ import lowerCase2 from "lodash.lowercase";
695
+ var RULE_ID = "alphabetize", fieldsEnum = [
696
+ Kind4.OBJECT_TYPE_DEFINITION,
697
+ Kind4.INTERFACE_TYPE_DEFINITION,
698
+ Kind4.INPUT_OBJECT_TYPE_DEFINITION
699
+ ], selectionsEnum = [
700
+ Kind4.OPERATION_DEFINITION,
701
+ Kind4.FRAGMENT_DEFINITION
702
+ ], argumentsEnum = [
703
+ Kind4.FIELD_DEFINITION,
704
+ Kind4.FIELD,
705
+ Kind4.DIRECTIVE_DEFINITION,
706
+ Kind4.DIRECTIVE
707
+ ], schema = {
708
+ type: "array",
709
+ minItems: 1,
710
+ maxItems: 1,
711
+ items: {
712
+ type: "object",
713
+ additionalProperties: !1,
714
+ minProperties: 1,
715
+ properties: {
716
+ fields: {
717
+ ...ARRAY_DEFAULT_OPTIONS,
718
+ items: {
719
+ enum: fieldsEnum
720
+ },
721
+ description: "Fields of `type`, `interface`, and `input`."
770
722
  },
771
- schema: schema15,
772
- hasSuggestions: hasDidYouMeanSuggestions
773
- },
774
- create(context) {
775
- return {
776
- Document(node) {
777
- let schema16 = docs.requiresSchema ? requireGraphQLSchemaFromContext(ruleId, context) : null, documentNode = getDocumentNode ? getDocumentNode({ ruleId, context, node: node.rawNode() }) : node.rawNode();
778
- validateDocument({
779
- context,
780
- schema: schema16,
781
- documentNode,
782
- rule: rule35,
783
- hasDidYouMeanSuggestions
784
- });
785
- }
786
- };
723
+ values: {
724
+ type: "boolean",
725
+ description: "Values of `enum`."
726
+ },
727
+ selections: {
728
+ ...ARRAY_DEFAULT_OPTIONS,
729
+ items: {
730
+ enum: selectionsEnum
731
+ },
732
+ description: "Selections of `fragment` and operations `query`, `mutation` and `subscription`."
733
+ },
734
+ variables: {
735
+ type: "boolean",
736
+ description: "Variables of operations `query`, `mutation` and `subscription`."
737
+ },
738
+ arguments: {
739
+ ...ARRAY_DEFAULT_OPTIONS,
740
+ items: {
741
+ enum: argumentsEnum
742
+ },
743
+ description: "Arguments of fields and directives."
744
+ },
745
+ definitions: {
746
+ type: "boolean",
747
+ description: "Definitions \u2013 `type`, `interface`, `enum`, `scalar`, `input`, `union` and `directive`."
748
+ },
749
+ groups: {
750
+ ...ARRAY_DEFAULT_OPTIONS,
751
+ minItems: 2,
752
+ description: [
753
+ "Order group. Example: `['...', 'id', '*', '{']` where:",
754
+ "- `...` stands for fragment spreads",
755
+ "- `id` stands for field with name `id`",
756
+ "- `*` stands for everything else",
757
+ "- `{` stands for fields `selection set`"
758
+ ].join(`
759
+ `)
760
+ }
787
761
  }
788
762
  }
789
- }), GRAPHQL_JS_VALIDATIONS = Object.assign(
790
- {},
791
- validationToRule(
792
- {
793
- ruleId: "executable-definitions",
794
- rule: ExecutableDefinitionsRule
795
- },
796
- {
797
- category: "Operations",
798
- description: "A GraphQL document is only valid for execution if all definitions are either operation or fragment definitions.",
799
- requiresSchema: !0
800
- }
801
- ),
802
- validationToRule(
803
- {
804
- ruleId: "fields-on-correct-type",
805
- rule: FieldsOnCorrectTypeRule,
806
- hasDidYouMeanSuggestions: !0
807
- },
808
- {
809
- category: "Operations",
810
- description: "A GraphQL document is only valid if all fields selected are defined by the parent type, or are an allowed meta field such as `__typename`.",
811
- requiresSchema: !0
812
- }
813
- ),
814
- validationToRule(
815
- {
816
- ruleId: "fragments-on-composite-type",
817
- rule: FragmentsOnCompositeTypesRule
818
- },
819
- {
820
- category: "Operations",
763
+ }, rule = {
764
+ meta: {
765
+ type: "suggestion",
766
+ fixable: "code",
767
+ docs: {
768
+ category: ["Schema", "Operations"],
769
+ description: "Enforce arrange in alphabetical order for type fields, enum values, input object fields, operation selections and more.",
770
+ url: `https://the-guild.dev/graphql/eslint/rules/${RULE_ID}`,
771
+ examples: [
772
+ {
773
+ title: "Incorrect",
774
+ usage: [{ fields: [Kind4.OBJECT_TYPE_DEFINITION] }],
775
+ code: (
776
+ /* GraphQL */
777
+ `
778
+ type User {
779
+ password: String
780
+ firstName: String! # should be before "password"
781
+ age: Int # should be before "firstName"
782
+ lastName: String!
783
+ }
784
+ `
785
+ )
786
+ },
787
+ {
788
+ title: "Correct",
789
+ usage: [{ fields: [Kind4.OBJECT_TYPE_DEFINITION] }],
790
+ code: (
791
+ /* GraphQL */
792
+ `
793
+ type User {
794
+ age: Int
795
+ firstName: String!
796
+ lastName: String!
797
+ password: String
798
+ }
799
+ `
800
+ )
801
+ },
802
+ {
803
+ title: "Incorrect",
804
+ usage: [{ values: !0 }],
805
+ code: (
806
+ /* GraphQL */
807
+ `
808
+ enum Role {
809
+ SUPER_ADMIN
810
+ ADMIN # should be before "SUPER_ADMIN"
811
+ USER
812
+ GOD # should be before "USER"
813
+ }
814
+ `
815
+ )
816
+ },
817
+ {
818
+ title: "Correct",
819
+ usage: [{ values: !0 }],
820
+ code: (
821
+ /* GraphQL */
822
+ `
823
+ enum Role {
824
+ ADMIN
825
+ GOD
826
+ SUPER_ADMIN
827
+ USER
828
+ }
829
+ `
830
+ )
831
+ },
832
+ {
833
+ title: "Incorrect",
834
+ usage: [{ selections: [Kind4.OPERATION_DEFINITION] }],
835
+ code: (
836
+ /* GraphQL */
837
+ `
838
+ query {
839
+ me {
840
+ firstName
841
+ lastName
842
+ email # should be before "lastName"
843
+ }
844
+ }
845
+ `
846
+ )
847
+ },
848
+ {
849
+ title: "Correct",
850
+ usage: [{ selections: [Kind4.OPERATION_DEFINITION] }],
851
+ code: (
852
+ /* GraphQL */
853
+ `
854
+ query {
855
+ me {
856
+ email
857
+ firstName
858
+ lastName
859
+ }
860
+ }
861
+ `
862
+ )
863
+ }
864
+ ],
865
+ configOptions: {
866
+ schema: [
867
+ {
868
+ definitions: !0,
869
+ fields: fieldsEnum,
870
+ values: !0,
871
+ arguments: argumentsEnum,
872
+ groups: ["id", "*", "createdAt", "updatedAt"]
873
+ }
874
+ ],
875
+ operations: [
876
+ {
877
+ definitions: !0,
878
+ selections: selectionsEnum,
879
+ variables: !0,
880
+ arguments: [Kind4.FIELD, Kind4.DIRECTIVE],
881
+ groups: ["...", "id", "*", "{"]
882
+ }
883
+ ]
884
+ }
885
+ },
886
+ messages: {
887
+ [RULE_ID]: "{{ currNode }} should be before {{ prevNode }}"
888
+ },
889
+ schema
890
+ },
891
+ create(context) {
892
+ let sourceCode = context.getSourceCode();
893
+ function isNodeAndCommentOnSameLine(node, comment) {
894
+ return node.loc.end.line === comment.loc.start.line;
895
+ }
896
+ function getBeforeComments(node) {
897
+ let commentsBefore = sourceCode.getCommentsBefore(node);
898
+ if (commentsBefore.length === 0)
899
+ return [];
900
+ let tokenBefore = sourceCode.getTokenBefore(node);
901
+ if (tokenBefore)
902
+ return commentsBefore.filter((comment) => !isNodeAndCommentOnSameLine(tokenBefore, comment));
903
+ let filteredComments = [], nodeLine = node.loc.start.line;
904
+ for (let i = commentsBefore.length - 1; i >= 0; i -= 1) {
905
+ let comment = commentsBefore[i];
906
+ if (nodeLine - comment.loc.start.line - filteredComments.length > 1)
907
+ break;
908
+ filteredComments.unshift(comment);
909
+ }
910
+ return filteredComments;
911
+ }
912
+ function getRangeWithComments(node) {
913
+ node.kind === Kind4.VARIABLE && (node = node.parent);
914
+ let [firstBeforeComment] = getBeforeComments(node), [firstAfterComment] = sourceCode.getCommentsAfter(node), from = firstBeforeComment || node, to = firstAfterComment && isNodeAndCommentOnSameLine(node, firstAfterComment) ? firstAfterComment : node;
915
+ return [from.range[0], to.range[1]];
916
+ }
917
+ function checkNodes(nodes = []) {
918
+ for (let i = 1; i < nodes.length; i += 1) {
919
+ let currNode = nodes[i], currName = getName(currNode);
920
+ if (!currName)
921
+ continue;
922
+ let prevNode = nodes[i - 1], prevName = getName(prevNode);
923
+ if (prevName) {
924
+ let compareResult = prevName.localeCompare(currName), { groups } = opts, shouldSortByGroup = !1;
925
+ if (groups?.length) {
926
+ if (!groups.includes("*"))
927
+ throw new Error("`groups` option should contain `*` string.");
928
+ let indexForPrev = getIndex({ node: prevNode, groups }), indexForCurr = getIndex({ node: currNode, groups });
929
+ if (shouldSortByGroup = indexForPrev - indexForCurr > 0, indexForPrev < indexForCurr)
930
+ continue;
931
+ }
932
+ if (!shouldSortByGroup && !(compareResult === 1) && (!(compareResult === 0) || !prevNode.kind.endsWith("Extension") || currNode.kind.endsWith("Extension")))
933
+ continue;
934
+ }
935
+ context.report({
936
+ // @ts-expect-error can't be undefined
937
+ node: "alias" in currNode && currNode.alias || currNode.name,
938
+ messageId: RULE_ID,
939
+ data: {
940
+ currNode: displayNodeName(currNode),
941
+ prevNode: prevName ? displayNodeName(prevNode) : lowerCase2(prevNode.kind)
942
+ },
943
+ *fix(fixer) {
944
+ let prevRange = getRangeWithComments(prevNode), currRange = getRangeWithComments(currNode);
945
+ yield fixer.replaceTextRange(
946
+ prevRange,
947
+ sourceCode.getText({ range: currRange })
948
+ ), yield fixer.replaceTextRange(
949
+ currRange,
950
+ sourceCode.getText({ range: prevRange })
951
+ );
952
+ }
953
+ });
954
+ }
955
+ }
956
+ let opts = context.options[0], fields = new Set(opts.fields ?? []), listeners = {}, fieldsSelector = [
957
+ fields.has(Kind4.OBJECT_TYPE_DEFINITION) && [
958
+ Kind4.OBJECT_TYPE_DEFINITION,
959
+ Kind4.OBJECT_TYPE_EXTENSION
960
+ ],
961
+ fields.has(Kind4.INTERFACE_TYPE_DEFINITION) && [
962
+ Kind4.INTERFACE_TYPE_DEFINITION,
963
+ Kind4.INTERFACE_TYPE_EXTENSION
964
+ ],
965
+ fields.has(Kind4.INPUT_OBJECT_TYPE_DEFINITION) && [
966
+ Kind4.INPUT_OBJECT_TYPE_DEFINITION,
967
+ Kind4.INPUT_OBJECT_TYPE_EXTENSION
968
+ ]
969
+ ].filter(truthy).flat().join(","), selectionsSelector = opts.selections?.join(","), argumentsSelector = opts.arguments?.join(",");
970
+ if (fieldsSelector && (listeners[fieldsSelector] = (node) => {
971
+ checkNodes(node.fields);
972
+ }), opts.values) {
973
+ let enumValuesSelector = [Kind4.ENUM_TYPE_DEFINITION, Kind4.ENUM_TYPE_EXTENSION].join(",");
974
+ listeners[enumValuesSelector] = (node) => {
975
+ checkNodes(node.values);
976
+ };
977
+ }
978
+ return selectionsSelector && (listeners[`:matches(${selectionsSelector}) SelectionSet`] = (node) => {
979
+ checkNodes(node.selections);
980
+ }), opts.variables && (listeners.OperationDefinition = (node) => {
981
+ checkNodes(node.variableDefinitions?.map((varDef) => varDef.variable));
982
+ }), argumentsSelector && (listeners[argumentsSelector] = (node) => {
983
+ checkNodes(node.arguments);
984
+ }), opts.definitions && (listeners.Document = (node) => {
985
+ checkNodes(node.definitions);
986
+ }), listeners;
987
+ }
988
+ };
989
+ function getIndex({
990
+ node,
991
+ groups
992
+ }) {
993
+ let index = groups.indexOf(getName(node));
994
+ return index === -1 && "selectionSet" in node && node.selectionSet && (index = groups.indexOf("{")), index === -1 && node.kind === Kind4.FRAGMENT_SPREAD && (index = groups.indexOf("...")), index === -1 && (index = groups.indexOf("*")), index;
995
+ }
996
+ function getName(node) {
997
+ return "alias" in node && node.alias?.value || //
998
+ "name" in node && node.name?.value || "";
999
+ }
1000
+
1001
+ // src/rules/description-style/index.ts
1002
+ var schema2 = {
1003
+ type: "array",
1004
+ maxItems: 1,
1005
+ items: {
1006
+ type: "object",
1007
+ additionalProperties: !1,
1008
+ minProperties: 1,
1009
+ properties: {
1010
+ style: {
1011
+ enum: ["block", "inline"],
1012
+ default: "block"
1013
+ }
1014
+ }
1015
+ }
1016
+ }, rule2 = {
1017
+ meta: {
1018
+ type: "suggestion",
1019
+ hasSuggestions: !0,
1020
+ docs: {
1021
+ examples: [
1022
+ {
1023
+ title: "Incorrect",
1024
+ usage: [{ style: "inline" }],
1025
+ code: (
1026
+ /* GraphQL */
1027
+ `
1028
+ """ Description """
1029
+ type someTypeName {
1030
+ # ...
1031
+ }
1032
+ `
1033
+ )
1034
+ },
1035
+ {
1036
+ title: "Correct",
1037
+ usage: [{ style: "inline" }],
1038
+ code: (
1039
+ /* GraphQL */
1040
+ `
1041
+ " Description "
1042
+ type someTypeName {
1043
+ # ...
1044
+ }
1045
+ `
1046
+ )
1047
+ }
1048
+ ],
1049
+ description: "Require all comments to follow the same style (either block or inline).",
1050
+ category: "Schema",
1051
+ url: "https://the-guild.dev/graphql/eslint/rules/description-style",
1052
+ recommended: !0
1053
+ },
1054
+ schema: schema2
1055
+ },
1056
+ create(context) {
1057
+ let { style = "block" } = context.options[0] || {}, isBlock = style === "block";
1058
+ return {
1059
+ [`.description[type=StringValue][block!=${isBlock}]`](node) {
1060
+ context.report({
1061
+ loc: isBlock ? node.loc : node.loc.start,
1062
+ message: `Unexpected ${isBlock ? "inline" : "block"} description for ${getNodeName(
1063
+ node.parent
1064
+ )}`,
1065
+ suggest: [
1066
+ {
1067
+ desc: `Change to ${isBlock ? "block" : "inline"} style description`,
1068
+ fix(fixer) {
1069
+ let originalText = context.getSourceCode().getText(node), newText = isBlock ? originalText.replace(/(^")|("$)/g, '"""') : originalText.replace(/(^""")|("""$)/g, '"').replace(/\s+/g, " ");
1070
+ return fixer.replaceText(node, newText);
1071
+ }
1072
+ }
1073
+ ]
1074
+ });
1075
+ }
1076
+ };
1077
+ }
1078
+ };
1079
+
1080
+ // src/rules/graphql-js-validation.ts
1081
+ import {
1082
+ Kind as Kind5,
1083
+ validate,
1084
+ visit as visit3
1085
+ } from "graphql";
1086
+ import {
1087
+ ExecutableDefinitionsRule,
1088
+ FieldsOnCorrectTypeRule,
1089
+ FragmentsOnCompositeTypesRule,
1090
+ KnownArgumentNamesRule,
1091
+ KnownDirectivesRule,
1092
+ KnownFragmentNamesRule,
1093
+ KnownTypeNamesRule,
1094
+ LoneAnonymousOperationRule,
1095
+ LoneSchemaDefinitionRule,
1096
+ NoFragmentCyclesRule,
1097
+ NoUndefinedVariablesRule,
1098
+ NoUnusedFragmentsRule,
1099
+ NoUnusedVariablesRule,
1100
+ OverlappingFieldsCanBeMergedRule,
1101
+ PossibleFragmentSpreadsRule,
1102
+ PossibleTypeExtensionsRule,
1103
+ ProvidedRequiredArgumentsRule,
1104
+ ScalarLeafsRule,
1105
+ SingleFieldSubscriptionsRule,
1106
+ UniqueArgumentNamesRule,
1107
+ UniqueDirectiveNamesRule,
1108
+ UniqueDirectivesPerLocationRule,
1109
+ UniqueFieldDefinitionNamesRule,
1110
+ UniqueInputFieldNamesRule,
1111
+ UniqueOperationTypesRule,
1112
+ UniqueTypeNamesRule,
1113
+ UniqueVariableNamesRule,
1114
+ ValuesOfCorrectTypeRule,
1115
+ VariablesAreInputTypesRule,
1116
+ VariablesInAllowedPositionRule
1117
+ } from "graphql/validation/index.js";
1118
+ import { validateSDL } from "graphql/validation/validate.js";
1119
+ function validateDocument({
1120
+ context,
1121
+ schema: schema15 = null,
1122
+ documentNode,
1123
+ rule: rule35,
1124
+ hasDidYouMeanSuggestions
1125
+ }) {
1126
+ if (documentNode.definitions.length !== 0)
1127
+ try {
1128
+ let validationErrors = schema15 ? validate(schema15, documentNode, [rule35]) : validateSDL(documentNode, null, [rule35]);
1129
+ for (let error of validationErrors) {
1130
+ let { line, column } = error.locations[0], sourceCode = context.getSourceCode(), { tokens } = sourceCode.ast, token = tokens.find(
1131
+ (token2) => token2.loc.start.line === line && token2.loc.start.column === column - 1
1132
+ ), loc = {
1133
+ line,
1134
+ column: column - 1
1135
+ };
1136
+ token && (loc = // if cursor on `@` symbol than use next node
1137
+ token.type === "@" ? sourceCode.getNodeByRangeIndex(token.range[1] + 1).loc : token.loc);
1138
+ let didYouMeanContent = error.message.match(/Did you mean (?<content>.*)\?$/)?.groups.content, matches = didYouMeanContent ? [...didYouMeanContent.matchAll(/"(?<name>[^"]*)"/g)] : [];
1139
+ context.report({
1140
+ loc,
1141
+ message: error.message,
1142
+ suggest: hasDidYouMeanSuggestions ? matches.map((match) => {
1143
+ let { name } = match.groups;
1144
+ return {
1145
+ desc: `Rename to \`${name}\``,
1146
+ fix: (fixer) => fixer.replaceText(token, name)
1147
+ };
1148
+ }) : []
1149
+ });
1150
+ }
1151
+ } catch (error) {
1152
+ context.report({
1153
+ loc: REPORT_ON_FIRST_CHARACTER,
1154
+ message: error.message
1155
+ });
1156
+ }
1157
+ }
1158
+ var getFragmentDefsAndFragmentSpreads = (node) => {
1159
+ let fragmentDefs = /* @__PURE__ */ new Set(), fragmentSpreads = /* @__PURE__ */ new Set();
1160
+ return visit3(node, {
1161
+ FragmentDefinition(node2) {
1162
+ fragmentDefs.add(node2.name.value);
1163
+ },
1164
+ FragmentSpread(node2) {
1165
+ fragmentSpreads.add(node2.name.value);
1166
+ }
1167
+ }), { fragmentDefs, fragmentSpreads };
1168
+ }, getMissingFragments = (node) => {
1169
+ let { fragmentDefs, fragmentSpreads } = getFragmentDefsAndFragmentSpreads(node);
1170
+ return [...fragmentSpreads].filter((name) => !fragmentDefs.has(name));
1171
+ }, handleMissingFragments = ({ ruleId, context, node }) => {
1172
+ let missingFragments = getMissingFragments(node);
1173
+ if (missingFragments.length > 0) {
1174
+ let siblings = requireSiblingsOperations(ruleId, context), fragmentsToAdd = [];
1175
+ for (let fragmentName of missingFragments) {
1176
+ let [foundFragment] = siblings.getFragment(fragmentName).map((source) => source.document);
1177
+ foundFragment && fragmentsToAdd.push(foundFragment);
1178
+ }
1179
+ if (fragmentsToAdd.length > 0)
1180
+ return handleMissingFragments({
1181
+ ruleId,
1182
+ context,
1183
+ node: {
1184
+ kind: Kind5.DOCUMENT,
1185
+ definitions: [...node.definitions, ...fragmentsToAdd]
1186
+ }
1187
+ });
1188
+ }
1189
+ return node;
1190
+ }, validationToRule = ({
1191
+ ruleId,
1192
+ rule: rule35,
1193
+ getDocumentNode,
1194
+ schema: schema15 = [],
1195
+ hasDidYouMeanSuggestions
1196
+ }, docs) => ({
1197
+ [ruleId]: {
1198
+ meta: {
1199
+ docs: {
1200
+ recommended: !0,
1201
+ ...docs,
1202
+ graphQLJSRuleName: rule35.name,
1203
+ url: `https://the-guild.dev/graphql/eslint/rules/${ruleId}`,
1204
+ description: `${docs.description}
1205
+ > This rule is a wrapper around a \`graphql-js\` validation function.`
1206
+ },
1207
+ schema: schema15,
1208
+ hasSuggestions: hasDidYouMeanSuggestions
1209
+ },
1210
+ create(context) {
1211
+ return {
1212
+ Document(node) {
1213
+ let schema16 = docs.requiresSchema ? requireGraphQLSchemaFromContext(ruleId, context) : null, documentNode = getDocumentNode ? getDocumentNode({ ruleId, context, node: node.rawNode() }) : node.rawNode();
1214
+ validateDocument({
1215
+ context,
1216
+ schema: schema16,
1217
+ documentNode,
1218
+ rule: rule35,
1219
+ hasDidYouMeanSuggestions
1220
+ });
1221
+ }
1222
+ };
1223
+ }
1224
+ }
1225
+ }), GRAPHQL_JS_VALIDATIONS = Object.assign(
1226
+ {},
1227
+ validationToRule(
1228
+ {
1229
+ ruleId: "executable-definitions",
1230
+ rule: ExecutableDefinitionsRule
1231
+ },
1232
+ {
1233
+ category: "Operations",
1234
+ description: "A GraphQL document is only valid for execution if all definitions are either operation or fragment definitions.",
1235
+ requiresSchema: !0
1236
+ }
1237
+ ),
1238
+ validationToRule(
1239
+ {
1240
+ ruleId: "fields-on-correct-type",
1241
+ rule: FieldsOnCorrectTypeRule,
1242
+ hasDidYouMeanSuggestions: !0
1243
+ },
1244
+ {
1245
+ category: "Operations",
1246
+ description: "A GraphQL document is only valid if all fields selected are defined by the parent type, or are an allowed meta field such as `__typename`.",
1247
+ requiresSchema: !0
1248
+ }
1249
+ ),
1250
+ validationToRule(
1251
+ {
1252
+ ruleId: "fragments-on-composite-type",
1253
+ rule: FragmentsOnCompositeTypesRule
1254
+ },
1255
+ {
1256
+ category: "Operations",
821
1257
  description: "Fragments use a type condition to determine if they apply, since fragments can only be spread into a composite type (object, interface, or union), the type condition must also be a composite type.",
822
1258
  requiresSchema: !0
823
1259
  }
@@ -1028,13 +1464,13 @@ var getFragmentDefsAndFragmentSpreads = (node) => {
1028
1464
  delete FilePathToDocumentsMap[currentFilePath];
1029
1465
  for (let [filePath, documents] of Object.entries(FilePathToDocumentsMap))
1030
1466
  if (getMissingFragments({
1031
- kind: Kind4.DOCUMENT,
1467
+ kind: Kind5.DOCUMENT,
1032
1468
  definitions: documents
1033
1469
  }).some(
1034
1470
  (fragment) => fragmentDefs.has(fragment)
1035
1471
  ))
1036
1472
  return getParentNode(filePath, {
1037
- kind: Kind4.DOCUMENT,
1473
+ kind: Kind5.DOCUMENT,
1038
1474
  definitions: [...node2.definitions, ...documents]
1039
1475
  });
1040
1476
  return node2;
@@ -1051,580 +1487,206 @@ var getFragmentDefsAndFragmentSpreads = (node) => {
1051
1487
  ),
1052
1488
  validationToRule(
1053
1489
  {
1054
- ruleId: "no-unused-variables",
1055
- rule: NoUnusedVariablesRule,
1056
- getDocumentNode: handleMissingFragments
1057
- },
1058
- {
1059
- category: "Operations",
1060
- description: "A GraphQL operation is only valid if all variables defined by an operation are used, either directly or within a spread fragment.",
1061
- requiresSchema: !0,
1062
- requiresSiblings: !0
1063
- }
1064
- ),
1065
- validationToRule(
1066
- {
1067
- ruleId: "overlapping-fields-can-be-merged",
1068
- rule: OverlappingFieldsCanBeMergedRule
1069
- },
1070
- {
1071
- category: "Operations",
1072
- description: "A selection set is only valid if all fields (including spreading any fragments) either correspond to distinct response names or can be merged without ambiguity.",
1073
- requiresSchema: !0
1074
- }
1075
- ),
1076
- validationToRule(
1077
- {
1078
- ruleId: "possible-fragment-spread",
1079
- rule: PossibleFragmentSpreadsRule
1080
- },
1081
- {
1082
- category: "Operations",
1083
- description: "A fragment spread is only valid if the type condition could ever possibly be true: if there is a non-empty intersection of the possible parent types, and possible types which pass the type condition.",
1084
- requiresSchema: !0
1085
- }
1086
- ),
1087
- validationToRule(
1088
- {
1089
- ruleId: "possible-type-extension",
1090
- rule: PossibleTypeExtensionsRule,
1091
- hasDidYouMeanSuggestions: !0
1092
- },
1093
- {
1094
- category: "Schema",
1095
- description: "A type extension is only valid if the type is defined and has the same kind.",
1096
- recommended: !0,
1097
- requiresSchema: !0
1098
- }
1099
- ),
1100
- validationToRule(
1101
- {
1102
- ruleId: "provided-required-arguments",
1103
- rule: ProvidedRequiredArgumentsRule
1104
- },
1105
- {
1106
- category: ["Schema", "Operations"],
1107
- description: "A field or directive is only valid if all required (non-null without a default value) field arguments have been provided.",
1108
- requiresSchema: !0
1109
- }
1110
- ),
1111
- validationToRule(
1112
- {
1113
- ruleId: "scalar-leafs",
1114
- rule: ScalarLeafsRule,
1115
- hasDidYouMeanSuggestions: !0
1116
- },
1117
- {
1118
- category: "Operations",
1119
- description: "A GraphQL document is valid only if all leaf fields (fields without sub selections) are of scalar or enum types.",
1120
- requiresSchema: !0
1121
- }
1122
- ),
1123
- validationToRule(
1124
- {
1125
- ruleId: "one-field-subscriptions",
1126
- rule: SingleFieldSubscriptionsRule
1127
- },
1128
- {
1129
- category: "Operations",
1130
- description: "A GraphQL subscription is valid only if it contains a single root field.",
1131
- requiresSchema: !0
1132
- }
1133
- ),
1134
- validationToRule(
1135
- {
1136
- ruleId: "unique-argument-names",
1137
- rule: UniqueArgumentNamesRule
1138
- },
1139
- {
1140
- category: "Operations",
1141
- description: "A GraphQL field or directive is only valid if all supplied arguments are uniquely named.",
1142
- requiresSchema: !0
1143
- }
1144
- ),
1145
- validationToRule(
1146
- {
1147
- ruleId: "unique-directive-names",
1148
- rule: UniqueDirectiveNamesRule
1149
- },
1150
- {
1151
- category: "Schema",
1152
- description: "A GraphQL document is only valid if all defined directives have unique names."
1153
- }
1154
- ),
1155
- validationToRule(
1156
- {
1157
- ruleId: "unique-directive-names-per-location",
1158
- rule: UniqueDirectivesPerLocationRule
1490
+ ruleId: "no-unused-variables",
1491
+ rule: NoUnusedVariablesRule,
1492
+ getDocumentNode: handleMissingFragments
1159
1493
  },
1160
1494
  {
1161
- category: ["Schema", "Operations"],
1162
- description: "A GraphQL document is only valid if all non-repeatable directives at a given location are uniquely named.",
1163
- requiresSchema: !0
1495
+ category: "Operations",
1496
+ description: "A GraphQL operation is only valid if all variables defined by an operation are used, either directly or within a spread fragment.",
1497
+ requiresSchema: !0,
1498
+ requiresSiblings: !0
1164
1499
  }
1165
1500
  ),
1166
1501
  validationToRule(
1167
1502
  {
1168
- ruleId: "unique-field-definition-names",
1169
- rule: UniqueFieldDefinitionNamesRule
1503
+ ruleId: "overlapping-fields-can-be-merged",
1504
+ rule: OverlappingFieldsCanBeMergedRule
1170
1505
  },
1171
1506
  {
1172
- category: "Schema",
1173
- description: "A GraphQL complex type is only valid if all its fields are uniquely named."
1507
+ category: "Operations",
1508
+ description: "A selection set is only valid if all fields (including spreading any fragments) either correspond to distinct response names or can be merged without ambiguity.",
1509
+ requiresSchema: !0
1174
1510
  }
1175
1511
  ),
1176
1512
  validationToRule(
1177
1513
  {
1178
- ruleId: "unique-input-field-names",
1179
- rule: UniqueInputFieldNamesRule
1514
+ ruleId: "possible-fragment-spread",
1515
+ rule: PossibleFragmentSpreadsRule
1180
1516
  },
1181
1517
  {
1182
1518
  category: "Operations",
1183
- description: "A GraphQL input object value is only valid if all supplied fields are uniquely named."
1519
+ description: "A fragment spread is only valid if the type condition could ever possibly be true: if there is a non-empty intersection of the possible parent types, and possible types which pass the type condition.",
1520
+ requiresSchema: !0
1184
1521
  }
1185
1522
  ),
1186
1523
  validationToRule(
1187
1524
  {
1188
- ruleId: "unique-operation-types",
1189
- rule: UniqueOperationTypesRule
1525
+ ruleId: "possible-type-extension",
1526
+ rule: PossibleTypeExtensionsRule,
1527
+ hasDidYouMeanSuggestions: !0
1190
1528
  },
1191
1529
  {
1192
1530
  category: "Schema",
1193
- description: "A GraphQL document is only valid if it has only one type per operation."
1531
+ description: "A type extension is only valid if the type is defined and has the same kind.",
1532
+ recommended: !0,
1533
+ requiresSchema: !0
1194
1534
  }
1195
1535
  ),
1196
1536
  validationToRule(
1197
1537
  {
1198
- ruleId: "unique-type-names",
1199
- rule: UniqueTypeNamesRule
1538
+ ruleId: "provided-required-arguments",
1539
+ rule: ProvidedRequiredArgumentsRule
1200
1540
  },
1201
1541
  {
1202
- category: "Schema",
1203
- description: "A GraphQL document is only valid if all defined types have unique names."
1542
+ category: ["Schema", "Operations"],
1543
+ description: "A field or directive is only valid if all required (non-null without a default value) field arguments have been provided.",
1544
+ requiresSchema: !0
1204
1545
  }
1205
1546
  ),
1206
1547
  validationToRule(
1207
1548
  {
1208
- ruleId: "unique-variable-names",
1209
- rule: UniqueVariableNamesRule
1549
+ ruleId: "scalar-leafs",
1550
+ rule: ScalarLeafsRule,
1551
+ hasDidYouMeanSuggestions: !0
1210
1552
  },
1211
1553
  {
1212
1554
  category: "Operations",
1213
- description: "A GraphQL operation is only valid if all its variables are uniquely named.",
1555
+ description: "A GraphQL document is valid only if all leaf fields (fields without sub selections) are of scalar or enum types.",
1214
1556
  requiresSchema: !0
1215
1557
  }
1216
1558
  ),
1217
1559
  validationToRule(
1218
1560
  {
1219
- ruleId: "value-literals-of-correct-type",
1220
- rule: ValuesOfCorrectTypeRule,
1221
- hasDidYouMeanSuggestions: !0
1561
+ ruleId: "one-field-subscriptions",
1562
+ rule: SingleFieldSubscriptionsRule
1222
1563
  },
1223
1564
  {
1224
1565
  category: "Operations",
1225
- description: "A GraphQL document is only valid if all value literals are of the type expected at their position.",
1566
+ description: "A GraphQL subscription is valid only if it contains a single root field.",
1226
1567
  requiresSchema: !0
1227
1568
  }
1228
1569
  ),
1229
1570
  validationToRule(
1230
1571
  {
1231
- ruleId: "variables-are-input-types",
1232
- rule: VariablesAreInputTypesRule
1572
+ ruleId: "unique-argument-names",
1573
+ rule: UniqueArgumentNamesRule
1233
1574
  },
1234
1575
  {
1235
1576
  category: "Operations",
1236
- description: "A GraphQL operation is only valid if all the variables it defines are of input types (scalar, enum, or input object).",
1577
+ description: "A GraphQL field or directive is only valid if all supplied arguments are uniquely named.",
1237
1578
  requiresSchema: !0
1238
1579
  }
1239
1580
  ),
1240
1581
  validationToRule(
1241
1582
  {
1242
- ruleId: "variables-in-allowed-position",
1243
- rule: VariablesInAllowedPositionRule
1583
+ ruleId: "unique-directive-names",
1584
+ rule: UniqueDirectiveNamesRule
1244
1585
  },
1245
1586
  {
1246
- category: "Operations",
1247
- description: "Variables passed to field arguments conform to type.",
1248
- requiresSchema: !0
1249
- }
1250
- )
1251
- );
1252
-
1253
- // src/rules/alphabetize.ts
1254
- import {
1255
- Kind as Kind5
1256
- } from "graphql";
1257
- import lowerCase2 from "lodash.lowercase";
1258
- var RULE_ID = "alphabetize", fieldsEnum = [
1259
- Kind5.OBJECT_TYPE_DEFINITION,
1260
- Kind5.INTERFACE_TYPE_DEFINITION,
1261
- Kind5.INPUT_OBJECT_TYPE_DEFINITION
1262
- ], selectionsEnum = [
1263
- Kind5.OPERATION_DEFINITION,
1264
- Kind5.FRAGMENT_DEFINITION
1265
- ], argumentsEnum = [
1266
- Kind5.FIELD_DEFINITION,
1267
- Kind5.FIELD,
1268
- Kind5.DIRECTIVE_DEFINITION,
1269
- Kind5.DIRECTIVE
1270
- ], schema = {
1271
- type: "array",
1272
- minItems: 1,
1273
- maxItems: 1,
1274
- items: {
1275
- type: "object",
1276
- additionalProperties: !1,
1277
- minProperties: 1,
1278
- properties: {
1279
- fields: {
1280
- ...ARRAY_DEFAULT_OPTIONS,
1281
- items: {
1282
- enum: fieldsEnum
1283
- },
1284
- description: "Fields of `type`, `interface`, and `input`."
1285
- },
1286
- values: {
1287
- type: "boolean",
1288
- description: "Values of `enum`."
1289
- },
1290
- selections: {
1291
- ...ARRAY_DEFAULT_OPTIONS,
1292
- items: {
1293
- enum: selectionsEnum
1294
- },
1295
- description: "Selections of `fragment` and operations `query`, `mutation` and `subscription`."
1296
- },
1297
- variables: {
1298
- type: "boolean",
1299
- description: "Variables of operations `query`, `mutation` and `subscription`."
1300
- },
1301
- arguments: {
1302
- ...ARRAY_DEFAULT_OPTIONS,
1303
- items: {
1304
- enum: argumentsEnum
1305
- },
1306
- description: "Arguments of fields and directives."
1307
- },
1308
- definitions: {
1309
- type: "boolean",
1310
- description: "Definitions \u2013 `type`, `interface`, `enum`, `scalar`, `input`, `union` and `directive`."
1311
- },
1312
- groups: {
1313
- ...ARRAY_DEFAULT_OPTIONS,
1314
- minItems: 2,
1315
- description: "Custom order group. Example: `['id', '*', 'createdAt', 'updatedAt']` where `*` says for everything else."
1316
- }
1587
+ category: "Schema",
1588
+ description: "A GraphQL document is only valid if all defined directives have unique names."
1317
1589
  }
1318
- }
1319
- }, rule = {
1320
- meta: {
1321
- type: "suggestion",
1322
- fixable: "code",
1323
- docs: {
1590
+ ),
1591
+ validationToRule(
1592
+ {
1593
+ ruleId: "unique-directive-names-per-location",
1594
+ rule: UniqueDirectivesPerLocationRule
1595
+ },
1596
+ {
1324
1597
  category: ["Schema", "Operations"],
1325
- description: "Enforce arrange in alphabetical order for type fields, enum values, input object fields, operation selections and more.",
1326
- url: `https://the-guild.dev/graphql/eslint/rules/${RULE_ID}`,
1327
- examples: [
1328
- {
1329
- title: "Incorrect",
1330
- usage: [{ fields: [Kind5.OBJECT_TYPE_DEFINITION] }],
1331
- code: (
1332
- /* GraphQL */
1333
- `
1334
- type User {
1335
- password: String
1336
- firstName: String! # should be before "password"
1337
- age: Int # should be before "firstName"
1338
- lastName: String!
1339
- }
1340
- `
1341
- )
1342
- },
1343
- {
1344
- title: "Correct",
1345
- usage: [{ fields: [Kind5.OBJECT_TYPE_DEFINITION] }],
1346
- code: (
1347
- /* GraphQL */
1348
- `
1349
- type User {
1350
- age: Int
1351
- firstName: String!
1352
- lastName: String!
1353
- password: String
1354
- }
1355
- `
1356
- )
1357
- },
1358
- {
1359
- title: "Incorrect",
1360
- usage: [{ values: !0 }],
1361
- code: (
1362
- /* GraphQL */
1363
- `
1364
- enum Role {
1365
- SUPER_ADMIN
1366
- ADMIN # should be before "SUPER_ADMIN"
1367
- USER
1368
- GOD # should be before "USER"
1369
- }
1370
- `
1371
- )
1372
- },
1373
- {
1374
- title: "Correct",
1375
- usage: [{ values: !0 }],
1376
- code: (
1377
- /* GraphQL */
1378
- `
1379
- enum Role {
1380
- ADMIN
1381
- GOD
1382
- SUPER_ADMIN
1383
- USER
1384
- }
1385
- `
1386
- )
1387
- },
1388
- {
1389
- title: "Incorrect",
1390
- usage: [{ selections: [Kind5.OPERATION_DEFINITION] }],
1391
- code: (
1392
- /* GraphQL */
1393
- `
1394
- query {
1395
- me {
1396
- firstName
1397
- lastName
1398
- email # should be before "lastName"
1399
- }
1400
- }
1401
- `
1402
- )
1403
- },
1404
- {
1405
- title: "Correct",
1406
- usage: [{ selections: [Kind5.OPERATION_DEFINITION] }],
1407
- code: (
1408
- /* GraphQL */
1409
- `
1410
- query {
1411
- me {
1412
- email
1413
- firstName
1414
- lastName
1415
- }
1416
- }
1417
- `
1418
- )
1419
- }
1420
- ],
1421
- configOptions: {
1422
- schema: [
1423
- {
1424
- definitions: !0,
1425
- fields: fieldsEnum,
1426
- values: !0,
1427
- arguments: argumentsEnum,
1428
- groups: ["id", "*", "createdAt", "updatedAt"]
1429
- }
1430
- ],
1431
- operations: [
1432
- {
1433
- definitions: !0,
1434
- selections: selectionsEnum,
1435
- variables: !0,
1436
- arguments: [Kind5.FIELD, Kind5.DIRECTIVE],
1437
- groups: ["id", "*", "createdAt", "updatedAt"]
1438
- }
1439
- ]
1440
- }
1598
+ description: "A GraphQL document is only valid if all non-repeatable directives at a given location are uniquely named.",
1599
+ requiresSchema: !0
1600
+ }
1601
+ ),
1602
+ validationToRule(
1603
+ {
1604
+ ruleId: "unique-field-definition-names",
1605
+ rule: UniqueFieldDefinitionNamesRule
1441
1606
  },
1442
- messages: {
1443
- [RULE_ID]: "{{ currNode }} should be before {{ prevNode }}"
1607
+ {
1608
+ category: "Schema",
1609
+ description: "A GraphQL complex type is only valid if all its fields are uniquely named."
1610
+ }
1611
+ ),
1612
+ validationToRule(
1613
+ {
1614
+ ruleId: "unique-input-field-names",
1615
+ rule: UniqueInputFieldNamesRule
1444
1616
  },
1445
- schema
1446
- },
1447
- create(context) {
1448
- let sourceCode = context.getSourceCode();
1449
- function isNodeAndCommentOnSameLine(node, comment) {
1450
- return node.loc.end.line === comment.loc.start.line;
1617
+ {
1618
+ category: "Operations",
1619
+ description: "A GraphQL input object value is only valid if all supplied fields are uniquely named."
1451
1620
  }
1452
- function getBeforeComments(node) {
1453
- let commentsBefore = sourceCode.getCommentsBefore(node);
1454
- if (commentsBefore.length === 0)
1455
- return [];
1456
- let tokenBefore = sourceCode.getTokenBefore(node);
1457
- if (tokenBefore)
1458
- return commentsBefore.filter((comment) => !isNodeAndCommentOnSameLine(tokenBefore, comment));
1459
- let filteredComments = [], nodeLine = node.loc.start.line;
1460
- for (let i = commentsBefore.length - 1; i >= 0; i -= 1) {
1461
- let comment = commentsBefore[i];
1462
- if (nodeLine - comment.loc.start.line - filteredComments.length > 1)
1463
- break;
1464
- filteredComments.unshift(comment);
1465
- }
1466
- return filteredComments;
1621
+ ),
1622
+ validationToRule(
1623
+ {
1624
+ ruleId: "unique-operation-types",
1625
+ rule: UniqueOperationTypesRule
1626
+ },
1627
+ {
1628
+ category: "Schema",
1629
+ description: "A GraphQL document is only valid if it has only one type per operation."
1467
1630
  }
1468
- function getRangeWithComments(node) {
1469
- node.kind === Kind5.VARIABLE && (node = node.parent);
1470
- let [firstBeforeComment] = getBeforeComments(node), [firstAfterComment] = sourceCode.getCommentsAfter(node), from = firstBeforeComment || node, to = firstAfterComment && isNodeAndCommentOnSameLine(node, firstAfterComment) ? firstAfterComment : node;
1471
- return [from.range[0], to.range[1]];
1631
+ ),
1632
+ validationToRule(
1633
+ {
1634
+ ruleId: "unique-type-names",
1635
+ rule: UniqueTypeNamesRule
1636
+ },
1637
+ {
1638
+ category: "Schema",
1639
+ description: "A GraphQL document is only valid if all defined types have unique names."
1472
1640
  }
1473
- function checkNodes(nodes = []) {
1474
- for (let i = 1; i < nodes.length; i += 1) {
1475
- let currNode = nodes[i], currName = "alias" in currNode && currNode.alias?.value || "name" in currNode && currNode.name?.value;
1476
- if (!currName)
1477
- continue;
1478
- let prevNode = nodes[i - 1], prevName = "alias" in prevNode && prevNode.alias?.value || "name" in prevNode && prevNode.name?.value;
1479
- if (prevName) {
1480
- let compareResult = prevName.localeCompare(currName), { groups } = opts, shouldSortByGroup = !1;
1481
- if (groups?.length) {
1482
- if (!groups.includes("*"))
1483
- throw new Error("`groups` option should contain `*` string.");
1484
- let indexForPrev = groups.indexOf(prevName);
1485
- indexForPrev === -1 && (indexForPrev = groups.indexOf("*"));
1486
- let indexForCurr = groups.indexOf(currName);
1487
- if (indexForCurr === -1 && (indexForCurr = groups.indexOf("*")), shouldSortByGroup = indexForPrev - indexForCurr > 0, indexForPrev < indexForCurr)
1488
- continue;
1489
- }
1490
- if (!shouldSortByGroup && !(compareResult === 1) && (!(compareResult === 0) || !prevNode.kind.endsWith("Extension") || currNode.kind.endsWith("Extension")))
1491
- continue;
1492
- }
1493
- context.report({
1494
- // @ts-expect-error can't be undefined
1495
- node: "alias" in currNode && currNode.alias || currNode.name,
1496
- messageId: RULE_ID,
1497
- data: {
1498
- currNode: displayNodeName(currNode),
1499
- prevNode: prevName ? displayNodeName(prevNode) : lowerCase2(prevNode.kind)
1500
- },
1501
- *fix(fixer) {
1502
- let prevRange = getRangeWithComments(prevNode), currRange = getRangeWithComments(currNode);
1503
- yield fixer.replaceTextRange(
1504
- prevRange,
1505
- sourceCode.getText({ range: currRange })
1506
- ), yield fixer.replaceTextRange(
1507
- currRange,
1508
- sourceCode.getText({ range: prevRange })
1509
- );
1510
- }
1511
- });
1512
- }
1641
+ ),
1642
+ validationToRule(
1643
+ {
1644
+ ruleId: "unique-variable-names",
1645
+ rule: UniqueVariableNamesRule
1646
+ },
1647
+ {
1648
+ category: "Operations",
1649
+ description: "A GraphQL operation is only valid if all its variables are uniquely named.",
1650
+ requiresSchema: !0
1513
1651
  }
1514
- let opts = context.options[0], fields = new Set(opts.fields ?? []), listeners = {}, fieldsSelector = [
1515
- fields.has(Kind5.OBJECT_TYPE_DEFINITION) && [
1516
- Kind5.OBJECT_TYPE_DEFINITION,
1517
- Kind5.OBJECT_TYPE_EXTENSION
1518
- ],
1519
- fields.has(Kind5.INTERFACE_TYPE_DEFINITION) && [
1520
- Kind5.INTERFACE_TYPE_DEFINITION,
1521
- Kind5.INTERFACE_TYPE_EXTENSION
1522
- ],
1523
- fields.has(Kind5.INPUT_OBJECT_TYPE_DEFINITION) && [
1524
- Kind5.INPUT_OBJECT_TYPE_DEFINITION,
1525
- Kind5.INPUT_OBJECT_TYPE_EXTENSION
1526
- ]
1527
- ].filter(truthy).flat().join(","), selectionsSelector = opts.selections?.join(","), argumentsSelector = opts.arguments?.join(",");
1528
- if (fieldsSelector && (listeners[fieldsSelector] = (node) => {
1529
- checkNodes(node.fields);
1530
- }), opts.values) {
1531
- let enumValuesSelector = [Kind5.ENUM_TYPE_DEFINITION, Kind5.ENUM_TYPE_EXTENSION].join(",");
1532
- listeners[enumValuesSelector] = (node) => {
1533
- checkNodes(node.values);
1534
- };
1652
+ ),
1653
+ validationToRule(
1654
+ {
1655
+ ruleId: "value-literals-of-correct-type",
1656
+ rule: ValuesOfCorrectTypeRule,
1657
+ hasDidYouMeanSuggestions: !0
1658
+ },
1659
+ {
1660
+ category: "Operations",
1661
+ description: "A GraphQL document is only valid if all value literals are of the type expected at their position.",
1662
+ requiresSchema: !0
1535
1663
  }
1536
- return selectionsSelector && (listeners[`:matches(${selectionsSelector}) SelectionSet`] = (node) => {
1537
- checkNodes(node.selections);
1538
- }), opts.variables && (listeners.OperationDefinition = (node) => {
1539
- checkNodes(node.variableDefinitions?.map((varDef) => varDef.variable));
1540
- }), argumentsSelector && (listeners[argumentsSelector] = (node) => {
1541
- checkNodes(node.arguments);
1542
- }), opts.definitions && (listeners.Document = (node) => {
1543
- checkNodes(node.definitions);
1544
- }), listeners;
1545
- }
1546
- };
1547
-
1548
- // src/rules/description-style.ts
1549
- var schema2 = {
1550
- type: "array",
1551
- maxItems: 1,
1552
- items: {
1553
- type: "object",
1554
- additionalProperties: !1,
1555
- minProperties: 1,
1556
- properties: {
1557
- style: {
1558
- enum: ["block", "inline"],
1559
- default: "block"
1560
- }
1664
+ ),
1665
+ validationToRule(
1666
+ {
1667
+ ruleId: "variables-are-input-types",
1668
+ rule: VariablesAreInputTypesRule
1669
+ },
1670
+ {
1671
+ category: "Operations",
1672
+ description: "A GraphQL operation is only valid if all the variables it defines are of input types (scalar, enum, or input object).",
1673
+ requiresSchema: !0
1561
1674
  }
1562
- }
1563
- }, rule2 = {
1564
- meta: {
1565
- type: "suggestion",
1566
- hasSuggestions: !0,
1567
- docs: {
1568
- examples: [
1569
- {
1570
- title: "Incorrect",
1571
- usage: [{ style: "inline" }],
1572
- code: (
1573
- /* GraphQL */
1574
- `
1575
- """ Description """
1576
- type someTypeName {
1577
- # ...
1578
- }
1579
- `
1580
- )
1581
- },
1582
- {
1583
- title: "Correct",
1584
- usage: [{ style: "inline" }],
1585
- code: (
1586
- /* GraphQL */
1587
- `
1588
- " Description "
1589
- type someTypeName {
1590
- # ...
1591
- }
1592
- `
1593
- )
1594
- }
1595
- ],
1596
- description: "Require all comments to follow the same style (either block or inline).",
1597
- category: "Schema",
1598
- url: "https://the-guild.dev/graphql/eslint/rules/description-style",
1599
- recommended: !0
1675
+ ),
1676
+ validationToRule(
1677
+ {
1678
+ ruleId: "variables-in-allowed-position",
1679
+ rule: VariablesInAllowedPositionRule
1600
1680
  },
1601
- schema: schema2
1602
- },
1603
- create(context) {
1604
- let { style = "block" } = context.options[0] || {}, isBlock = style === "block";
1605
- return {
1606
- [`.description[type=StringValue][block!=${isBlock}]`](node) {
1607
- context.report({
1608
- loc: isBlock ? node.loc : node.loc.start,
1609
- message: `Unexpected ${isBlock ? "inline" : "block"} description for ${getNodeName(
1610
- node.parent
1611
- )}`,
1612
- suggest: [
1613
- {
1614
- desc: `Change to ${isBlock ? "block" : "inline"} style description`,
1615
- fix(fixer) {
1616
- let originalText = context.getSourceCode().getText(node), newText = isBlock ? originalText.replace(/(^")|("$)/g, '"""') : originalText.replace(/(^""")|("""$)/g, '"').replace(/\s+/g, " ");
1617
- return fixer.replaceText(node, newText);
1618
- }
1619
- }
1620
- ]
1621
- });
1622
- }
1623
- };
1624
- }
1625
- };
1681
+ {
1682
+ category: "Operations",
1683
+ description: "Variables passed to field arguments conform to type.",
1684
+ requiresSchema: !0
1685
+ }
1686
+ )
1687
+ );
1626
1688
 
1627
- // src/rules/input-name.ts
1689
+ // src/rules/input-name/index.ts
1628
1690
  import {
1629
1691
  Kind as Kind6
1630
1692
  } from "graphql";
@@ -1758,7 +1820,7 @@ Using the same name for all input parameters will make your schemas easier to co
1758
1820
  }
1759
1821
  };
1760
1822
 
1761
- // src/rules/lone-executable-definition.ts
1823
+ // src/rules/lone-executable-definition/index.ts
1762
1824
  import { OperationTypeNode as OperationTypeNode2 } from "graphql";
1763
1825
  var RULE_ID2 = "lone-executable-definition", definitionTypes = ["fragment", ...Object.values(OperationTypeNode2)], schema4 = {
1764
1826
  type: "array",
@@ -1840,8 +1902,8 @@ var RULE_ID2 = "lone-executable-definition", definitionTypes = ["fragment", ...O
1840
1902
  }
1841
1903
  };
1842
1904
 
1843
- // src/rules/match-document-filename.ts
1844
- import { basename, extname } from "path";
1905
+ // src/rules/match-document-filename/index.ts
1906
+ import { basename, extname } from "node:path";
1845
1907
  import { Kind as Kind7 } from "graphql";
1846
1908
  var MATCH_EXTENSION = "MATCH_EXTENSION", MATCH_STYLE = "MATCH_STYLE", CASE_STYLES = [
1847
1909
  "camelCase",
@@ -2068,7 +2130,7 @@ var MATCH_EXTENSION = "MATCH_EXTENSION", MATCH_STYLE = "MATCH_STYLE", CASE_STYLE
2068
2130
  }
2069
2131
  };
2070
2132
 
2071
- // src/rules/naming-convention.ts
2133
+ // src/rules/naming-convention/index.ts
2072
2134
  import { Kind as Kind8 } from "graphql";
2073
2135
  var KindToDisplayName = {
2074
2136
  // types
@@ -2462,7 +2524,7 @@ ${TYPES_KINDS.map((kind) => `- \`${kind}\``).join(`
2462
2524
  }
2463
2525
  };
2464
2526
 
2465
- // src/rules/no-anonymous-operations.ts
2527
+ // src/rules/no-anonymous-operations/index.ts
2466
2528
  import { Kind as Kind9 } from "graphql";
2467
2529
  var RULE_ID3 = "no-anonymous-operations", rule7 = {
2468
2530
  meta: {
@@ -2531,7 +2593,7 @@ var RULE_ID3 = "no-anonymous-operations", rule7 = {
2531
2593
  }
2532
2594
  };
2533
2595
 
2534
- // src/rules/no-deprecated.ts
2596
+ // src/rules/no-deprecated/index.ts
2535
2597
  import { Kind as Kind10 } from "graphql";
2536
2598
  var RULE_ID4 = "no-deprecated", rule8 = {
2537
2599
  meta: {
@@ -2652,7 +2714,7 @@ var RULE_ID4 = "no-deprecated", rule8 = {
2652
2714
  }
2653
2715
  };
2654
2716
 
2655
- // src/rules/no-duplicate-fields.ts
2717
+ // src/rules/no-duplicate-fields/index.ts
2656
2718
  import { Kind as Kind11 } from "graphql";
2657
2719
  var RULE_ID5 = "no-duplicate-fields", rule9 = {
2658
2720
  meta: {
@@ -2766,7 +2828,7 @@ var RULE_ID5 = "no-duplicate-fields", rule9 = {
2766
2828
  }
2767
2829
  };
2768
2830
 
2769
- // src/rules/no-hashtag-description.ts
2831
+ // src/rules/no-hashtag-description/index.ts
2770
2832
  import { TokenKind as TokenKind2 } from "graphql";
2771
2833
  var RULE_ID6 = "HASHTAG_COMMENT", rule10 = {
2772
2834
  meta: {
@@ -2869,8 +2931,8 @@ var RULE_ID6 = "HASHTAG_COMMENT", rule10 = {
2869
2931
  }
2870
2932
  };
2871
2933
 
2872
- // src/rules/no-one-place-fragments.ts
2873
- import { relative } from "path";
2934
+ // src/rules/no-one-place-fragments/index.ts
2935
+ import { relative } from "node:path";
2874
2936
  import { visit as visit4 } from "graphql";
2875
2937
  var RULE_ID7 = "no-one-place-fragments", rule11 = {
2876
2938
  meta: {
@@ -2949,7 +3011,7 @@ var RULE_ID7 = "no-one-place-fragments", rule11 = {
2949
3011
  }
2950
3012
  };
2951
3013
 
2952
- // src/rules/no-root-type.ts
3014
+ // src/rules/no-root-type/index.ts
2953
3015
  var schema7 = {
2954
3016
  type: "array",
2955
3017
  minItems: 1,
@@ -3029,7 +3091,7 @@ var schema7 = {
3029
3091
  }
3030
3092
  };
3031
3093
 
3032
- // src/rules/no-scalar-result-type-on-mutation.ts
3094
+ // src/rules/no-scalar-result-type-on-mutation/index.ts
3033
3095
  import { isScalarType, Kind as Kind12 } from "graphql";
3034
3096
  var RULE_ID8 = "no-scalar-result-type-on-mutation", rule13 = {
3035
3097
  meta: {
@@ -3095,7 +3157,7 @@ var RULE_ID8 = "no-scalar-result-type-on-mutation", rule13 = {
3095
3157
  }
3096
3158
  };
3097
3159
 
3098
- // src/rules/no-typename-prefix.ts
3160
+ // src/rules/no-typename-prefix/index.ts
3099
3161
  var NO_TYPENAME_PREFIX = "NO_TYPENAME_PREFIX", rule14 = {
3100
3162
  meta: {
3101
3163
  type: "suggestion",
@@ -3164,7 +3226,7 @@ var NO_TYPENAME_PREFIX = "NO_TYPENAME_PREFIX", rule14 = {
3164
3226
  }
3165
3227
  };
3166
3228
 
3167
- // src/rules/no-unreachable-types.ts
3229
+ // src/rules/no-unreachable-types/index.ts
3168
3230
  import {
3169
3231
  DirectiveLocation,
3170
3232
  isInterfaceType,
@@ -3186,7 +3248,7 @@ var RULE_ID9 = "no-unreachable-types", KINDS = [
3186
3248
  Kind13.UNION_TYPE_EXTENSION,
3187
3249
  Kind13.ENUM_TYPE_DEFINITION,
3188
3250
  Kind13.ENUM_TYPE_EXTENSION
3189
- ], reachableTypesCache, RequestDirectiveLocations = /* @__PURE__ */ new Set([
3251
+ ], reachableTypesCache = new ModuleCache(), RequestDirectiveLocations = /* @__PURE__ */ new Set([
3190
3252
  DirectiveLocation.QUERY,
3191
3253
  DirectiveLocation.MUTATION,
3192
3254
  DirectiveLocation.SUBSCRIPTION,
@@ -3197,8 +3259,9 @@ var RULE_ID9 = "no-unreachable-types", KINDS = [
3197
3259
  DirectiveLocation.VARIABLE_DEFINITION
3198
3260
  ]);
3199
3261
  function getReachableTypes(schema15) {
3200
- if (reachableTypesCache)
3201
- return reachableTypesCache;
3262
+ let cachedValue = reachableTypesCache.get(schema15);
3263
+ if (cachedValue)
3264
+ return cachedValue;
3202
3265
  let reachableTypes = /* @__PURE__ */ new Set(), collect = (node) => {
3203
3266
  let typeName = getTypeName(node);
3204
3267
  if (reachableTypes.has(typeName))
@@ -3209,8 +3272,7 @@ function getReachableTypes(schema15) {
3209
3272
  let { objects, interfaces } = schema15.getImplementations(type);
3210
3273
  for (let { astNode } of [...objects, ...interfaces])
3211
3274
  visit5(astNode, visitor);
3212
- } else
3213
- type?.astNode && visit5(type.astNode, visitor);
3275
+ } else type?.astNode && visit5(type.astNode, visitor);
3214
3276
  }, visitor = {
3215
3277
  InterfaceTypeDefinition: collect,
3216
3278
  ObjectTypeDefinition: collect,
@@ -3236,7 +3298,7 @@ function getReachableTypes(schema15) {
3236
3298
  argTypeName && reachableTypes.add(argTypeName);
3237
3299
  }
3238
3300
  }
3239
- return reachableTypesCache = reachableTypes, reachableTypesCache;
3301
+ return reachableTypesCache.set(schema15, reachableTypes), reachableTypes;
3240
3302
  }
3241
3303
  var rule15 = {
3242
3304
  meta: {
@@ -3315,12 +3377,13 @@ var rule15 = {
3315
3377
  }
3316
3378
  };
3317
3379
 
3318
- // src/rules/no-unused-fields.ts
3380
+ // src/rules/no-unused-fields/index.ts
3319
3381
  import { TypeInfo as TypeInfo2, visit as visit6, visitWithTypeInfo as visitWithTypeInfo2 } from "graphql";
3320
- var RULE_ID10 = "no-unused-fields", usedFieldsCache;
3382
+ var RULE_ID10 = "no-unused-fields", usedFieldsCache = new ModuleCache();
3321
3383
  function getUsedFields(schema15, operations) {
3322
- if (usedFieldsCache)
3323
- return usedFieldsCache;
3384
+ let cachedValue = usedFieldsCache.get(schema15);
3385
+ if (cachedValue)
3386
+ return cachedValue;
3324
3387
  let usedFields = /* @__PURE__ */ Object.create(null), typeInfo = new TypeInfo2(schema15), visitor = visitWithTypeInfo2(typeInfo, {
3325
3388
  Field(node) {
3326
3389
  if (!typeInfo.getFieldDef())
@@ -3331,7 +3394,7 @@ function getUsedFields(schema15, operations) {
3331
3394
  }), allDocuments = [...operations.getOperations(), ...operations.getFragments()];
3332
3395
  for (let { document } of allDocuments)
3333
3396
  visit6(document, visitor);
3334
- return usedFieldsCache = usedFields, usedFieldsCache;
3397
+ return usedFieldsCache.set(schema15, usedFields), usedFields;
3335
3398
  }
3336
3399
  var rule16 = {
3337
3400
  meta: {
@@ -3424,7 +3487,7 @@ var rule16 = {
3424
3487
  }
3425
3488
  };
3426
3489
 
3427
- // src/rules/relay-arguments.ts
3490
+ // src/rules/relay-arguments/index.ts
3428
3491
  import { isScalarType as isScalarType2, Kind as Kind14 } from "graphql";
3429
3492
  var RULE_ID11 = "relay-arguments", MISSING_ARGUMENTS = "MISSING_ARGUMENTS", schema8 = {
3430
3493
  type: "array",
@@ -3527,7 +3590,7 @@ var RULE_ID11 = "relay-arguments", MISSING_ARGUMENTS = "MISSING_ARGUMENTS", sche
3527
3590
  }
3528
3591
  };
3529
3592
 
3530
- // src/rules/relay-connection-types.ts
3593
+ // src/rules/relay-connection-types/index.ts
3531
3594
  import { Kind as Kind15 } from "graphql";
3532
3595
  var MUST_BE_OBJECT_TYPE = "MUST_BE_OBJECT_TYPE", MUST_CONTAIN_FIELD_EDGES = "MUST_CONTAIN_FIELD_EDGES", MUST_CONTAIN_FIELD_PAGE_INFO = "MUST_CONTAIN_FIELD_PAGE_INFO", MUST_HAVE_CONNECTION_SUFFIX = "MUST_HAVE_CONNECTION_SUFFIX", EDGES_FIELD_MUST_RETURN_LIST_TYPE = "EDGES_FIELD_MUST_RETURN_LIST_TYPE", PAGE_INFO_FIELD_MUST_RETURN_NON_NULL_TYPE = "PAGE_INFO_FIELD_MUST_RETURN_NON_NULL_TYPE", NON_OBJECT_TYPES = [
3533
3596
  Kind15.SCALAR_TYPE_DEFINITION,
@@ -3614,14 +3677,14 @@ var MUST_BE_OBJECT_TYPE = "MUST_BE_OBJECT_TYPE", MUST_CONTAIN_FIELD_EDGES = "MUS
3614
3677
  }
3615
3678
  };
3616
3679
 
3617
- // src/rules/relay-edge-types.ts
3618
- import { getDocumentNodeFromSchema } from "@graphql-tools/utils";
3680
+ // src/rules/relay-edge-types/index.ts
3619
3681
  import {
3620
3682
  isObjectType as isObjectType2,
3621
3683
  isScalarType as isScalarType3,
3622
3684
  Kind as Kind16,
3623
3685
  visit as visit7
3624
3686
  } from "graphql";
3687
+ import { getDocumentNodeFromSchema } from "@graphql-tools/utils";
3625
3688
  var RULE_ID12 = "relay-edge-types", MESSAGE_MUST_BE_OBJECT_TYPE = "MESSAGE_MUST_BE_OBJECT_TYPE", MESSAGE_MISSING_EDGE_SUFFIX = "MESSAGE_MISSING_EDGE_SUFFIX", MESSAGE_LIST_TYPE_ONLY_EDGE_TYPE = "MESSAGE_LIST_TYPE_ONLY_EDGE_TYPE", MESSAGE_SHOULD_IMPLEMENTS_NODE = "MESSAGE_SHOULD_IMPLEMENTS_NODE", edgeTypesCache;
3626
3689
  function getEdgeTypes(schema15) {
3627
3690
  if (edgeTypesCache)
@@ -3758,7 +3821,7 @@ var schema9 = {
3758
3821
  }
3759
3822
  };
3760
3823
 
3761
- // src/rules/relay-page-info.ts
3824
+ // src/rules/relay-page-info/index.ts
3762
3825
  import { isScalarType as isScalarType4, Kind as Kind17 } from "graphql";
3763
3826
  var RULE_ID13 = "relay-page-info", MESSAGE_MUST_EXIST = "MESSAGE_MUST_EXIST", MESSAGE_MUST_BE_OBJECT_TYPE2 = "MESSAGE_MUST_BE_OBJECT_TYPE", notPageInfoTypesSelector = `:matches(${NON_OBJECT_TYPES})[name.value=PageInfo] > .name`, hasPageInfoChecked = !1, rule20 = {
3764
3827
  meta: {
@@ -3831,7 +3894,7 @@ var RULE_ID13 = "relay-page-info", MESSAGE_MUST_EXIST = "MESSAGE_MUST_EXIST", ME
3831
3894
  }
3832
3895
  };
3833
3896
 
3834
- // src/rules/require-deprecation-date.ts
3897
+ // src/rules/require-deprecation-date/index.ts
3835
3898
  var DATE_REGEX = /^\d{2}\/\d{2}\/\d{4}$/, MESSAGE_REQUIRE_DATE = "MESSAGE_REQUIRE_DATE", MESSAGE_INVALID_FORMAT = "MESSAGE_INVALID_FORMAT", MESSAGE_INVALID_DATE = "MESSAGE_INVALID_DATE", MESSAGE_CAN_BE_REMOVED = "MESSAGE_CAN_BE_REMOVED", schema10 = {
3836
3899
  type: "array",
3837
3900
  maxItems: 1,
@@ -3956,7 +4019,7 @@ var DATE_REGEX = /^\d{2}\/\d{2}\/\d{4}$/, MESSAGE_REQUIRE_DATE = "MESSAGE_REQUIR
3956
4019
  }
3957
4020
  };
3958
4021
 
3959
- // src/rules/require-deprecation-reason.ts
4022
+ // src/rules/require-deprecation-reason/index.ts
3960
4023
  var rule22 = {
3961
4024
  meta: {
3962
4025
  docs: {
@@ -4018,9 +4081,9 @@ var rule22 = {
4018
4081
  }
4019
4082
  };
4020
4083
 
4021
- // src/rules/require-description.ts
4022
- import { getRootTypeNames } from "@graphql-tools/utils";
4084
+ // src/rules/require-description/index.ts
4023
4085
  import { Kind as Kind18, TokenKind as TokenKind3 } from "graphql";
4086
+ import { getRootTypeNames } from "@graphql-tools/utils";
4024
4087
  var RULE_ID14 = "require-description", ALLOWED_KINDS2 = [
4025
4088
  ...TYPES_KINDS,
4026
4089
  Kind18.DIRECTIVE_DEFINITION,
@@ -4173,7 +4236,7 @@ ${TYPES_KINDS.map((kind) => `- \`${kind}\``).join(`
4173
4236
  }
4174
4237
  };
4175
4238
 
4176
- // src/rules/require-field-of-type-query-in-mutation-result.ts
4239
+ // src/rules/require-field-of-type-query-in-mutation-result/index.ts
4177
4240
  import { isObjectType as isObjectType3 } from "graphql";
4178
4241
  var RULE_ID15 = "require-field-of-type-query-in-mutation-result", rule24 = {
4179
4242
  meta: {
@@ -4238,8 +4301,8 @@ var RULE_ID15 = "require-field-of-type-query-in-mutation-result", rule24 = {
4238
4301
  }
4239
4302
  };
4240
4303
 
4241
- // src/rules/require-import-fragment.ts
4242
- import path from "path";
4304
+ // src/rules/require-import-fragment/index.ts
4305
+ import path from "node:path";
4243
4306
  var RULE_ID16 = "require-import-fragment", SUGGESTION_ID = "add-import-expression", rule25 = {
4244
4307
  meta: {
4245
4308
  type: "suggestion",
@@ -4321,22 +4384,23 @@ var RULE_ID16 = "require-import-fragment", SUGGESTION_ID = "add-import-expressio
4321
4384
  for (let comment of comments) {
4322
4385
  if (comment.type !== "Line" || !new RegExp(
4323
4386
  `^\\s*import\\s+(${fragmentName}\\s+from\\s+)?['"]`
4324
- ).test(comment.value))
4325
- continue;
4387
+ ).test(comment.value)) continue;
4326
4388
  let extractedImportPath = comment.value.match(/(["'])((?:\1|.)*?)\1/)?.[2];
4327
- if (!extractedImportPath)
4328
- continue;
4329
- let importPath = path.join(path.dirname(filePath), extractedImportPath);
4389
+ if (!extractedImportPath) continue;
4390
+ let importPath = path.join(filePath, "..", extractedImportPath);
4330
4391
  if (fragmentsFromSiblings.some(
4331
4392
  (source) => source.filePath === importPath
4332
- ))
4333
- return;
4393
+ )) return;
4334
4394
  }
4335
4395
  if (fragmentsFromSiblings.some(
4336
4396
  (source) => source.filePath === filePath
4337
- ))
4338
- return;
4339
- let suggestedFilePaths = fragmentsFromSiblings.length ? fragmentsFromSiblings.map((o) => path.relative(path.dirname(filePath), o.filePath)) : ["CHANGE_ME.graphql"];
4397
+ )) return;
4398
+ let suggestedFilePaths = fragmentsFromSiblings.length ? fragmentsFromSiblings.map(
4399
+ (o) => (
4400
+ // Use always forward slash for suggested import path
4401
+ slash(path.relative(path.dirname(filePath), o.filePath))
4402
+ )
4403
+ ) : ["CHANGE_ME.graphql"];
4340
4404
  context.report({
4341
4405
  node,
4342
4406
  messageId: RULE_ID16,
@@ -4356,7 +4420,7 @@ var RULE_ID16 = "require-import-fragment", SUGGESTION_ID = "add-import-expressio
4356
4420
  }
4357
4421
  };
4358
4422
 
4359
- // src/rules/require-nullable-fields-with-oneof.ts
4423
+ // src/rules/require-nullable-fields-with-oneof/index.ts
4360
4424
  import { Kind as Kind19 } from "graphql";
4361
4425
  var RULE_ID17 = "require-nullable-fields-with-oneof", rule26 = {
4362
4426
  meta: {
@@ -4415,7 +4479,7 @@ var RULE_ID17 = "require-nullable-fields-with-oneof", rule26 = {
4415
4479
  }
4416
4480
  };
4417
4481
 
4418
- // src/rules/require-nullable-result-in-root.ts
4482
+ // src/rules/require-nullable-result-in-root/index.ts
4419
4483
  import { Kind as Kind20 } from "graphql";
4420
4484
  var RULE_ID18 = "require-nullable-result-in-root", rule27 = {
4421
4485
  meta: {
@@ -4492,8 +4556,7 @@ var RULE_ID18 = "require-nullable-result-in-root", rule27 = {
4492
4556
  }
4493
4557
  };
4494
4558
 
4495
- // src/rules/require-selections.ts
4496
- import { asArray } from "@graphql-tools/utils";
4559
+ // src/rules/require-selections/index.ts
4497
4560
  import {
4498
4561
  GraphQLInterfaceType,
4499
4562
  GraphQLObjectType,
@@ -4503,6 +4566,7 @@ import {
4503
4566
  visit as visit8,
4504
4567
  visitWithTypeInfo as visitWithTypeInfo3
4505
4568
  } from "graphql";
4569
+ import { asArray } from "@graphql-tools/utils";
4506
4570
  var RULE_ID19 = "require-selections", DEFAULT_ID_FIELD_NAME = "id", schema12 = {
4507
4571
  definitions: {
4508
4572
  asString: {
@@ -4618,13 +4682,19 @@ Include it in your selection set{{ addition }}.`
4618
4682
  let rawType = getBaseType(type);
4619
4683
  if (rawType instanceof GraphQLObjectType || rawType instanceof GraphQLInterfaceType)
4620
4684
  checkFields(rawType);
4621
- else if (rawType instanceof GraphQLUnionType) {
4622
- for (let selection of node.selections)
4685
+ else if (rawType instanceof GraphQLUnionType)
4686
+ for (let selection of node.selections) {
4687
+ let types = rawType.getTypes();
4623
4688
  if (selection.kind === Kind21.INLINE_FRAGMENT) {
4624
- let t = rawType.getTypes().find((t2) => t2.name === selection.typeCondition.name.value);
4689
+ let t = types.find((t2) => t2.name === selection.typeCondition.name.value);
4625
4690
  t && checkFields(t);
4691
+ } else if (selection.kind === Kind21.FRAGMENT_SPREAD) {
4692
+ let [foundSpread] = siblings.getFragment(selection.name.value);
4693
+ if (!foundSpread) return;
4694
+ let fragmentSpread = foundSpread.document, t = fragmentSpread.typeCondition.name.value === rawType.name ? rawType : types.find((t2) => t2.name === fragmentSpread.typeCondition.name.value);
4695
+ checkedFragmentSpreads.add(fragmentSpread.name.value), checkSelections(fragmentSpread.selectionSet, t, loc, parent, checkedFragmentSpreads);
4626
4696
  }
4627
- }
4697
+ }
4628
4698
  function checkFields(rawType2) {
4629
4699
  let fields = rawType2.getFields();
4630
4700
  if (!idNames.some((name) => fields[name]))
@@ -4677,7 +4747,7 @@ Include it in your selection set{{ addition }}.`
4677
4747
  }
4678
4748
  };
4679
4749
 
4680
- // src/rules/require-type-pattern-with-oneof.ts
4750
+ // src/rules/require-type-pattern-with-oneof/index.ts
4681
4751
  var RULE_ID20 = "require-type-pattern-with-oneof", rule29 = {
4682
4752
  meta: {
4683
4753
  type: "suggestion",
@@ -4737,7 +4807,7 @@ var RULE_ID20 = "require-type-pattern-with-oneof", rule29 = {
4737
4807
  }
4738
4808
  };
4739
4809
 
4740
- // src/rules/selection-set-depth.ts
4810
+ // src/rules/selection-set-depth/index.ts
4741
4811
  import { Kind as Kind22 } from "graphql";
4742
4812
  import depthLimit from "graphql-depth-limit";
4743
4813
  var RULE_ID21 = "selection-set-depth", schema13 = {
@@ -4830,7 +4900,7 @@ var RULE_ID21 = "selection-set-depth", schema13 = {
4830
4900
  checkFn({
4831
4901
  getDocument: () => document,
4832
4902
  reportError(error) {
4833
- let { line, column } = error.locations[0], token = context.getAncestors()[0].tokens.find(
4903
+ let { line, column } = error.locations[0], token = context.sourceCode.getAncestors(node)[0].tokens.find(
4834
4904
  (token2) => token2.loc.start.line === line && token2.loc.start.column === column - 1
4835
4905
  );
4836
4906
  context.report({
@@ -4867,7 +4937,7 @@ var RULE_ID21 = "selection-set-depth", schema13 = {
4867
4937
  }
4868
4938
  };
4869
4939
 
4870
- // src/rules/strict-id-in-types.ts
4940
+ // src/rules/strict-id-in-types/index.ts
4871
4941
  import { Kind as Kind23 } from "graphql";
4872
4942
  var RULE_ID22 = "strict-id-in-types", schema14 = {
4873
4943
  type: "array",
@@ -5012,7 +5082,7 @@ Accepted type${pluralTypesSuffix}: ${englishJoinWords(options.acceptedIdTypes)}.
5012
5082
  }
5013
5083
  };
5014
5084
 
5015
- // src/rules/unique-enum-value-names.ts
5085
+ // src/rules/unique-enum-value-names/index.ts
5016
5086
  import { Kind as Kind24 } from "graphql";
5017
5087
  var rule32 = {
5018
5088
  meta: {
@@ -5081,12 +5151,12 @@ var rule32 = {
5081
5151
  }
5082
5152
  };
5083
5153
 
5084
- // src/rules/unique-fragment-name.ts
5085
- import { relative as relative2 } from "path";
5154
+ // src/rules/unique-fragment-name/index.ts
5155
+ import { relative as relative2 } from "node:path";
5086
5156
  import { Kind as Kind25 } from "graphql";
5087
5157
  var RULE_ID23 = "unique-fragment-name", checkNode = (context, node, ruleId) => {
5088
5158
  let documentName = node.name.value, siblings = requireSiblingsOperations(ruleId, context), siblingDocuments = node.kind === Kind25.FRAGMENT_DEFINITION ? siblings.getFragment(documentName) : siblings.getOperation(documentName), filepath = context.filename, conflictingDocuments = siblingDocuments.filter((f) => {
5089
- let isSameName = f.document.name?.value === documentName, isSamePath = normalizePath(f.filePath) === normalizePath(filepath);
5159
+ let isSameName = f.document.name?.value === documentName, isSamePath = slash(f.filePath) === slash(filepath);
5090
5160
  return isSameName && !isSamePath;
5091
5161
  });
5092
5162
  conflictingDocuments.length > 0 && context.report({
@@ -5164,7 +5234,7 @@ var RULE_ID23 = "unique-fragment-name", checkNode = (context, node, ruleId) => {
5164
5234
  }
5165
5235
  };
5166
5236
 
5167
- // src/rules/unique-operation-name.ts
5237
+ // src/rules/unique-operation-name/index.ts
5168
5238
  var RULE_ID24 = "unique-operation-name", rule34 = {
5169
5239
  meta: {
5170
5240
  type: "suggestion",
@@ -5274,50 +5344,36 @@ var rules = {
5274
5344
  };
5275
5345
 
5276
5346
  // src/configs/index.ts
5277
- var import_operations_all = __toESM(require_operations_all()), import_operations_recommended = __toESM(require_operations_recommended()), import_schema_all = __toESM(require_schema_all()), import_schema_recommended = __toESM(require_schema_recommended()), import_schema_relay = __toESM(require_schema_relay()), configs = {
5347
+ var import_operations_all = __toESM(require_operations_all(), 1), import_operations_recommended = __toESM(require_operations_recommended(), 1), import_schema_all = __toESM(require_schema_all(), 1), import_schema_recommended = __toESM(require_schema_recommended(), 1), import_schema_relay = __toESM(require_schema_relay(), 1), configs = {
5278
5348
  "schema-recommended": import_schema_recommended.default,
5279
5349
  "schema-all": import_schema_all.default,
5280
5350
  "schema-relay": import_schema_relay.default,
5281
5351
  "operations-recommended": import_operations_recommended.default,
5282
- "operations-all": import_operations_all.default
5283
- };
5284
-
5285
- // src/flat-configs.ts
5286
- var languageOptions = {
5287
- parser: { parseForESLint }
5288
- }, flatConfigs = {
5289
- "operations-all": {
5290
- languageOptions,
5352
+ "operations-all": import_operations_all.default,
5353
+ "flat/schema-recommended": {
5354
+ rules: import_schema_recommended.default.rules
5355
+ },
5356
+ "flat/schema-all": {
5291
5357
  rules: {
5292
- ...configs["operations-recommended"].rules,
5293
- ...configs["operations-all"].rules
5358
+ ...import_schema_recommended.default.rules,
5359
+ ...import_schema_all.default.rules
5294
5360
  }
5295
5361
  },
5296
- "operations-recommended": {
5297
- languageOptions,
5298
- rules: configs["operations-recommended"].rules
5362
+ "flat/schema-relay": {
5363
+ rules: import_schema_relay.default.rules
5299
5364
  },
5300
- "schema-relay": {
5301
- languageOptions,
5302
- rules: configs["schema-relay"].rules
5365
+ "flat/operations-recommended": {
5366
+ rules: import_operations_recommended.default.rules
5303
5367
  },
5304
- "schema-all": {
5305
- languageOptions,
5368
+ "flat/operations-all": {
5306
5369
  rules: {
5307
- ...configs["schema-recommended"].rules,
5308
- ...configs["schema-all"].rules
5370
+ ...import_operations_recommended.default.rules,
5371
+ ...import_operations_all.default.rules
5309
5372
  }
5310
- },
5311
- "schema-recommended": {
5312
- languageOptions,
5313
- rules: configs["schema-recommended"].rules
5314
5373
  }
5315
5374
  };
5316
5375
  export {
5317
5376
  configs,
5318
- flatConfigs,
5319
- parseForESLint,
5320
- requireGraphQLSchemaFromContext,
5321
- requireSiblingsOperations,
5377
+ parser,
5322
5378
  rules
5323
5379
  };