@graphql-eslint/eslint-plugin 4.0.0-alpha-20220821140530-e968cfc → 4.0.0-alpha-20230801163310-8bc4340

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 (347) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +13 -253
  3. package/cjs/cache.d.ts +12 -0
  4. package/cjs/cache.js +62 -0
  5. package/cjs/configs/index.d.ts +148 -0
  6. package/cjs/configs/index.js +49 -0
  7. package/cjs/configs/operations-all.d.ts +22 -0
  8. package/cjs/configs/operations-all.js +27 -0
  9. package/cjs/configs/operations-recommended.d.ts +52 -0
  10. package/{configs/operations-recommended.json → cjs/configs/operations-recommended.js} +16 -14
  11. package/cjs/configs/relay.d.ts +12 -0
  12. package/{configs/relay.json → cjs/configs/relay.js} +6 -4
  13. package/cjs/configs/schema-all.d.ts +19 -0
  14. package/cjs/configs/schema-all.js +21 -0
  15. package/cjs/configs/schema-recommended.d.ts +49 -0
  16. package/{configs/schema-recommended.json → cjs/configs/schema-recommended.js} +19 -20
  17. package/cjs/documents.d.ts +6 -0
  18. package/cjs/documents.js +81 -0
  19. package/cjs/estree-converter/converter.d.ts +8 -0
  20. package/cjs/estree-converter/converter.js +83 -0
  21. package/cjs/estree-converter/index.d.ts +8 -0
  22. package/cjs/estree-converter/index.js +26 -0
  23. package/cjs/estree-converter/types.d.ts +42 -0
  24. package/cjs/estree-converter/types.js +16 -0
  25. package/cjs/estree-converter/utils.d.ts +18 -0
  26. package/cjs/estree-converter/utils.js +135 -0
  27. package/cjs/flat-configs.d.ts +260 -0
  28. package/cjs/flat-configs.js +60 -0
  29. package/cjs/graphql-config.d.ts +13 -0
  30. package/cjs/graphql-config.js +86 -0
  31. package/cjs/index.d.ts +22 -0
  32. package/cjs/index.js +49 -0
  33. package/cjs/parser.d.ts +12 -0
  34. package/cjs/parser.js +103 -0
  35. package/cjs/processor.d.ts +9 -0
  36. package/cjs/processor.js +127 -0
  37. package/cjs/rules/alphabetize.d.ts +84 -0
  38. package/cjs/rules/alphabetize.js +395 -0
  39. package/cjs/rules/description-style.d.ts +28 -0
  40. package/cjs/rules/description-style.js +109 -0
  41. package/cjs/rules/graphql-js-validation.d.ts +12 -0
  42. package/cjs/rules/graphql-js-validation.js +669 -0
  43. package/cjs/rules/index.d.ts +125 -0
  44. package/cjs/rules/index.js +99 -0
  45. package/cjs/rules/input-name.d.ts +43 -0
  46. package/cjs/rules/input-name.js +170 -0
  47. package/cjs/rules/lone-executable-definition.d.ts +34 -0
  48. package/cjs/rules/lone-executable-definition.js +119 -0
  49. package/cjs/rules/match-document-filename.d.ts +80 -0
  50. package/cjs/rules/match-document-filename.js +282 -0
  51. package/cjs/rules/naming-convention.d.ts +107 -0
  52. package/cjs/rules/naming-convention.js +434 -0
  53. package/cjs/rules/no-anonymous-operations.d.ts +12 -0
  54. package/cjs/rules/no-anonymous-operations.js +98 -0
  55. package/cjs/rules/no-case-insensitive-enum-values-duplicates.d.ts +12 -0
  56. package/cjs/rules/no-case-insensitive-enum-values-duplicates.js +96 -0
  57. package/cjs/rules/no-deprecated.d.ts +12 -0
  58. package/cjs/rules/no-deprecated.js +157 -0
  59. package/cjs/rules/no-duplicate-fields.d.ts +12 -0
  60. package/cjs/rules/no-duplicate-fields.js +146 -0
  61. package/cjs/rules/no-hashtag-description.d.ts +13 -0
  62. package/cjs/rules/no-hashtag-description.js +140 -0
  63. package/cjs/rules/no-one-place-fragments.d.ts +12 -0
  64. package/cjs/rules/no-one-place-fragments.js +113 -0
  65. package/cjs/rules/no-root-type.d.ts +33 -0
  66. package/cjs/rules/no-root-type.js +113 -0
  67. package/cjs/rules/no-scalar-result-type-on-mutation.d.ts +12 -0
  68. package/cjs/rules/no-scalar-result-type-on-mutation.js +100 -0
  69. package/cjs/rules/no-typename-prefix.d.ts +12 -0
  70. package/cjs/rules/no-typename-prefix.js +98 -0
  71. package/cjs/rules/no-unreachable-types.d.ts +12 -0
  72. package/cjs/rules/no-unreachable-types.js +199 -0
  73. package/cjs/rules/no-unused-fields.d.ts +12 -0
  74. package/cjs/rules/no-unused-fields.js +157 -0
  75. package/cjs/rules/relay-arguments.d.ts +29 -0
  76. package/cjs/rules/relay-arguments.js +149 -0
  77. package/cjs/rules/relay-connection-types.d.ts +13 -0
  78. package/cjs/rules/relay-connection-types.js +142 -0
  79. package/cjs/rules/relay-edge-types.d.ts +39 -0
  80. package/cjs/rules/relay-edge-types.js +212 -0
  81. package/cjs/rules/relay-page-info.d.ts +12 -0
  82. package/cjs/rules/relay-page-info.js +121 -0
  83. package/cjs/rules/require-deprecation-date.d.ts +26 -0
  84. package/cjs/rules/require-deprecation-date.js +164 -0
  85. package/cjs/rules/require-deprecation-reason.d.ts +12 -0
  86. package/cjs/rules/require-deprecation-reason.js +93 -0
  87. package/cjs/rules/require-description.d.ts +23 -0
  88. package/cjs/rules/require-description.js +205 -0
  89. package/cjs/rules/require-field-of-type-query-in-mutation-result.d.ts +12 -0
  90. package/cjs/rules/require-field-of-type-query-in-mutation-result.js +102 -0
  91. package/cjs/rules/require-id-when-available.d.ts +44 -0
  92. package/cjs/rules/require-id-when-available.js +241 -0
  93. package/cjs/rules/require-import-fragment.d.ts +12 -0
  94. package/cjs/rules/require-import-fragment.js +166 -0
  95. package/cjs/rules/require-nullable-fields-with-oneof.d.ts +12 -0
  96. package/cjs/rules/require-nullable-fields-with-oneof.js +92 -0
  97. package/cjs/rules/require-nullable-result-in-root.d.ts +12 -0
  98. package/cjs/rules/require-nullable-result-in-root.js +109 -0
  99. package/cjs/rules/require-type-pattern-with-oneof.d.ts +12 -0
  100. package/cjs/rules/require-type-pattern-with-oneof.js +91 -0
  101. package/cjs/rules/selection-set-depth.d.ts +36 -0
  102. package/cjs/rules/selection-set-depth.js +175 -0
  103. package/cjs/rules/strict-id-in-types.d.ts +65 -0
  104. package/cjs/rules/strict-id-in-types.js +186 -0
  105. package/cjs/rules/unique-fragment-name.d.ts +13 -0
  106. package/cjs/rules/unique-fragment-name.js +118 -0
  107. package/cjs/rules/unique-operation-name.d.ts +12 -0
  108. package/cjs/rules/unique-operation-name.js +95 -0
  109. package/cjs/schema.d.ts +12 -0
  110. package/cjs/schema.js +65 -0
  111. package/cjs/siblings.d.ts +8 -0
  112. package/cjs/siblings.js +136 -0
  113. package/cjs/types-8d5f4ae0.d.ts +107 -0
  114. package/cjs/types.d.ts +8 -0
  115. package/cjs/types.js +16 -0
  116. package/cjs/utils.d.ts +44 -0
  117. package/cjs/utils.js +205 -0
  118. package/esm/cache.d.mts +12 -0
  119. package/esm/cache.js +29 -0
  120. package/esm/chunk-BMTV3EA2.js +8 -0
  121. package/esm/configs/index.d.mts +148 -0
  122. package/esm/configs/index.js +16 -0
  123. package/esm/configs/operations-all.d.mts +22 -0
  124. package/esm/configs/operations-all.js +34 -0
  125. package/esm/configs/operations-recommended.d.mts +52 -0
  126. package/esm/configs/operations-recommended.js +59 -0
  127. package/esm/configs/relay.d.mts +12 -0
  128. package/esm/configs/relay.js +18 -0
  129. package/esm/configs/schema-all.d.mts +19 -0
  130. package/esm/configs/schema-all.js +28 -0
  131. package/esm/configs/schema-recommended.d.mts +49 -0
  132. package/esm/configs/schema-recommended.js +55 -0
  133. package/esm/documents.d.mts +6 -0
  134. package/esm/documents.js +48 -0
  135. package/esm/estree-converter/converter.d.mts +8 -0
  136. package/esm/estree-converter/converter.js +65 -0
  137. package/esm/estree-converter/index.d.mts +8 -0
  138. package/esm/estree-converter/index.js +3 -0
  139. package/esm/estree-converter/types.d.mts +42 -0
  140. package/esm/estree-converter/types.js +0 -0
  141. package/esm/estree-converter/utils.d.mts +18 -0
  142. package/esm/estree-converter/utils.js +114 -0
  143. package/esm/flat-configs.d.mts +260 -0
  144. package/esm/flat-configs.js +37 -0
  145. package/esm/graphql-config.d.mts +13 -0
  146. package/esm/graphql-config.js +55 -0
  147. package/esm/index.d.mts +22 -0
  148. package/esm/index.js +18 -0
  149. package/esm/package.json +1 -0
  150. package/esm/parser.d.mts +12 -0
  151. package/esm/parser.js +70 -0
  152. package/esm/processor.d.mts +9 -0
  153. package/esm/processor.js +106 -0
  154. package/esm/rules/alphabetize.d.mts +84 -0
  155. package/esm/rules/alphabetize.js +364 -0
  156. package/esm/rules/description-style.d.mts +28 -0
  157. package/esm/rules/description-style.js +86 -0
  158. package/esm/rules/graphql-js-validation.d.mts +12 -0
  159. package/esm/rules/graphql-js-validation.js +658 -0
  160. package/esm/rules/index.d.mts +125 -0
  161. package/esm/rules/index.js +76 -0
  162. package/esm/rules/input-name.d.mts +43 -0
  163. package/esm/rules/input-name.js +149 -0
  164. package/esm/rules/lone-executable-definition.d.mts +34 -0
  165. package/esm/rules/lone-executable-definition.js +96 -0
  166. package/esm/rules/match-document-filename.d.mts +80 -0
  167. package/esm/rules/match-document-filename.js +263 -0
  168. package/esm/rules/naming-convention.d.mts +107 -0
  169. package/esm/rules/naming-convention.js +417 -0
  170. package/esm/rules/no-anonymous-operations.d.mts +12 -0
  171. package/esm/rules/no-anonymous-operations.js +75 -0
  172. package/esm/rules/no-case-insensitive-enum-values-duplicates.d.mts +12 -0
  173. package/esm/rules/no-case-insensitive-enum-values-duplicates.js +73 -0
  174. package/esm/rules/no-deprecated.d.mts +12 -0
  175. package/esm/rules/no-deprecated.js +134 -0
  176. package/esm/rules/no-duplicate-fields.d.mts +12 -0
  177. package/esm/rules/no-duplicate-fields.js +123 -0
  178. package/esm/rules/no-hashtag-description.d.mts +13 -0
  179. package/esm/rules/no-hashtag-description.js +116 -0
  180. package/esm/rules/no-one-place-fragments.d.mts +12 -0
  181. package/esm/rules/no-one-place-fragments.js +90 -0
  182. package/esm/rules/no-root-type.d.mts +33 -0
  183. package/esm/rules/no-root-type.js +90 -0
  184. package/esm/rules/no-scalar-result-type-on-mutation.d.mts +12 -0
  185. package/esm/rules/no-scalar-result-type-on-mutation.js +77 -0
  186. package/esm/rules/no-typename-prefix.d.mts +12 -0
  187. package/esm/rules/no-typename-prefix.js +75 -0
  188. package/esm/rules/no-unreachable-types.d.mts +12 -0
  189. package/esm/rules/no-unreachable-types.js +171 -0
  190. package/esm/rules/no-unused-fields.d.mts +12 -0
  191. package/esm/rules/no-unused-fields.js +134 -0
  192. package/esm/rules/relay-arguments.d.mts +29 -0
  193. package/esm/rules/relay-arguments.js +126 -0
  194. package/esm/rules/relay-connection-types.d.mts +13 -0
  195. package/esm/rules/relay-connection-types.js +118 -0
  196. package/esm/rules/relay-edge-types.d.mts +39 -0
  197. package/esm/rules/relay-edge-types.js +194 -0
  198. package/esm/rules/relay-page-info.d.mts +12 -0
  199. package/esm/rules/relay-page-info.js +98 -0
  200. package/esm/rules/require-deprecation-date.d.mts +26 -0
  201. package/esm/rules/require-deprecation-date.js +141 -0
  202. package/esm/rules/require-deprecation-reason.d.mts +12 -0
  203. package/esm/rules/require-deprecation-reason.js +70 -0
  204. package/esm/rules/require-description.d.mts +23 -0
  205. package/esm/rules/require-description.js +186 -0
  206. package/esm/rules/require-field-of-type-query-in-mutation-result.d.mts +12 -0
  207. package/esm/rules/require-field-of-type-query-in-mutation-result.js +79 -0
  208. package/esm/rules/require-id-when-available.d.mts +44 -0
  209. package/esm/rules/require-id-when-available.js +231 -0
  210. package/esm/rules/require-import-fragment.d.mts +12 -0
  211. package/esm/rules/require-import-fragment.js +133 -0
  212. package/esm/rules/require-nullable-fields-with-oneof.d.mts +12 -0
  213. package/esm/rules/require-nullable-fields-with-oneof.js +69 -0
  214. package/esm/rules/require-nullable-result-in-root.d.mts +12 -0
  215. package/esm/rules/require-nullable-result-in-root.js +86 -0
  216. package/esm/rules/require-type-pattern-with-oneof.d.mts +12 -0
  217. package/esm/rules/require-type-pattern-with-oneof.js +68 -0
  218. package/esm/rules/selection-set-depth.d.mts +36 -0
  219. package/esm/rules/selection-set-depth.js +142 -0
  220. package/esm/rules/strict-id-in-types.d.mts +65 -0
  221. package/esm/rules/strict-id-in-types.js +169 -0
  222. package/esm/rules/unique-fragment-name.d.mts +13 -0
  223. package/esm/rules/unique-fragment-name.js +94 -0
  224. package/esm/rules/unique-operation-name.d.mts +12 -0
  225. package/esm/rules/unique-operation-name.js +72 -0
  226. package/esm/schema.d.mts +12 -0
  227. package/esm/schema.js +32 -0
  228. package/esm/siblings.d.mts +8 -0
  229. package/esm/siblings.js +116 -0
  230. package/esm/types-ace77d86.d.ts +107 -0
  231. package/esm/types.d.mts +8 -0
  232. package/esm/types.js +0 -0
  233. package/esm/utils.d.mts +44 -0
  234. package/esm/utils.js +155 -0
  235. package/package.json +47 -34
  236. package/configs/base.json +0 -4
  237. package/configs/operations-all.json +0 -24
  238. package/configs/schema-all.json +0 -26
  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/sibling-operations.d.ts +0 -21
  345. package/testkit.d.ts +0 -27
  346. package/types.d.ts +0 -79
  347. package/utils.d.ts +0 -39
@@ -0,0 +1,77 @@
1
+ import "../chunk-BMTV3EA2.js";
2
+ import { isScalarType, Kind } from "graphql";
3
+ import { getNodeName, requireGraphQLSchemaFromContext } from "../utils.js";
4
+ const RULE_ID = "no-scalar-result-type-on-mutation";
5
+ const rule = {
6
+ meta: {
7
+ type: "suggestion",
8
+ hasSuggestions: true,
9
+ docs: {
10
+ category: "Schema",
11
+ description: "Avoid scalar result type on mutation type to make sure to return a valid state.",
12
+ url: `https://the-guild.dev/graphql/eslint/rules/${RULE_ID}`,
13
+ requiresSchema: true,
14
+ examples: [
15
+ {
16
+ title: "Incorrect",
17
+ code: (
18
+ /* GraphQL */
19
+ `
20
+ type Mutation {
21
+ createUser: Boolean
22
+ }
23
+ `
24
+ )
25
+ },
26
+ {
27
+ title: "Correct",
28
+ code: (
29
+ /* GraphQL */
30
+ `
31
+ type Mutation {
32
+ createUser: User!
33
+ }
34
+ `
35
+ )
36
+ }
37
+ ]
38
+ },
39
+ schema: []
40
+ },
41
+ create(context) {
42
+ const schema = requireGraphQLSchemaFromContext(RULE_ID, context);
43
+ const mutationType = schema.getMutationType();
44
+ if (!mutationType) {
45
+ return {};
46
+ }
47
+ const selector = [
48
+ `:matches(ObjectTypeDefinition, ObjectTypeExtension)[name.value=${mutationType.name}]`,
49
+ "> FieldDefinition > .gqlType Name"
50
+ ].join(" ");
51
+ return {
52
+ [selector](node) {
53
+ const typeName = node.value;
54
+ const graphQLType = schema.getType(typeName);
55
+ if (isScalarType(graphQLType)) {
56
+ let fieldDef = node.parent;
57
+ while (fieldDef.kind !== Kind.FIELD_DEFINITION) {
58
+ fieldDef = fieldDef.parent;
59
+ }
60
+ context.report({
61
+ node,
62
+ message: `Unexpected scalar result type \`${typeName}\` for ${getNodeName(fieldDef)}`,
63
+ suggest: [
64
+ {
65
+ desc: `Remove \`${typeName}\``,
66
+ fix: (fixer) => fixer.remove(node)
67
+ }
68
+ ]
69
+ });
70
+ }
71
+ }
72
+ };
73
+ }
74
+ };
75
+ export {
76
+ rule
77
+ };
@@ -0,0 +1,12 @@
1
+ import { f as GraphQLESLintRule } from '../types-ace77d86.js';
2
+ import '@graphql-tools/utils';
3
+ import 'eslint';
4
+ import 'estree';
5
+ import 'graphql';
6
+ import 'graphql-config';
7
+ import 'json-schema-to-ts';
8
+ import '../estree-converter/types.mjs';
9
+
10
+ declare const rule: GraphQLESLintRule;
11
+
12
+ export { rule };
@@ -0,0 +1,75 @@
1
+ import "../chunk-BMTV3EA2.js";
2
+ const NO_TYPENAME_PREFIX = "NO_TYPENAME_PREFIX";
3
+ const rule = {
4
+ meta: {
5
+ type: "suggestion",
6
+ hasSuggestions: true,
7
+ docs: {
8
+ category: "Schema",
9
+ description: "Enforces users to avoid using the type name in a field name while defining your schema.",
10
+ recommended: true,
11
+ url: "https://the-guild.dev/graphql/eslint/rules/no-typename-prefix",
12
+ examples: [
13
+ {
14
+ title: "Incorrect",
15
+ code: (
16
+ /* GraphQL */
17
+ `
18
+ type User {
19
+ userId: ID!
20
+ }
21
+ `
22
+ )
23
+ },
24
+ {
25
+ title: "Correct",
26
+ code: (
27
+ /* GraphQL */
28
+ `
29
+ type User {
30
+ id: ID!
31
+ }
32
+ `
33
+ )
34
+ }
35
+ ]
36
+ },
37
+ messages: {
38
+ [NO_TYPENAME_PREFIX]: 'Field "{{ fieldName }}" starts with the name of the parent type "{{ typeName }}"'
39
+ },
40
+ schema: []
41
+ },
42
+ create(context) {
43
+ return {
44
+ "ObjectTypeDefinition, ObjectTypeExtension, InterfaceTypeDefinition, InterfaceTypeExtension"(node) {
45
+ const typeName = node.name.value;
46
+ const lowerTypeName = typeName.toLowerCase();
47
+ for (const field of node.fields || []) {
48
+ const fieldName = field.name.value;
49
+ if (fieldName.toLowerCase().startsWith(lowerTypeName)) {
50
+ context.report({
51
+ data: {
52
+ fieldName,
53
+ typeName
54
+ },
55
+ messageId: NO_TYPENAME_PREFIX,
56
+ node: field.name,
57
+ suggest: [
58
+ {
59
+ desc: `Remove \`${fieldName.slice(0, typeName.length)}\` prefix`,
60
+ fix: (fixer) => fixer.replaceText(
61
+ field.name,
62
+ fieldName.replace(new RegExp(`^${typeName}`, "i"), "")
63
+ )
64
+ }
65
+ ]
66
+ });
67
+ }
68
+ }
69
+ }
70
+ };
71
+ }
72
+ };
73
+ export {
74
+ rule
75
+ };
@@ -0,0 +1,12 @@
1
+ import { f as GraphQLESLintRule } from '../types-ace77d86.js';
2
+ import '@graphql-tools/utils';
3
+ import 'eslint';
4
+ import 'estree';
5
+ import 'graphql';
6
+ import 'graphql-config';
7
+ import 'json-schema-to-ts';
8
+ import '../estree-converter/types.mjs';
9
+
10
+ declare const rule: GraphQLESLintRule;
11
+
12
+ export { rule };
@@ -0,0 +1,171 @@
1
+ import "../chunk-BMTV3EA2.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";
11
+ const KINDS = [
12
+ Kind.DIRECTIVE_DEFINITION,
13
+ Kind.OBJECT_TYPE_DEFINITION,
14
+ Kind.OBJECT_TYPE_EXTENSION,
15
+ Kind.INTERFACE_TYPE_DEFINITION,
16
+ Kind.INTERFACE_TYPE_EXTENSION,
17
+ Kind.SCALAR_TYPE_DEFINITION,
18
+ Kind.SCALAR_TYPE_EXTENSION,
19
+ Kind.INPUT_OBJECT_TYPE_DEFINITION,
20
+ Kind.INPUT_OBJECT_TYPE_EXTENSION,
21
+ Kind.UNION_TYPE_DEFINITION,
22
+ Kind.UNION_TYPE_EXTENSION,
23
+ Kind.ENUM_TYPE_DEFINITION,
24
+ Kind.ENUM_TYPE_EXTENSION
25
+ ];
26
+ let reachableTypesCache;
27
+ const RequestDirectiveLocations = /* @__PURE__ */ new Set([
28
+ DirectiveLocation.QUERY,
29
+ DirectiveLocation.MUTATION,
30
+ DirectiveLocation.SUBSCRIPTION,
31
+ DirectiveLocation.FIELD,
32
+ DirectiveLocation.FRAGMENT_DEFINITION,
33
+ DirectiveLocation.FRAGMENT_SPREAD,
34
+ DirectiveLocation.INLINE_FRAGMENT,
35
+ DirectiveLocation.VARIABLE_DEFINITION
36
+ ]);
37
+ function getReachableTypes(schema) {
38
+ if (reachableTypesCache) {
39
+ return reachableTypesCache;
40
+ }
41
+ const reachableTypes = /* @__PURE__ */ new Set();
42
+ const collect = (node) => {
43
+ const typeName = getTypeName(node);
44
+ if (reachableTypes.has(typeName)) {
45
+ return;
46
+ }
47
+ reachableTypes.add(typeName);
48
+ const type = schema.getType(typeName) || schema.getDirective(typeName);
49
+ if (isInterfaceType(type)) {
50
+ const { objects, interfaces } = schema.getImplementations(type);
51
+ for (const { astNode } of [...objects, ...interfaces]) {
52
+ visit(astNode, visitor);
53
+ }
54
+ } else if (type == null ? void 0 : type.astNode) {
55
+ visit(type.astNode, visitor);
56
+ }
57
+ };
58
+ const visitor = {
59
+ InterfaceTypeDefinition: collect,
60
+ ObjectTypeDefinition: collect,
61
+ InputValueDefinition: collect,
62
+ UnionTypeDefinition: collect,
63
+ FieldDefinition: collect,
64
+ Directive: collect,
65
+ NamedType: collect
66
+ };
67
+ for (const type of [
68
+ schema,
69
+ // visiting SchemaDefinition node
70
+ schema.getQueryType(),
71
+ schema.getMutationType(),
72
+ schema.getSubscriptionType()
73
+ ]) {
74
+ if (type == null ? void 0 : type.astNode) {
75
+ visit(type.astNode, visitor);
76
+ }
77
+ }
78
+ for (const node of schema.getDirectives()) {
79
+ if (node.locations.some((location) => RequestDirectiveLocations.has(location))) {
80
+ reachableTypes.add(node.name);
81
+ for (const arg of node.args) {
82
+ const argTypeName = "name" in arg.type && arg.type.name;
83
+ if (argTypeName) {
84
+ reachableTypes.add(argTypeName);
85
+ }
86
+ }
87
+ }
88
+ }
89
+ reachableTypesCache = reachableTypes;
90
+ return reachableTypesCache;
91
+ }
92
+ const rule = {
93
+ meta: {
94
+ messages: {
95
+ [RULE_ID]: "{{ type }} `{{ typeName }}` is unreachable."
96
+ },
97
+ docs: {
98
+ description: "Requires all types to be reachable at some level by root level fields.",
99
+ category: "Schema",
100
+ url: `https://the-guild.dev/graphql/eslint/rules/${RULE_ID}`,
101
+ requiresSchema: true,
102
+ examples: [
103
+ {
104
+ title: "Incorrect",
105
+ code: (
106
+ /* GraphQL */
107
+ `
108
+ type User {
109
+ id: ID!
110
+ name: String
111
+ }
112
+
113
+ type Query {
114
+ me: String
115
+ }
116
+ `
117
+ )
118
+ },
119
+ {
120
+ title: "Correct",
121
+ code: (
122
+ /* GraphQL */
123
+ `
124
+ type User {
125
+ id: ID!
126
+ name: String
127
+ }
128
+
129
+ type Query {
130
+ me: User
131
+ }
132
+ `
133
+ )
134
+ }
135
+ ],
136
+ recommended: true
137
+ },
138
+ type: "suggestion",
139
+ schema: [],
140
+ hasSuggestions: true
141
+ },
142
+ create(context) {
143
+ const schema = requireGraphQLSchemaFromContext(RULE_ID, context);
144
+ const reachableTypes = getReachableTypes(schema);
145
+ return {
146
+ [`:matches(${KINDS}) > .name`](node) {
147
+ const typeName = node.value;
148
+ if (!reachableTypes.has(typeName)) {
149
+ const type = lowerCase(node.parent.kind.replace(/(Extension|Definition)$/, ""));
150
+ context.report({
151
+ node,
152
+ messageId: RULE_ID,
153
+ data: {
154
+ type: type[0].toUpperCase() + type.slice(1),
155
+ typeName
156
+ },
157
+ suggest: [
158
+ {
159
+ desc: `Remove \`${typeName}\``,
160
+ fix: (fixer) => fixer.remove(node.parent)
161
+ }
162
+ ]
163
+ });
164
+ }
165
+ }
166
+ };
167
+ }
168
+ };
169
+ export {
170
+ rule
171
+ };
@@ -0,0 +1,12 @@
1
+ import { f as GraphQLESLintRule } from '../types-ace77d86.js';
2
+ import '@graphql-tools/utils';
3
+ import 'eslint';
4
+ import 'estree';
5
+ import 'graphql';
6
+ import 'graphql-config';
7
+ import 'json-schema-to-ts';
8
+ import '../estree-converter/types.mjs';
9
+
10
+ declare const rule: GraphQLESLintRule;
11
+
12
+ export { rule };
@@ -0,0 +1,134 @@
1
+ import "../chunk-BMTV3EA2.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
+ }
10
+ const usedFields = /* @__PURE__ */ Object.create(null);
11
+ const typeInfo = new TypeInfo(schema);
12
+ const visitor = visitWithTypeInfo(typeInfo, {
13
+ Field(node) {
14
+ var _a;
15
+ const fieldDef = typeInfo.getFieldDef();
16
+ if (!fieldDef) {
17
+ return false;
18
+ }
19
+ const parentTypeName = typeInfo.getParentType().name;
20
+ const fieldName = node.name.value;
21
+ (_a = usedFields[parentTypeName]) != null ? _a : usedFields[parentTypeName] = /* @__PURE__ */ new Set();
22
+ usedFields[parentTypeName].add(fieldName);
23
+ }
24
+ });
25
+ const allDocuments = [...operations.getOperations(), ...operations.getFragments()];
26
+ for (const { document } of allDocuments) {
27
+ visit(document, visitor);
28
+ }
29
+ usedFieldsCache = usedFields;
30
+ return usedFieldsCache;
31
+ }
32
+ const rule = {
33
+ meta: {
34
+ messages: {
35
+ [RULE_ID]: 'Field "{{fieldName}}" is unused'
36
+ },
37
+ docs: {
38
+ description: "Requires all fields to be used at some level by siblings operations.",
39
+ category: "Schema",
40
+ url: `https://the-guild.dev/graphql/eslint/rules/${RULE_ID}`,
41
+ requiresSiblings: true,
42
+ requiresSchema: true,
43
+ isDisabledForAllConfig: true,
44
+ examples: [
45
+ {
46
+ title: "Incorrect",
47
+ code: (
48
+ /* GraphQL */
49
+ `
50
+ type User {
51
+ id: ID!
52
+ name: String
53
+ someUnusedField: String
54
+ }
55
+
56
+ type Query {
57
+ me: User
58
+ }
59
+
60
+ query {
61
+ me {
62
+ id
63
+ name
64
+ }
65
+ }
66
+ `
67
+ )
68
+ },
69
+ {
70
+ title: "Correct",
71
+ code: (
72
+ /* GraphQL */
73
+ `
74
+ type User {
75
+ id: ID!
76
+ name: String
77
+ }
78
+
79
+ type Query {
80
+ me: User
81
+ }
82
+
83
+ query {
84
+ me {
85
+ id
86
+ name
87
+ }
88
+ }
89
+ `
90
+ )
91
+ }
92
+ ]
93
+ },
94
+ type: "suggestion",
95
+ schema: [],
96
+ hasSuggestions: true
97
+ },
98
+ create(context) {
99
+ const schema = requireGraphQLSchemaFromContext(RULE_ID, context);
100
+ const siblingsOperations = requireSiblingsOperations(RULE_ID, context);
101
+ const usedFields = getUsedFields(schema, siblingsOperations);
102
+ return {
103
+ FieldDefinition(node) {
104
+ var _a;
105
+ const fieldName = node.name.value;
106
+ const parentTypeName = node.parent.name.value;
107
+ const isUsed = (_a = usedFields[parentTypeName]) == null ? void 0 : _a.has(fieldName);
108
+ if (isUsed) {
109
+ return;
110
+ }
111
+ context.report({
112
+ node: node.name,
113
+ messageId: RULE_ID,
114
+ data: { fieldName },
115
+ suggest: [
116
+ {
117
+ desc: `Remove \`${fieldName}\` field`,
118
+ fix(fixer) {
119
+ const sourceCode = context.getSourceCode();
120
+ const tokenBefore = sourceCode.getTokenBefore(node);
121
+ const tokenAfter = sourceCode.getTokenAfter(node);
122
+ const isEmptyType = tokenBefore.type === "{" && tokenAfter.type === "}";
123
+ return fixer.remove(isEmptyType ? node.parent : node);
124
+ }
125
+ }
126
+ ]
127
+ });
128
+ }
129
+ };
130
+ }
131
+ };
132
+ export {
133
+ rule
134
+ };
@@ -0,0 +1,29 @@
1
+ import { FromSchema } from 'json-schema-to-ts';
2
+ import { f as GraphQLESLintRule } from '../types-ace77d86.js';
3
+ import '@graphql-tools/utils';
4
+ import 'eslint';
5
+ import 'estree';
6
+ import 'graphql';
7
+ import 'graphql-config';
8
+ import '../estree-converter/types.mjs';
9
+
10
+ declare const schema: {
11
+ readonly type: "array";
12
+ readonly maxItems: 1;
13
+ readonly items: {
14
+ readonly type: "object";
15
+ readonly additionalProperties: false;
16
+ readonly minProperties: 1;
17
+ readonly properties: {
18
+ readonly includeBoth: {
19
+ readonly type: "boolean";
20
+ readonly default: true;
21
+ readonly description: "Enforce including both forward and backward pagination arguments";
22
+ };
23
+ };
24
+ };
25
+ };
26
+ type RuleOptions = FromSchema<typeof schema>;
27
+ declare const rule: GraphQLESLintRule<RuleOptions, true>;
28
+
29
+ export { RuleOptions, rule };
@@ -0,0 +1,126 @@
1
+ import "../chunk-BMTV3EA2.js";
2
+ import { isScalarType, Kind } from "graphql";
3
+ import { requireGraphQLSchemaFromContext } from "../utils.js";
4
+ const RULE_ID = "relay-arguments";
5
+ const MISSING_ARGUMENTS = "MISSING_ARGUMENTS";
6
+ const schema = {
7
+ type: "array",
8
+ maxItems: 1,
9
+ items: {
10
+ type: "object",
11
+ additionalProperties: false,
12
+ minProperties: 1,
13
+ properties: {
14
+ includeBoth: {
15
+ type: "boolean",
16
+ default: true,
17
+ description: "Enforce including both forward and backward pagination arguments"
18
+ }
19
+ }
20
+ }
21
+ };
22
+ const rule = {
23
+ meta: {
24
+ type: "problem",
25
+ docs: {
26
+ category: "Schema",
27
+ description: [
28
+ "Set of rules to follow Relay specification for Arguments.",
29
+ "",
30
+ "- A field that returns a Connection type must include forward pagination arguments (`first` and `after`), backward pagination arguments (`last` and `before`), or both",
31
+ "",
32
+ "Forward pagination arguments",
33
+ "",
34
+ "- `first` takes a non-negative integer",
35
+ "- `after` takes the Cursor type",
36
+ "",
37
+ "Backward pagination arguments",
38
+ "",
39
+ "- `last` takes a non-negative integer",
40
+ "- `before` takes the Cursor type"
41
+ ].join("\n"),
42
+ url: `https://the-guild.dev/graphql/eslint/rules/${RULE_ID}`,
43
+ examples: [
44
+ {
45
+ title: "Incorrect",
46
+ code: (
47
+ /* GraphQL */
48
+ `
49
+ type User {
50
+ posts: PostConnection
51
+ }
52
+ `
53
+ )
54
+ },
55
+ {
56
+ title: "Correct",
57
+ code: (
58
+ /* GraphQL */
59
+ `
60
+ type User {
61
+ posts(after: String, first: Int, before: String, last: Int): PostConnection
62
+ }
63
+ `
64
+ )
65
+ }
66
+ ],
67
+ isDisabledForAllConfig: true
68
+ },
69
+ messages: {
70
+ [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."
71
+ },
72
+ schema
73
+ },
74
+ create(context) {
75
+ const schema2 = requireGraphQLSchemaFromContext(RULE_ID, context);
76
+ const { includeBoth = true } = context.options[0] || {};
77
+ return {
78
+ "FieldDefinition > .gqlType Name[value=/Connection$/]"(node) {
79
+ var _a;
80
+ let fieldNode = node.parent;
81
+ while (fieldNode.kind !== Kind.FIELD_DEFINITION) {
82
+ fieldNode = fieldNode.parent;
83
+ }
84
+ const args = Object.fromEntries(
85
+ ((_a = fieldNode.arguments) == null ? void 0 : _a.map((argument) => [argument.name.value, argument])) || []
86
+ );
87
+ const hasForwardPagination = !!(args.first && args.after);
88
+ const hasBackwardPagination = !!(args.last && args.before);
89
+ if (!hasForwardPagination && !hasBackwardPagination) {
90
+ context.report({
91
+ node: fieldNode.name,
92
+ messageId: MISSING_ARGUMENTS
93
+ });
94
+ return;
95
+ }
96
+ function checkField(typeName, argumentName) {
97
+ const argument = args[argumentName];
98
+ const hasArgument = !!argument;
99
+ let type = argument;
100
+ if (hasArgument && type.gqlType.kind === Kind.NON_NULL_TYPE) {
101
+ type = type.gqlType;
102
+ }
103
+ const isAllowedNonNullType = hasArgument && type.gqlType.kind === Kind.NAMED_TYPE && (type.gqlType.name.value === typeName || typeName === "String" && isScalarType(schema2.getType(type.gqlType.name.value)));
104
+ if (!isAllowedNonNullType) {
105
+ const returnType = typeName === "String" ? "String or Scalar" : typeName;
106
+ context.report({
107
+ node: (argument || fieldNode).name,
108
+ message: hasArgument ? `Argument \`${argumentName}\` must return ${returnType}.` : `Field \`${fieldNode.name.value}\` must contain an argument \`${argumentName}\`, that return ${returnType}.`
109
+ });
110
+ }
111
+ }
112
+ if (includeBoth || args.first || args.after) {
113
+ checkField("Int", "first");
114
+ checkField("String", "after");
115
+ }
116
+ if (includeBoth || args.last || args.before) {
117
+ checkField("Int", "last");
118
+ checkField("String", "before");
119
+ }
120
+ }
121
+ };
122
+ }
123
+ };
124
+ export {
125
+ rule
126
+ };
@@ -0,0 +1,13 @@
1
+ import { Kind } from 'graphql';
2
+ import { f as GraphQLESLintRule } from '../types-ace77d86.js';
3
+ import '@graphql-tools/utils';
4
+ import 'eslint';
5
+ import 'estree';
6
+ import 'graphql-config';
7
+ import 'json-schema-to-ts';
8
+ import '../estree-converter/types.mjs';
9
+
10
+ declare const NON_OBJECT_TYPES: Kind[];
11
+ declare const rule: GraphQLESLintRule;
12
+
13
+ export { NON_OBJECT_TYPES, rule };