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

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 (346) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +14 -252
  3. package/cjs/cache.d.ts +12 -0
  4. package/cjs/cache.js +53 -0
  5. package/cjs/configs/index.d.ts +174 -0
  6. package/cjs/configs/index.js +40 -0
  7. package/cjs/configs/operations-all.d.ts +23 -0
  8. package/cjs/configs/operations-all.js +28 -0
  9. package/cjs/configs/operations-recommended.d.ts +54 -0
  10. package/{configs/operations-recommended.json → cjs/configs/operations-recommended.js} +19 -15
  11. package/cjs/configs/schema-all.d.ts +24 -0
  12. package/cjs/configs/schema-all.js +24 -0
  13. package/cjs/configs/schema-recommended.d.ts +67 -0
  14. package/cjs/configs/schema-recommended.js +68 -0
  15. package/cjs/configs/schema-relay.d.ts +12 -0
  16. package/{configs/relay.json → cjs/configs/schema-relay.js} +6 -4
  17. package/cjs/documents.d.ts +6 -0
  18. package/cjs/documents.js +66 -0
  19. package/cjs/estree-converter/converter.d.ts +8 -0
  20. package/cjs/estree-converter/converter.js +70 -0
  21. package/cjs/estree-converter/index.d.ts +8 -0
  22. package/cjs/estree-converter/index.js +23 -0
  23. package/cjs/estree-converter/types.d.ts +42 -0
  24. package/cjs/estree-converter/types.js +14 -0
  25. package/cjs/estree-converter/utils.d.ts +17 -0
  26. package/cjs/estree-converter/utils.js +105 -0
  27. package/cjs/flat-configs.d.ts +307 -0
  28. package/cjs/flat-configs.js +55 -0
  29. package/cjs/graphql-config.d.ts +14 -0
  30. package/cjs/graphql-config.js +65 -0
  31. package/cjs/index.d.ts +28 -0
  32. package/cjs/index.js +41 -0
  33. package/cjs/parser.d.ts +13 -0
  34. package/cjs/parser.js +96 -0
  35. package/cjs/processor.d.ts +13 -0
  36. package/cjs/processor.js +95 -0
  37. package/cjs/rules/alphabetize.d.ts +74 -0
  38. package/cjs/rules/alphabetize.js +323 -0
  39. package/cjs/rules/description-style.d.ts +29 -0
  40. package/cjs/rules/description-style.js +102 -0
  41. package/cjs/rules/graphql-js-validation.d.ts +13 -0
  42. package/cjs/rules/graphql-js-validation.js +595 -0
  43. package/cjs/rules/index.d.ts +127 -0
  44. package/cjs/rules/index.js +62 -0
  45. package/cjs/rules/input-name.d.ts +44 -0
  46. package/cjs/rules/input-name.js +154 -0
  47. package/cjs/rules/lone-executable-definition.d.ts +35 -0
  48. package/cjs/rules/lone-executable-definition.js +105 -0
  49. package/cjs/rules/match-document-filename.d.ts +81 -0
  50. package/cjs/rules/match-document-filename.js +251 -0
  51. package/cjs/rules/naming-convention.d.ts +108 -0
  52. package/cjs/rules/naming-convention.js +416 -0
  53. package/cjs/rules/no-anonymous-operations.d.ts +13 -0
  54. package/cjs/rules/no-anonymous-operations.js +91 -0
  55. package/cjs/rules/no-deprecated.d.ts +13 -0
  56. package/cjs/rules/no-deprecated.js +143 -0
  57. package/cjs/rules/no-duplicate-fields.d.ts +13 -0
  58. package/cjs/rules/no-duplicate-fields.js +136 -0
  59. package/cjs/rules/no-hashtag-description.d.ts +14 -0
  60. package/cjs/rules/no-hashtag-description.js +127 -0
  61. package/cjs/rules/no-one-place-fragments.d.ts +13 -0
  62. package/cjs/rules/no-one-place-fragments.js +101 -0
  63. package/cjs/rules/no-root-type.d.ts +34 -0
  64. package/cjs/rules/no-root-type.js +103 -0
  65. package/cjs/rules/no-scalar-result-type-on-mutation.d.ts +13 -0
  66. package/cjs/rules/no-scalar-result-type-on-mutation.js +88 -0
  67. package/cjs/rules/no-typename-prefix.d.ts +13 -0
  68. package/cjs/rules/no-typename-prefix.js +91 -0
  69. package/cjs/rules/no-unreachable-types.d.ts +13 -0
  70. package/cjs/rules/no-unreachable-types.js +177 -0
  71. package/cjs/rules/no-unused-fields.d.ts +13 -0
  72. package/cjs/rules/no-unused-fields.js +132 -0
  73. package/cjs/rules/relay-arguments.d.ts +30 -0
  74. package/cjs/rules/relay-arguments.js +126 -0
  75. package/cjs/rules/relay-connection-types.d.ts +14 -0
  76. package/cjs/rules/relay-connection-types.js +111 -0
  77. package/cjs/rules/relay-edge-types.d.ts +40 -0
  78. package/cjs/rules/relay-edge-types.js +161 -0
  79. package/cjs/rules/relay-page-info.d.ts +13 -0
  80. package/cjs/rules/relay-page-info.js +98 -0
  81. package/cjs/rules/require-deprecation-date.d.ts +27 -0
  82. package/cjs/rules/require-deprecation-date.js +148 -0
  83. package/cjs/rules/require-deprecation-reason.d.ts +13 -0
  84. package/cjs/rules/require-deprecation-reason.js +85 -0
  85. package/cjs/rules/require-description.d.ts +24 -0
  86. package/cjs/rules/require-description.js +179 -0
  87. package/cjs/rules/require-field-of-type-query-in-mutation-result.d.ts +13 -0
  88. package/cjs/rules/require-field-of-type-query-in-mutation-result.js +87 -0
  89. package/cjs/rules/require-import-fragment.d.ts +13 -0
  90. package/cjs/rules/require-import-fragment.js +148 -0
  91. package/cjs/rules/require-nullable-fields-with-oneof.d.ts +13 -0
  92. package/cjs/rules/require-nullable-fields-with-oneof.js +81 -0
  93. package/cjs/rules/require-nullable-result-in-root.d.ts +13 -0
  94. package/cjs/rules/require-nullable-result-in-root.js +99 -0
  95. package/cjs/rules/require-selections.d.ts +45 -0
  96. package/cjs/rules/require-selections.js +198 -0
  97. package/cjs/rules/require-type-pattern-with-oneof.d.ts +13 -0
  98. package/cjs/rules/require-type-pattern-with-oneof.js +83 -0
  99. package/cjs/rules/selection-set-depth.d.ts +37 -0
  100. package/cjs/rules/selection-set-depth.js +159 -0
  101. package/cjs/rules/strict-id-in-types.d.ts +66 -0
  102. package/cjs/rules/strict-id-in-types.js +168 -0
  103. package/cjs/rules/unique-enum-value-names.d.ts +13 -0
  104. package/cjs/rules/unique-enum-value-names.js +91 -0
  105. package/cjs/rules/unique-fragment-name.d.ts +14 -0
  106. package/cjs/rules/unique-fragment-name.js +106 -0
  107. package/cjs/rules/unique-operation-name.d.ts +13 -0
  108. package/cjs/rules/unique-operation-name.js +93 -0
  109. package/cjs/schema.d.ts +13 -0
  110. package/cjs/schema.js +52 -0
  111. package/{sibling-operations.d.ts → cjs/siblings.d.ts} +9 -6
  112. package/cjs/siblings.js +96 -0
  113. package/cjs/types.d.ts +75 -0
  114. package/cjs/types.js +14 -0
  115. package/cjs/utils.d.ts +45 -0
  116. package/cjs/utils.js +188 -0
  117. package/esm/cache.d.mts +12 -0
  118. package/esm/cache.js +25 -0
  119. package/esm/chunk-U3TKCM4X.js +8 -0
  120. package/esm/configs/index.d.mts +174 -0
  121. package/esm/configs/index.js +16 -0
  122. package/esm/configs/operations-all.d.mts +23 -0
  123. package/esm/configs/operations-all.js +35 -0
  124. package/esm/configs/operations-recommended.d.mts +54 -0
  125. package/esm/configs/operations-recommended.js +61 -0
  126. package/esm/configs/schema-all.d.mts +24 -0
  127. package/esm/configs/schema-all.js +31 -0
  128. package/esm/configs/schema-recommended.d.mts +67 -0
  129. package/esm/configs/schema-recommended.js +75 -0
  130. package/esm/configs/schema-relay.d.mts +12 -0
  131. package/esm/configs/schema-relay.js +18 -0
  132. package/esm/documents.d.mts +6 -0
  133. package/esm/documents.js +41 -0
  134. package/esm/estree-converter/converter.d.mts +8 -0
  135. package/esm/estree-converter/converter.js +56 -0
  136. package/esm/estree-converter/index.d.mts +8 -0
  137. package/esm/estree-converter/index.js +3 -0
  138. package/esm/estree-converter/types.d.mts +42 -0
  139. package/esm/estree-converter/types.js +0 -0
  140. package/esm/estree-converter/utils.d.mts +17 -0
  141. package/esm/estree-converter/utils.js +87 -0
  142. package/esm/flat-configs.d.mts +307 -0
  143. package/esm/flat-configs.js +36 -0
  144. package/esm/graphql-config.d.mts +14 -0
  145. package/esm/graphql-config.js +39 -0
  146. package/esm/index.d.mts +28 -0
  147. package/esm/index.js +18 -0
  148. package/esm/package.json +1 -0
  149. package/esm/parser.d.mts +13 -0
  150. package/esm/parser.js +76 -0
  151. package/esm/processor.d.mts +13 -0
  152. package/esm/processor.js +81 -0
  153. package/esm/rules/alphabetize.d.mts +74 -0
  154. package/esm/rules/alphabetize.js +299 -0
  155. package/esm/rules/description-style.d.mts +29 -0
  156. package/esm/rules/description-style.js +82 -0
  157. package/esm/rules/graphql-js-validation.d.mts +13 -0
  158. package/esm/rules/graphql-js-validation.js +618 -0
  159. package/esm/rules/index.d.mts +127 -0
  160. package/esm/rules/index.js +76 -0
  161. package/esm/rules/input-name.d.mts +44 -0
  162. package/esm/rules/input-name.js +136 -0
  163. package/esm/rules/lone-executable-definition.d.mts +35 -0
  164. package/esm/rules/lone-executable-definition.js +86 -0
  165. package/esm/rules/match-document-filename.d.mts +81 -0
  166. package/esm/rules/match-document-filename.js +237 -0
  167. package/esm/rules/naming-convention.d.mts +108 -0
  168. package/esm/rules/naming-convention.js +403 -0
  169. package/esm/rules/no-anonymous-operations.d.mts +13 -0
  170. package/esm/rules/no-anonymous-operations.js +72 -0
  171. package/esm/rules/no-deprecated.d.mts +13 -0
  172. package/esm/rules/no-deprecated.js +124 -0
  173. package/esm/rules/no-duplicate-fields.d.mts +13 -0
  174. package/esm/rules/no-duplicate-fields.js +116 -0
  175. package/esm/rules/no-hashtag-description.d.mts +14 -0
  176. package/esm/rules/no-hashtag-description.js +107 -0
  177. package/esm/rules/no-one-place-fragments.d.mts +13 -0
  178. package/esm/rules/no-one-place-fragments.js +83 -0
  179. package/esm/rules/no-root-type.d.mts +34 -0
  180. package/esm/rules/no-root-type.js +83 -0
  181. package/esm/rules/no-scalar-result-type-on-mutation.d.mts +13 -0
  182. package/esm/rules/no-scalar-result-type-on-mutation.js +69 -0
  183. package/esm/rules/no-typename-prefix.d.mts +13 -0
  184. package/esm/rules/no-typename-prefix.js +71 -0
  185. package/esm/rules/no-unreachable-types.d.mts +13 -0
  186. package/esm/rules/no-unreachable-types.js +156 -0
  187. package/esm/rules/no-unused-fields.d.mts +13 -0
  188. package/esm/rules/no-unused-fields.js +113 -0
  189. package/esm/rules/relay-arguments.d.mts +30 -0
  190. package/esm/rules/relay-arguments.js +107 -0
  191. package/esm/rules/relay-connection-types.d.mts +14 -0
  192. package/esm/rules/relay-connection-types.js +90 -0
  193. package/esm/rules/relay-edge-types.d.mts +40 -0
  194. package/esm/rules/relay-edge-types.js +148 -0
  195. package/esm/rules/relay-page-info.d.mts +13 -0
  196. package/esm/rules/relay-page-info.js +80 -0
  197. package/esm/rules/require-deprecation-date.d.mts +27 -0
  198. package/esm/rules/require-deprecation-date.js +129 -0
  199. package/esm/rules/require-deprecation-reason.d.mts +13 -0
  200. package/esm/rules/require-deprecation-reason.js +66 -0
  201. package/esm/rules/require-description.d.mts +24 -0
  202. package/esm/rules/require-description.js +165 -0
  203. package/esm/rules/require-field-of-type-query-in-mutation-result.d.mts +13 -0
  204. package/esm/rules/require-field-of-type-query-in-mutation-result.js +68 -0
  205. package/esm/rules/require-import-fragment.d.mts +13 -0
  206. package/esm/rules/require-import-fragment.js +121 -0
  207. package/esm/rules/require-nullable-fields-with-oneof.d.mts +13 -0
  208. package/esm/rules/require-nullable-fields-with-oneof.js +62 -0
  209. package/esm/rules/require-nullable-result-in-root.d.mts +13 -0
  210. package/esm/rules/require-nullable-result-in-root.js +80 -0
  211. package/esm/rules/require-selections.d.mts +45 -0
  212. package/esm/rules/require-selections.js +194 -0
  213. package/esm/rules/require-type-pattern-with-oneof.d.mts +13 -0
  214. package/esm/rules/require-type-pattern-with-oneof.js +63 -0
  215. package/esm/rules/selection-set-depth.d.mts +37 -0
  216. package/esm/rules/selection-set-depth.js +133 -0
  217. package/esm/rules/strict-id-in-types.d.mts +66 -0
  218. package/esm/rules/strict-id-in-types.js +155 -0
  219. package/esm/rules/unique-enum-value-names.d.mts +13 -0
  220. package/esm/rules/unique-enum-value-names.js +72 -0
  221. package/esm/rules/unique-fragment-name.d.mts +14 -0
  222. package/esm/rules/unique-fragment-name.js +87 -0
  223. package/esm/rules/unique-operation-name.d.mts +13 -0
  224. package/esm/rules/unique-operation-name.js +73 -0
  225. package/esm/schema.d.mts +13 -0
  226. package/esm/schema.js +27 -0
  227. package/esm/siblings.d.mts +24 -0
  228. package/esm/siblings.js +80 -0
  229. package/esm/types.d.mts +75 -0
  230. package/esm/types.js +0 -0
  231. package/esm/utils.d.mts +45 -0
  232. package/esm/utils.js +144 -0
  233. package/index.browser.mjs +5323 -0
  234. package/package.json +43 -35
  235. package/configs/base.json +0 -4
  236. package/configs/operations-all.json +0 -24
  237. package/configs/schema-all.json +0 -26
  238. package/configs/schema-recommended.json +0 -49
  239. package/docs/README.md +0 -75
  240. package/docs/custom-rules.md +0 -148
  241. package/docs/deprecated-rules.md +0 -21
  242. package/docs/parser-options.md +0 -85
  243. package/docs/parser.md +0 -49
  244. package/docs/rules/alphabetize.md +0 -178
  245. package/docs/rules/description-style.md +0 -54
  246. package/docs/rules/executable-definitions.md +0 -17
  247. package/docs/rules/fields-on-correct-type.md +0 -17
  248. package/docs/rules/fragments-on-composite-type.md +0 -17
  249. package/docs/rules/input-name.md +0 -76
  250. package/docs/rules/known-argument-names.md +0 -17
  251. package/docs/rules/known-directives.md +0 -44
  252. package/docs/rules/known-fragment-names.md +0 -69
  253. package/docs/rules/known-type-names.md +0 -17
  254. package/docs/rules/lone-anonymous-operation.md +0 -17
  255. package/docs/rules/lone-schema-definition.md +0 -17
  256. package/docs/rules/match-document-filename.md +0 -156
  257. package/docs/rules/naming-convention.md +0 -300
  258. package/docs/rules/no-anonymous-operations.md +0 -39
  259. package/docs/rules/no-case-insensitive-enum-values-duplicates.md +0 -43
  260. package/docs/rules/no-deprecated.md +0 -85
  261. package/docs/rules/no-duplicate-fields.md +0 -65
  262. package/docs/rules/no-fragment-cycles.md +0 -17
  263. package/docs/rules/no-hashtag-description.md +0 -59
  264. package/docs/rules/no-root-type.md +0 -53
  265. package/docs/rules/no-scalar-result-type-on-mutation.md +0 -37
  266. package/docs/rules/no-typename-prefix.md +0 -39
  267. package/docs/rules/no-undefined-variables.md +0 -17
  268. package/docs/rules/no-unreachable-types.md +0 -49
  269. package/docs/rules/no-unused-fields.md +0 -62
  270. package/docs/rules/no-unused-fragments.md +0 -17
  271. package/docs/rules/no-unused-variables.md +0 -17
  272. package/docs/rules/one-field-subscriptions.md +0 -17
  273. package/docs/rules/overlapping-fields-can-be-merged.md +0 -17
  274. package/docs/rules/possible-fragment-spread.md +0 -17
  275. package/docs/rules/possible-type-extension.md +0 -15
  276. package/docs/rules/provided-required-arguments.md +0 -17
  277. package/docs/rules/relay-arguments.md +0 -57
  278. package/docs/rules/relay-connection-types.md +0 -42
  279. package/docs/rules/relay-edge-types.md +0 -56
  280. package/docs/rules/relay-page-info.md +0 -32
  281. package/docs/rules/require-deprecation-date.md +0 -56
  282. package/docs/rules/require-deprecation-reason.md +0 -47
  283. package/docs/rules/require-description.md +0 -115
  284. package/docs/rules/require-field-of-type-query-in-mutation-result.md +0 -47
  285. package/docs/rules/require-id-when-available.md +0 -88
  286. package/docs/rules/scalar-leafs.md +0 -17
  287. package/docs/rules/selection-set-depth.md +0 -76
  288. package/docs/rules/strict-id-in-types.md +0 -130
  289. package/docs/rules/unique-argument-names.md +0 -17
  290. package/docs/rules/unique-directive-names-per-location.md +0 -17
  291. package/docs/rules/unique-directive-names.md +0 -17
  292. package/docs/rules/unique-enum-value-names.md +0 -15
  293. package/docs/rules/unique-field-definition-names.md +0 -17
  294. package/docs/rules/unique-fragment-name.md +0 -51
  295. package/docs/rules/unique-input-field-names.md +0 -17
  296. package/docs/rules/unique-operation-name.md +0 -55
  297. package/docs/rules/unique-operation-types.md +0 -17
  298. package/docs/rules/unique-type-names.md +0 -17
  299. package/docs/rules/unique-variable-names.md +0 -17
  300. package/docs/rules/value-literals-of-correct-type.md +0 -17
  301. package/docs/rules/variables-are-input-types.md +0 -17
  302. package/docs/rules/variables-in-allowed-position.md +0 -17
  303. package/estree-converter/converter.d.ts +0 -3
  304. package/estree-converter/index.d.ts +0 -3
  305. package/estree-converter/types.d.ts +0 -40
  306. package/estree-converter/utils.d.ts +0 -13
  307. package/graphql-config.d.ts +0 -3
  308. package/index.d.ts +0 -16
  309. package/index.js +0 -4653
  310. package/index.mjs +0 -4641
  311. package/parser.d.ts +0 -2
  312. package/processor.d.ts +0 -7
  313. package/rules/alphabetize.d.ts +0 -16
  314. package/rules/description-style.d.ts +0 -6
  315. package/rules/graphql-js-validation.d.ts +0 -2
  316. package/rules/index.d.ts +0 -41
  317. package/rules/input-name.d.ts +0 -9
  318. package/rules/match-document-filename.d.ts +0 -18
  319. package/rules/naming-convention.d.ts +0 -37
  320. package/rules/no-anonymous-operations.d.ts +0 -3
  321. package/rules/no-case-insensitive-enum-values-duplicates.d.ts +0 -3
  322. package/rules/no-deprecated.d.ts +0 -3
  323. package/rules/no-duplicate-fields.d.ts +0 -3
  324. package/rules/no-hashtag-description.d.ts +0 -3
  325. package/rules/no-root-type.d.ts +0 -7
  326. package/rules/no-scalar-result-type-on-mutation.d.ts +0 -3
  327. package/rules/no-typename-prefix.d.ts +0 -3
  328. package/rules/no-unreachable-types.d.ts +0 -3
  329. package/rules/no-unused-fields.d.ts +0 -3
  330. package/rules/relay-arguments.d.ts +0 -6
  331. package/rules/relay-connection-types.d.ts +0 -5
  332. package/rules/relay-edge-types.d.ts +0 -8
  333. package/rules/relay-page-info.d.ts +0 -3
  334. package/rules/require-deprecation-date.d.ts +0 -5
  335. package/rules/require-deprecation-reason.d.ts +0 -3
  336. package/rules/require-description.d.ts +0 -11
  337. package/rules/require-field-of-type-query-in-mutation-result.d.ts +0 -3
  338. package/rules/require-id-when-available.d.ts +0 -6
  339. package/rules/selection-set-depth.d.ts +0 -7
  340. package/rules/strict-id-in-types.d.ts +0 -11
  341. package/rules/unique-fragment-name.d.ts +0 -6
  342. package/rules/unique-operation-name.d.ts +0 -3
  343. package/schema.d.ts +0 -3
  344. package/testkit.d.ts +0 -27
  345. package/types.d.ts +0 -79
  346. package/utils.d.ts +0 -39
@@ -0,0 +1,156 @@
1
+ import "../chunk-U3TKCM4X.js";
2
+ import {
3
+ DirectiveLocation,
4
+ isInterfaceType,
5
+ Kind,
6
+ visit
7
+ } from "graphql";
8
+ import lowerCase from "lodash.lowercase";
9
+ import { getTypeName, requireGraphQLSchemaFromContext } from "../utils.js";
10
+ const RULE_ID = "no-unreachable-types", KINDS = [
11
+ Kind.DIRECTIVE_DEFINITION,
12
+ Kind.OBJECT_TYPE_DEFINITION,
13
+ Kind.OBJECT_TYPE_EXTENSION,
14
+ Kind.INTERFACE_TYPE_DEFINITION,
15
+ Kind.INTERFACE_TYPE_EXTENSION,
16
+ Kind.SCALAR_TYPE_DEFINITION,
17
+ Kind.SCALAR_TYPE_EXTENSION,
18
+ Kind.INPUT_OBJECT_TYPE_DEFINITION,
19
+ Kind.INPUT_OBJECT_TYPE_EXTENSION,
20
+ Kind.UNION_TYPE_DEFINITION,
21
+ Kind.UNION_TYPE_EXTENSION,
22
+ Kind.ENUM_TYPE_DEFINITION,
23
+ Kind.ENUM_TYPE_EXTENSION
24
+ ];
25
+ let reachableTypesCache;
26
+ const RequestDirectiveLocations = /* @__PURE__ */ new Set([
27
+ DirectiveLocation.QUERY,
28
+ DirectiveLocation.MUTATION,
29
+ DirectiveLocation.SUBSCRIPTION,
30
+ DirectiveLocation.FIELD,
31
+ DirectiveLocation.FRAGMENT_DEFINITION,
32
+ DirectiveLocation.FRAGMENT_SPREAD,
33
+ DirectiveLocation.INLINE_FRAGMENT,
34
+ DirectiveLocation.VARIABLE_DEFINITION
35
+ ]);
36
+ function getReachableTypes(schema) {
37
+ if (reachableTypesCache)
38
+ return reachableTypesCache;
39
+ const reachableTypes = /* @__PURE__ */ new Set(), collect = (node) => {
40
+ const typeName = getTypeName(node);
41
+ if (reachableTypes.has(typeName))
42
+ return;
43
+ reachableTypes.add(typeName);
44
+ const type = schema.getType(typeName) || schema.getDirective(typeName);
45
+ if (isInterfaceType(type)) {
46
+ const { objects, interfaces } = schema.getImplementations(type);
47
+ for (const { astNode } of [...objects, ...interfaces])
48
+ visit(astNode, visitor);
49
+ } else
50
+ type?.astNode && visit(type.astNode, visitor);
51
+ }, visitor = {
52
+ InterfaceTypeDefinition: collect,
53
+ ObjectTypeDefinition: collect,
54
+ InputValueDefinition: collect,
55
+ UnionTypeDefinition: collect,
56
+ FieldDefinition: collect,
57
+ Directive: collect,
58
+ NamedType: collect
59
+ };
60
+ for (const type of [
61
+ schema,
62
+ // visiting SchemaDefinition node
63
+ schema.getQueryType(),
64
+ schema.getMutationType(),
65
+ schema.getSubscriptionType()
66
+ ])
67
+ type?.astNode && visit(type.astNode, visitor);
68
+ for (const node of schema.getDirectives())
69
+ if (node.locations.some((location) => RequestDirectiveLocations.has(location))) {
70
+ reachableTypes.add(node.name);
71
+ for (const arg of node.args) {
72
+ const argTypeName = "name" in arg.type && arg.type.name;
73
+ argTypeName && reachableTypes.add(argTypeName);
74
+ }
75
+ }
76
+ return reachableTypesCache = reachableTypes, reachableTypesCache;
77
+ }
78
+ const rule = {
79
+ meta: {
80
+ messages: {
81
+ [RULE_ID]: "{{ type }} `{{ typeName }}` is unreachable."
82
+ },
83
+ docs: {
84
+ description: "Requires all types to be reachable at some level by root level fields.",
85
+ category: "Schema",
86
+ url: `https://the-guild.dev/graphql/eslint/rules/${RULE_ID}`,
87
+ requiresSchema: !0,
88
+ examples: [
89
+ {
90
+ title: "Incorrect",
91
+ code: (
92
+ /* GraphQL */
93
+ `
94
+ type User {
95
+ id: ID!
96
+ name: String
97
+ }
98
+
99
+ type Query {
100
+ me: String
101
+ }
102
+ `
103
+ )
104
+ },
105
+ {
106
+ title: "Correct",
107
+ code: (
108
+ /* GraphQL */
109
+ `
110
+ type User {
111
+ id: ID!
112
+ name: String
113
+ }
114
+
115
+ type Query {
116
+ me: User
117
+ }
118
+ `
119
+ )
120
+ }
121
+ ],
122
+ recommended: !0
123
+ },
124
+ type: "suggestion",
125
+ schema: [],
126
+ hasSuggestions: !0
127
+ },
128
+ create(context) {
129
+ const schema = requireGraphQLSchemaFromContext(RULE_ID, context), reachableTypes = getReachableTypes(schema);
130
+ return {
131
+ [`:matches(${KINDS}) > .name`](node) {
132
+ const typeName = node.value;
133
+ if (!reachableTypes.has(typeName)) {
134
+ const type = lowerCase(node.parent.kind.replace(/(Extension|Definition)$/, ""));
135
+ context.report({
136
+ node,
137
+ messageId: RULE_ID,
138
+ data: {
139
+ type: type[0].toUpperCase() + type.slice(1),
140
+ typeName
141
+ },
142
+ suggest: [
143
+ {
144
+ desc: `Remove \`${typeName}\``,
145
+ fix: (fixer) => fixer.remove(node.parent)
146
+ }
147
+ ]
148
+ });
149
+ }
150
+ }
151
+ };
152
+ }
153
+ };
154
+ export {
155
+ rule
156
+ };
@@ -0,0 +1,13 @@
1
+ import { GraphQLESLintRule } from '../types.mjs';
2
+ import 'eslint';
3
+ import 'estree';
4
+ import 'graphql';
5
+ import 'json-schema-to-ts';
6
+ import '../siblings.mjs';
7
+ import '@graphql-tools/utils';
8
+ import '../estree-converter/types.mjs';
9
+ import 'graphql-config';
10
+
11
+ declare const rule: GraphQLESLintRule;
12
+
13
+ export { rule };
@@ -0,0 +1,113 @@
1
+ import "../chunk-U3TKCM4X.js";
2
+ import { TypeInfo, visit, visitWithTypeInfo } from "graphql";
3
+ import { requireGraphQLSchemaFromContext, requireSiblingsOperations } from "../utils.js";
4
+ const RULE_ID = "no-unused-fields";
5
+ let usedFieldsCache;
6
+ function getUsedFields(schema, operations) {
7
+ if (usedFieldsCache)
8
+ return usedFieldsCache;
9
+ const usedFields = /* @__PURE__ */ Object.create(null), typeInfo = new TypeInfo(schema), visitor = visitWithTypeInfo(typeInfo, {
10
+ Field(node) {
11
+ if (!typeInfo.getFieldDef())
12
+ return !1;
13
+ const parentTypeName = typeInfo.getParentType().name, fieldName = node.name.value;
14
+ usedFields[parentTypeName] ??= /* @__PURE__ */ new Set(), usedFields[parentTypeName].add(fieldName);
15
+ }
16
+ }), allDocuments = [...operations.getOperations(), ...operations.getFragments()];
17
+ for (const { document } of allDocuments)
18
+ visit(document, visitor);
19
+ return usedFieldsCache = usedFields, usedFieldsCache;
20
+ }
21
+ const rule = {
22
+ meta: {
23
+ messages: {
24
+ [RULE_ID]: 'Field "{{fieldName}}" is unused'
25
+ },
26
+ docs: {
27
+ description: "Requires all fields to be used at some level by siblings operations.",
28
+ category: "Schema",
29
+ url: `https://the-guild.dev/graphql/eslint/rules/${RULE_ID}`,
30
+ requiresSiblings: !0,
31
+ requiresSchema: !0,
32
+ // Requires documents to be set
33
+ isDisabledForAllConfig: !0,
34
+ examples: [
35
+ {
36
+ title: "Incorrect",
37
+ code: (
38
+ /* GraphQL */
39
+ `
40
+ type User {
41
+ id: ID!
42
+ name: String
43
+ someUnusedField: String
44
+ }
45
+
46
+ type Query {
47
+ me: User
48
+ }
49
+
50
+ query {
51
+ me {
52
+ id
53
+ name
54
+ }
55
+ }
56
+ `
57
+ )
58
+ },
59
+ {
60
+ title: "Correct",
61
+ code: (
62
+ /* GraphQL */
63
+ `
64
+ type User {
65
+ id: ID!
66
+ name: String
67
+ }
68
+
69
+ type Query {
70
+ me: User
71
+ }
72
+
73
+ query {
74
+ me {
75
+ id
76
+ name
77
+ }
78
+ }
79
+ `
80
+ )
81
+ }
82
+ ]
83
+ },
84
+ type: "suggestion",
85
+ schema: [],
86
+ hasSuggestions: !0
87
+ },
88
+ create(context) {
89
+ const schema = requireGraphQLSchemaFromContext(RULE_ID, context), siblingsOperations = requireSiblingsOperations(RULE_ID, context), usedFields = getUsedFields(schema, siblingsOperations);
90
+ return {
91
+ FieldDefinition(node) {
92
+ const fieldName = node.name.value, parentTypeName = node.parent.name.value;
93
+ usedFields[parentTypeName]?.has(fieldName) || context.report({
94
+ node: node.name,
95
+ messageId: RULE_ID,
96
+ data: { fieldName },
97
+ suggest: [
98
+ {
99
+ desc: `Remove \`${fieldName}\` field`,
100
+ fix(fixer) {
101
+ const sourceCode = context.getSourceCode(), tokenBefore = sourceCode.getTokenBefore(node), tokenAfter = sourceCode.getTokenAfter(node), isEmptyType = tokenBefore.type === "{" && tokenAfter.type === "}";
102
+ return fixer.remove(isEmptyType ? node.parent : node);
103
+ }
104
+ }
105
+ ]
106
+ });
107
+ }
108
+ };
109
+ }
110
+ };
111
+ export {
112
+ rule
113
+ };
@@ -0,0 +1,30 @@
1
+ import { FromSchema } from 'json-schema-to-ts';
2
+ import { GraphQLESLintRule } from '../types.mjs';
3
+ import 'eslint';
4
+ import 'estree';
5
+ import 'graphql';
6
+ import '../siblings.mjs';
7
+ import '@graphql-tools/utils';
8
+ import '../estree-converter/types.mjs';
9
+ import 'graphql-config';
10
+
11
+ declare const schema: {
12
+ readonly type: "array";
13
+ readonly maxItems: 1;
14
+ readonly items: {
15
+ readonly type: "object";
16
+ readonly additionalProperties: false;
17
+ readonly minProperties: 1;
18
+ readonly properties: {
19
+ readonly includeBoth: {
20
+ readonly type: "boolean";
21
+ readonly default: true;
22
+ readonly description: "Enforce including both forward and backward pagination arguments";
23
+ };
24
+ };
25
+ };
26
+ };
27
+ type RuleOptions = FromSchema<typeof schema>;
28
+ declare const rule: GraphQLESLintRule<RuleOptions, true>;
29
+
30
+ export { RuleOptions, rule };
@@ -0,0 +1,107 @@
1
+ import "../chunk-U3TKCM4X.js";
2
+ import { isScalarType, Kind } from "graphql";
3
+ import { requireGraphQLSchemaFromContext } from "../utils.js";
4
+ const RULE_ID = "relay-arguments", MISSING_ARGUMENTS = "MISSING_ARGUMENTS", schema = {
5
+ type: "array",
6
+ maxItems: 1,
7
+ items: {
8
+ type: "object",
9
+ additionalProperties: !1,
10
+ minProperties: 1,
11
+ properties: {
12
+ includeBoth: {
13
+ type: "boolean",
14
+ default: !0,
15
+ description: "Enforce including both forward and backward pagination arguments"
16
+ }
17
+ }
18
+ }
19
+ }, rule = {
20
+ meta: {
21
+ type: "problem",
22
+ docs: {
23
+ category: "Schema",
24
+ description: [
25
+ "Set of rules to follow Relay specification for Arguments.",
26
+ "",
27
+ "- A field that returns a Connection type must include forward pagination arguments (`first` and `after`), backward pagination arguments (`last` and `before`), or both",
28
+ "",
29
+ "Forward pagination arguments",
30
+ "",
31
+ "- `first` takes a non-negative integer",
32
+ "- `after` takes the Cursor type",
33
+ "",
34
+ "Backward pagination arguments",
35
+ "",
36
+ "- `last` takes a non-negative integer",
37
+ "- `before` takes the Cursor type"
38
+ ].join(`
39
+ `),
40
+ url: `https://the-guild.dev/graphql/eslint/rules/${RULE_ID}`,
41
+ examples: [
42
+ {
43
+ title: "Incorrect",
44
+ code: (
45
+ /* GraphQL */
46
+ `
47
+ type User {
48
+ posts: PostConnection
49
+ }
50
+ `
51
+ )
52
+ },
53
+ {
54
+ title: "Correct",
55
+ code: (
56
+ /* GraphQL */
57
+ `
58
+ type User {
59
+ posts(after: String, first: Int, before: String, last: Int): PostConnection
60
+ }
61
+ `
62
+ )
63
+ }
64
+ ],
65
+ isDisabledForAllConfig: !0
66
+ },
67
+ messages: {
68
+ [MISSING_ARGUMENTS]: "A field that returns a Connection type must include forward pagination arguments (`first` and `after`), backward pagination arguments (`last` and `before`), or both."
69
+ },
70
+ schema
71
+ },
72
+ create(context) {
73
+ const schema2 = requireGraphQLSchemaFromContext(RULE_ID, context), { includeBoth = !0 } = context.options[0] || {};
74
+ return {
75
+ "FieldDefinition > .gqlType Name[value=/Connection$/]"(node) {
76
+ let fieldNode = node.parent;
77
+ for (; fieldNode.kind !== Kind.FIELD_DEFINITION; )
78
+ fieldNode = fieldNode.parent;
79
+ const args = Object.fromEntries(
80
+ fieldNode.arguments?.map((argument) => [argument.name.value, argument]) || []
81
+ ), hasForwardPagination = !!(args.first && args.after), hasBackwardPagination = !!(args.last && args.before);
82
+ if (!hasForwardPagination && !hasBackwardPagination) {
83
+ context.report({
84
+ node: fieldNode.name,
85
+ messageId: MISSING_ARGUMENTS
86
+ });
87
+ return;
88
+ }
89
+ function checkField(typeName, argumentName) {
90
+ const argument = args[argumentName], hasArgument = !!argument;
91
+ let type = argument;
92
+ if (hasArgument && type.gqlType.kind === Kind.NON_NULL_TYPE && (type = type.gqlType), !(hasArgument && type.gqlType.kind === Kind.NAMED_TYPE && (type.gqlType.name.value === typeName || typeName === "String" && isScalarType(schema2.getType(type.gqlType.name.value))))) {
93
+ const returnType = typeName === "String" ? "String or Scalar" : typeName;
94
+ context.report({
95
+ node: (argument || fieldNode).name,
96
+ message: hasArgument ? `Argument \`${argumentName}\` must return ${returnType}.` : `Field \`${fieldNode.name.value}\` must contain an argument \`${argumentName}\`, that return ${returnType}.`
97
+ });
98
+ }
99
+ }
100
+ (includeBoth || args.first || args.after) && (checkField("Int", "first"), checkField("String", "after")), (includeBoth || args.last || args.before) && (checkField("Int", "last"), checkField("String", "before"));
101
+ }
102
+ };
103
+ }
104
+ };
105
+ export {
106
+ rule
107
+ };
@@ -0,0 +1,14 @@
1
+ import { Kind } from 'graphql';
2
+ import { GraphQLESLintRule } from '../types.mjs';
3
+ import 'eslint';
4
+ import 'estree';
5
+ import 'json-schema-to-ts';
6
+ import '../siblings.mjs';
7
+ import '@graphql-tools/utils';
8
+ import '../estree-converter/types.mjs';
9
+ import 'graphql-config';
10
+
11
+ declare const NON_OBJECT_TYPES: Kind[];
12
+ declare const rule: GraphQLESLintRule;
13
+
14
+ export { NON_OBJECT_TYPES, rule };
@@ -0,0 +1,90 @@
1
+ import "../chunk-U3TKCM4X.js";
2
+ import { Kind } from "graphql";
3
+ const 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 = [
4
+ Kind.SCALAR_TYPE_DEFINITION,
5
+ Kind.UNION_TYPE_DEFINITION,
6
+ Kind.UNION_TYPE_EXTENSION,
7
+ Kind.INPUT_OBJECT_TYPE_DEFINITION,
8
+ Kind.INPUT_OBJECT_TYPE_EXTENSION,
9
+ Kind.ENUM_TYPE_DEFINITION,
10
+ Kind.ENUM_TYPE_EXTENSION,
11
+ Kind.INTERFACE_TYPE_DEFINITION,
12
+ Kind.INTERFACE_TYPE_EXTENSION
13
+ ], notConnectionTypesSelector = `:matches(${NON_OBJECT_TYPES})[name.value=/Connection$/] > .name`, hasEdgesField = (node) => node.fields?.some((field) => field.name.value === "edges"), hasPageInfoField = (node) => node.fields?.some((field) => field.name.value === "pageInfo"), rule = {
14
+ meta: {
15
+ type: "problem",
16
+ docs: {
17
+ category: "Schema",
18
+ description: [
19
+ "Set of rules to follow Relay specification for Connection types.",
20
+ "",
21
+ '- Any type whose name ends in "Connection" is considered by spec to be a `Connection type`',
22
+ "- Connection type must be an Object type",
23
+ "- Connection type must contain a field `edges` that return a list type that wraps an edge type",
24
+ "- Connection type must contain a field `pageInfo` that return a non-null `PageInfo` Object type"
25
+ ].join(`
26
+ `),
27
+ url: "https://the-guild.dev/graphql/eslint/rules/relay-connection-types",
28
+ isDisabledForAllConfig: !0,
29
+ examples: [
30
+ {
31
+ title: "Incorrect",
32
+ code: (
33
+ /* GraphQL */
34
+ `
35
+ type UserPayload { # should be an Object type with \`Connection\` suffix
36
+ edges: UserEdge! # should return a list type
37
+ pageInfo: PageInfo # should return a non-null \`PageInfo\` Object type
38
+ }
39
+ `
40
+ )
41
+ },
42
+ {
43
+ title: "Correct",
44
+ code: (
45
+ /* GraphQL */
46
+ `
47
+ type UserConnection {
48
+ edges: [UserEdge]
49
+ pageInfo: PageInfo!
50
+ }
51
+ `
52
+ )
53
+ }
54
+ ]
55
+ },
56
+ messages: {
57
+ // Connection types
58
+ [MUST_BE_OBJECT_TYPE]: "Connection type must be an Object type.",
59
+ [MUST_HAVE_CONNECTION_SUFFIX]: "Connection type must have `Connection` suffix.",
60
+ [MUST_CONTAIN_FIELD_EDGES]: "Connection type must contain a field `edges` that return a list type.",
61
+ [MUST_CONTAIN_FIELD_PAGE_INFO]: "Connection type must contain a field `pageInfo` that return a non-null `PageInfo` Object type.",
62
+ [EDGES_FIELD_MUST_RETURN_LIST_TYPE]: "`edges` field must return a list type.",
63
+ [PAGE_INFO_FIELD_MUST_RETURN_NON_NULL_TYPE]: "`pageInfo` field must return a non-null `PageInfo` Object type."
64
+ },
65
+ schema: []
66
+ },
67
+ create(context) {
68
+ return {
69
+ [notConnectionTypesSelector](node) {
70
+ context.report({ node, messageId: MUST_BE_OBJECT_TYPE });
71
+ },
72
+ ":matches(ObjectTypeDefinition, ObjectTypeExtension)[name.value!=/Connection$/]"(node) {
73
+ hasEdgesField(node) && hasPageInfoField(node) && context.report({ node: node.name, messageId: MUST_HAVE_CONNECTION_SUFFIX });
74
+ },
75
+ ":matches(ObjectTypeDefinition, ObjectTypeExtension)[name.value=/Connection$/]"(node) {
76
+ hasEdgesField(node) || context.report({ node: node.name, messageId: MUST_CONTAIN_FIELD_EDGES }), hasPageInfoField(node) || context.report({ node: node.name, messageId: MUST_CONTAIN_FIELD_PAGE_INFO });
77
+ },
78
+ ":matches(ObjectTypeDefinition, ObjectTypeExtension)[name.value=/Connection$/] > FieldDefinition[name.value=edges] > .gqlType"(node) {
79
+ node.kind === Kind.LIST_TYPE || node.kind === Kind.NON_NULL_TYPE && node.gqlType.kind === Kind.LIST_TYPE || context.report({ node, messageId: EDGES_FIELD_MUST_RETURN_LIST_TYPE });
80
+ },
81
+ ":matches(ObjectTypeDefinition, ObjectTypeExtension)[name.value=/Connection$/] > FieldDefinition[name.value=pageInfo] > .gqlType"(node) {
82
+ node.kind === Kind.NON_NULL_TYPE && node.gqlType.kind === Kind.NAMED_TYPE && node.gqlType.name.value === "PageInfo" || context.report({ node, messageId: PAGE_INFO_FIELD_MUST_RETURN_NON_NULL_TYPE });
83
+ }
84
+ };
85
+ }
86
+ };
87
+ export {
88
+ NON_OBJECT_TYPES,
89
+ rule
90
+ };
@@ -0,0 +1,40 @@
1
+ import { FromSchema } from 'json-schema-to-ts';
2
+ import { GraphQLESLintRule } from '../types.mjs';
3
+ import 'eslint';
4
+ import 'estree';
5
+ import 'graphql';
6
+ import '../siblings.mjs';
7
+ import '@graphql-tools/utils';
8
+ import '../estree-converter/types.mjs';
9
+ import 'graphql-config';
10
+
11
+ declare const schema: {
12
+ readonly type: "array";
13
+ readonly maxItems: 1;
14
+ readonly items: {
15
+ readonly type: "object";
16
+ readonly additionalProperties: false;
17
+ readonly minProperties: 1;
18
+ readonly properties: {
19
+ readonly withEdgeSuffix: {
20
+ readonly type: "boolean";
21
+ readonly default: true;
22
+ readonly description: "Edge type name must end in \"Edge\".";
23
+ };
24
+ readonly shouldImplementNode: {
25
+ readonly type: "boolean";
26
+ readonly default: true;
27
+ readonly description: "Edge type's field `node` must implement `Node` interface.";
28
+ };
29
+ readonly listTypeCanWrapOnlyEdgeType: {
30
+ readonly type: "boolean";
31
+ readonly default: true;
32
+ readonly description: "A list type should only wrap an edge type.";
33
+ };
34
+ };
35
+ };
36
+ };
37
+ type RuleOptions = FromSchema<typeof schema>;
38
+ declare const rule: GraphQLESLintRule<RuleOptions, true>;
39
+
40
+ export { RuleOptions, rule };