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

Sign up to get free protection for your applications and to get access to all the features.
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,70 @@
1
+ import "../chunk-BMTV3EA2.js";
2
+ import { valueFromNode } from "../estree-converter/index.js";
3
+ import { getNodeName } from "../utils.js";
4
+ const rule = {
5
+ meta: {
6
+ docs: {
7
+ description: "Require all deprecation directives to specify a reason.",
8
+ category: "Schema",
9
+ url: "https://the-guild.dev/graphql/eslint/rules/require-deprecation-reason",
10
+ recommended: true,
11
+ examples: [
12
+ {
13
+ title: "Incorrect",
14
+ code: (
15
+ /* GraphQL */
16
+ `
17
+ type MyType {
18
+ name: String @deprecated
19
+ }
20
+ `
21
+ )
22
+ },
23
+ {
24
+ title: "Incorrect",
25
+ code: (
26
+ /* GraphQL */
27
+ `
28
+ type MyType {
29
+ name: String @deprecated(reason: "")
30
+ }
31
+ `
32
+ )
33
+ },
34
+ {
35
+ title: "Correct",
36
+ code: (
37
+ /* GraphQL */
38
+ `
39
+ type MyType {
40
+ name: String @deprecated(reason: "no longer relevant, please use fullName field")
41
+ }
42
+ `
43
+ )
44
+ }
45
+ ]
46
+ },
47
+ type: "suggestion",
48
+ schema: []
49
+ },
50
+ create(context) {
51
+ return {
52
+ "Directive[name.value=deprecated]"(node) {
53
+ var _a;
54
+ const reasonArgument = (_a = node.arguments) == null ? void 0 : _a.find(
55
+ (arg) => arg.name.value === "reason"
56
+ );
57
+ const value = reasonArgument && String(valueFromNode(reasonArgument.value)).trim();
58
+ if (!value) {
59
+ context.report({
60
+ node: node.name,
61
+ message: `Deprecation reason is required for ${getNodeName(node.parent)}.`
62
+ });
63
+ }
64
+ }
65
+ };
66
+ }
67
+ };
68
+ export {
69
+ rule
70
+ };
@@ -0,0 +1,23 @@
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 RULE_ID = "require-description";
11
+ declare const ALLOWED_KINDS: readonly [Kind.OBJECT_TYPE_DEFINITION, Kind.INTERFACE_TYPE_DEFINITION, Kind.ENUM_TYPE_DEFINITION, Kind.SCALAR_TYPE_DEFINITION, Kind.INPUT_OBJECT_TYPE_DEFINITION, Kind.UNION_TYPE_DEFINITION, Kind.DIRECTIVE_DEFINITION, Kind.FIELD_DEFINITION, Kind.INPUT_VALUE_DEFINITION, Kind.ENUM_VALUE_DEFINITION, Kind.OPERATION_DEFINITION];
12
+ type AllowedKind = (typeof ALLOWED_KINDS)[number];
13
+ type RuleOptions = [
14
+ {
15
+ [key in AllowedKind]?: boolean;
16
+ } & {
17
+ types?: boolean;
18
+ rootField?: boolean;
19
+ }
20
+ ];
21
+ declare const rule: GraphQLESLintRule<RuleOptions>;
22
+
23
+ export { RULE_ID, RuleOptions, rule };
@@ -0,0 +1,186 @@
1
+ import "../chunk-BMTV3EA2.js";
2
+ import { getRootTypeNames } from "@graphql-tools/utils";
3
+ import { Kind, TokenKind } from "graphql";
4
+ import {
5
+ getLocation,
6
+ getNodeName,
7
+ requireGraphQLSchemaFromContext,
8
+ TYPES_KINDS
9
+ } from "../utils.js";
10
+ const RULE_ID = "require-description";
11
+ const ALLOWED_KINDS = [
12
+ ...TYPES_KINDS,
13
+ Kind.DIRECTIVE_DEFINITION,
14
+ Kind.FIELD_DEFINITION,
15
+ Kind.INPUT_VALUE_DEFINITION,
16
+ Kind.ENUM_VALUE_DEFINITION,
17
+ Kind.OPERATION_DEFINITION
18
+ ];
19
+ const schema = {
20
+ type: "array",
21
+ minItems: 1,
22
+ maxItems: 1,
23
+ items: {
24
+ type: "object",
25
+ additionalProperties: false,
26
+ minProperties: 1,
27
+ properties: {
28
+ types: {
29
+ type: "boolean",
30
+ description: `Includes:
31
+ ${TYPES_KINDS.map((kind) => `- \`${kind}\``).join("\n")}`
32
+ },
33
+ rootField: {
34
+ type: "boolean",
35
+ description: "Definitions within `Query`, `Mutation`, and `Subscription` root types."
36
+ },
37
+ ...Object.fromEntries(
38
+ [...ALLOWED_KINDS].sort().map((kind) => {
39
+ let description = `Read more about this kind on [spec.graphql.org](https://spec.graphql.org/October2021/#${kind}).`;
40
+ if (kind === Kind.OPERATION_DEFINITION) {
41
+ description += '\n> You must use only comment syntax `#` and not description syntax `"""` or `"`.';
42
+ }
43
+ return [kind, { type: "boolean", description }];
44
+ })
45
+ )
46
+ }
47
+ }
48
+ };
49
+ const rule = {
50
+ meta: {
51
+ docs: {
52
+ category: "Schema",
53
+ description: "Enforce descriptions in type definitions and operations.",
54
+ url: `https://the-guild.dev/graphql/eslint/rules/${RULE_ID}`,
55
+ examples: [
56
+ {
57
+ title: "Incorrect",
58
+ usage: [{ types: true, FieldDefinition: true }],
59
+ code: (
60
+ /* GraphQL */
61
+ `
62
+ type someTypeName {
63
+ name: String
64
+ }
65
+ `
66
+ )
67
+ },
68
+ {
69
+ title: "Correct",
70
+ usage: [{ types: true, FieldDefinition: true }],
71
+ code: (
72
+ /* GraphQL */
73
+ `
74
+ """
75
+ Some type description
76
+ """
77
+ type someTypeName {
78
+ """
79
+ Name description
80
+ """
81
+ name: String
82
+ }
83
+ `
84
+ )
85
+ },
86
+ {
87
+ title: "Correct",
88
+ usage: [{ OperationDefinition: true }],
89
+ code: (
90
+ /* GraphQL */
91
+ `
92
+ # Create a new user
93
+ mutation createUser {
94
+ # ...
95
+ }
96
+ `
97
+ )
98
+ },
99
+ {
100
+ title: "Correct",
101
+ usage: [{ rootField: true }],
102
+ code: (
103
+ /* GraphQL */
104
+ `
105
+ type Mutation {
106
+ "Create a new user"
107
+ createUser: User
108
+ }
109
+
110
+ type User {
111
+ name: String
112
+ }
113
+ `
114
+ )
115
+ }
116
+ ],
117
+ configOptions: [
118
+ {
119
+ types: true,
120
+ [Kind.DIRECTIVE_DEFINITION]: true
121
+ // rootField: true TODO enable in graphql-eslint v4
122
+ }
123
+ ],
124
+ recommended: true
125
+ },
126
+ type: "suggestion",
127
+ messages: {
128
+ [RULE_ID]: "Description is required for {{ nodeName }}"
129
+ },
130
+ schema
131
+ },
132
+ create(context) {
133
+ const { types, rootField, ...restOptions } = context.options[0] || {};
134
+ const kinds = new Set(types ? TYPES_KINDS : []);
135
+ for (const [kind, isEnabled] of Object.entries(restOptions)) {
136
+ if (isEnabled) {
137
+ kinds.add(kind);
138
+ } else {
139
+ kinds.delete(kind);
140
+ }
141
+ }
142
+ if (rootField) {
143
+ const schema2 = requireGraphQLSchemaFromContext(RULE_ID, context);
144
+ const rootTypeNames = getRootTypeNames(schema2);
145
+ kinds.add(
146
+ `:matches(ObjectTypeDefinition, ObjectTypeExtension)[name.value=/^(${[
147
+ ...rootTypeNames
148
+ ].join(",")})$/] > FieldDefinition`
149
+ );
150
+ }
151
+ const selector = [...kinds].join(",");
152
+ return {
153
+ [selector](node) {
154
+ var _a;
155
+ let description = "";
156
+ const isOperation = node.kind === Kind.OPERATION_DEFINITION;
157
+ if (isOperation) {
158
+ const rawNode = node.rawNode();
159
+ const { prev, line } = rawNode.loc.startToken;
160
+ if ((prev == null ? void 0 : prev.kind) === TokenKind.COMMENT) {
161
+ const value = prev.value.trim();
162
+ const linesBefore = line - prev.line;
163
+ if (!value.startsWith("eslint") && linesBefore === 1) {
164
+ description = value;
165
+ }
166
+ }
167
+ } else {
168
+ description = ((_a = node.description) == null ? void 0 : _a.value.trim()) || "";
169
+ }
170
+ if (description.length === 0) {
171
+ context.report({
172
+ loc: isOperation ? getLocation(node.loc.start, node.operation) : node.name.loc,
173
+ messageId: RULE_ID,
174
+ data: {
175
+ nodeName: getNodeName(node)
176
+ }
177
+ });
178
+ }
179
+ }
180
+ };
181
+ }
182
+ };
183
+ export {
184
+ RULE_ID,
185
+ rule
186
+ };
@@ -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,79 @@
1
+ import "../chunk-BMTV3EA2.js";
2
+ import { isObjectType } from "graphql";
3
+ import { getTypeName, requireGraphQLSchemaFromContext } from "../utils.js";
4
+ const RULE_ID = "require-field-of-type-query-in-mutation-result";
5
+ const rule = {
6
+ meta: {
7
+ type: "suggestion",
8
+ docs: {
9
+ category: "Schema",
10
+ description: "Allow the client in one round-trip not only to call mutation but also to get a wagon of data to update their application.\n> Currently, no errors are reported for result type `union`, `interface` and `scalar`.",
11
+ url: `https://the-guild.dev/graphql/eslint/rules/${RULE_ID}`,
12
+ requiresSchema: true,
13
+ examples: [
14
+ {
15
+ title: "Incorrect",
16
+ code: (
17
+ /* GraphQL */
18
+ `
19
+ type User { ... }
20
+
21
+ type Mutation {
22
+ createUser: User!
23
+ }
24
+ `
25
+ )
26
+ },
27
+ {
28
+ title: "Correct",
29
+ code: (
30
+ /* GraphQL */
31
+ `
32
+ type User { ... }
33
+
34
+ type Query { ... }
35
+
36
+ type CreateUserPayload {
37
+ user: User!
38
+ query: Query!
39
+ }
40
+
41
+ type Mutation {
42
+ createUser: CreateUserPayload!
43
+ }
44
+ `
45
+ )
46
+ }
47
+ ]
48
+ },
49
+ schema: []
50
+ },
51
+ create(context) {
52
+ const schema = requireGraphQLSchemaFromContext(RULE_ID, context);
53
+ const mutationType = schema.getMutationType();
54
+ const queryType = schema.getQueryType();
55
+ if (!mutationType || !queryType) {
56
+ return {};
57
+ }
58
+ const selector = `:matches(ObjectTypeDefinition, ObjectTypeExtension)[name.value=${mutationType.name}] > FieldDefinition > .gqlType Name`;
59
+ return {
60
+ [selector](node) {
61
+ const typeName = node.value;
62
+ const graphQLType = schema.getType(typeName);
63
+ if (isObjectType(graphQLType)) {
64
+ const { fields } = graphQLType.astNode;
65
+ const hasQueryType = fields == null ? void 0 : fields.some((field) => getTypeName(field) === queryType.name);
66
+ if (!hasQueryType) {
67
+ context.report({
68
+ node,
69
+ message: `Mutation result type "${graphQLType.name}" must contain field of type "${queryType.name}"`
70
+ });
71
+ }
72
+ }
73
+ }
74
+ };
75
+ }
76
+ };
77
+ export {
78
+ rule
79
+ };
@@ -0,0 +1,44 @@
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 definitions: {
12
+ readonly asString: {
13
+ readonly type: "string";
14
+ };
15
+ readonly asArray: {
16
+ readonly type: "array";
17
+ readonly uniqueItems: true;
18
+ readonly minItems: 1;
19
+ readonly items: {
20
+ readonly type: "string";
21
+ };
22
+ };
23
+ };
24
+ readonly type: "array";
25
+ readonly maxItems: 1;
26
+ readonly items: {
27
+ readonly type: "object";
28
+ readonly additionalProperties: false;
29
+ readonly properties: {
30
+ readonly fieldName: {
31
+ readonly oneOf: readonly [{
32
+ readonly $ref: "#/definitions/asString";
33
+ }, {
34
+ readonly $ref: "#/definitions/asArray";
35
+ }];
36
+ readonly default: "id";
37
+ };
38
+ };
39
+ };
40
+ };
41
+ type RuleOptions = FromSchema<typeof schema>;
42
+ declare const rule: GraphQLESLintRule<RuleOptions, true>;
43
+
44
+ export { RuleOptions, rule };
@@ -0,0 +1,231 @@
1
+ import "../chunk-BMTV3EA2.js";
2
+ import { asArray } from "@graphql-tools/utils";
3
+ import {
4
+ GraphQLInterfaceType,
5
+ GraphQLObjectType,
6
+ GraphQLUnionType,
7
+ Kind,
8
+ TypeInfo,
9
+ visit,
10
+ visitWithTypeInfo
11
+ } from "graphql";
12
+ import { getBaseType } from "../estree-converter/index.js";
13
+ import {
14
+ ARRAY_DEFAULT_OPTIONS,
15
+ englishJoinWords,
16
+ requireGraphQLSchemaFromContext,
17
+ requireSiblingsOperations
18
+ } from "../utils.js";
19
+ const RULE_ID = "require-id-when-available";
20
+ const DEFAULT_ID_FIELD_NAME = "id";
21
+ const schema = {
22
+ definitions: {
23
+ asString: {
24
+ type: "string"
25
+ },
26
+ asArray: ARRAY_DEFAULT_OPTIONS
27
+ },
28
+ type: "array",
29
+ maxItems: 1,
30
+ items: {
31
+ type: "object",
32
+ additionalProperties: false,
33
+ properties: {
34
+ fieldName: {
35
+ oneOf: [{ $ref: "#/definitions/asString" }, { $ref: "#/definitions/asArray" }],
36
+ default: DEFAULT_ID_FIELD_NAME
37
+ }
38
+ }
39
+ }
40
+ };
41
+ const rule = {
42
+ meta: {
43
+ type: "suggestion",
44
+ hasSuggestions: true,
45
+ docs: {
46
+ category: "Operations",
47
+ description: "Enforce selecting specific fields when they are available on the GraphQL type.",
48
+ url: `https://the-guild.dev/graphql/eslint/rules/${RULE_ID}`,
49
+ requiresSchema: true,
50
+ requiresSiblings: true,
51
+ examples: [
52
+ {
53
+ title: "Incorrect",
54
+ code: (
55
+ /* GraphQL */
56
+ `
57
+ # In your schema
58
+ type User {
59
+ id: ID!
60
+ name: String!
61
+ }
62
+
63
+ # Query
64
+ query {
65
+ user {
66
+ name
67
+ }
68
+ }
69
+ `
70
+ )
71
+ },
72
+ {
73
+ title: "Correct",
74
+ code: (
75
+ /* GraphQL */
76
+ `
77
+ # In your schema
78
+ type User {
79
+ id: ID!
80
+ name: String!
81
+ }
82
+
83
+ # Query
84
+ query {
85
+ user {
86
+ id
87
+ name
88
+ }
89
+ }
90
+
91
+ # Selecting \`id\` with an alias is also valid
92
+ query {
93
+ user {
94
+ id: name
95
+ }
96
+ }
97
+ `
98
+ )
99
+ }
100
+ ],
101
+ recommended: true
102
+ },
103
+ messages: {
104
+ [RULE_ID]: "Field{{ pluralSuffix }} {{ fieldName }} must be selected when it's available on a type.\nInclude it in your selection set{{ addition }}."
105
+ },
106
+ schema
107
+ },
108
+ create(context) {
109
+ const schema2 = requireGraphQLSchemaFromContext(RULE_ID, context);
110
+ const siblings = requireSiblingsOperations(RULE_ID, context);
111
+ const { fieldName = DEFAULT_ID_FIELD_NAME } = context.options[0] || {};
112
+ const idNames = asArray(fieldName);
113
+ const selector = "OperationDefinition SelectionSet[parent.kind!=/(^OperationDefinition|InlineFragment)$/]";
114
+ const typeInfo = new TypeInfo(schema2);
115
+ function checkFragments(node) {
116
+ for (const selection of node.selections) {
117
+ if (selection.kind !== Kind.FRAGMENT_SPREAD) {
118
+ continue;
119
+ }
120
+ const [foundSpread] = siblings.getFragment(selection.name.value);
121
+ if (!foundSpread) {
122
+ continue;
123
+ }
124
+ const checkedFragmentSpreads = /* @__PURE__ */ new Set();
125
+ const visitor = visitWithTypeInfo(typeInfo, {
126
+ SelectionSet(node2, key, _parent) {
127
+ const parent = _parent;
128
+ if (parent.kind === Kind.FRAGMENT_DEFINITION) {
129
+ checkedFragmentSpreads.add(parent.name.value);
130
+ } else if (parent.kind !== Kind.INLINE_FRAGMENT) {
131
+ checkSelections(
132
+ node2,
133
+ typeInfo.getType(),
134
+ selection.loc.start,
135
+ parent,
136
+ checkedFragmentSpreads
137
+ );
138
+ }
139
+ }
140
+ });
141
+ visit(foundSpread.document, visitor);
142
+ }
143
+ }
144
+ function checkSelections(node, type, loc, parent, checkedFragmentSpreads = /* @__PURE__ */ new Set()) {
145
+ const rawType = getBaseType(type);
146
+ if (rawType instanceof GraphQLObjectType || rawType instanceof GraphQLInterfaceType) {
147
+ checkFields(rawType);
148
+ } else if (rawType instanceof GraphQLUnionType) {
149
+ for (const selection of node.selections) {
150
+ if (selection.kind === Kind.INLINE_FRAGMENT) {
151
+ const types = rawType.getTypes();
152
+ const t = types.find((t2) => t2.name === selection.typeCondition.name.value);
153
+ if (t) {
154
+ checkFields(t);
155
+ }
156
+ }
157
+ }
158
+ }
159
+ function checkFields(rawType2) {
160
+ const fields = rawType2.getFields();
161
+ const hasIdFieldInType = idNames.some((name) => fields[name]);
162
+ if (!hasIdFieldInType) {
163
+ return;
164
+ }
165
+ function hasIdField({ selections }) {
166
+ return selections.some((selection) => {
167
+ if (selection.kind === Kind.FIELD) {
168
+ if (selection.alias && idNames.includes(selection.alias.value)) {
169
+ return true;
170
+ }
171
+ return idNames.includes(selection.name.value);
172
+ }
173
+ if (selection.kind === Kind.INLINE_FRAGMENT) {
174
+ return hasIdField(selection.selectionSet);
175
+ }
176
+ if (selection.kind === Kind.FRAGMENT_SPREAD) {
177
+ const [foundSpread] = siblings.getFragment(selection.name.value);
178
+ if (foundSpread) {
179
+ const fragmentSpread = foundSpread.document;
180
+ checkedFragmentSpreads.add(fragmentSpread.name.value);
181
+ return hasIdField(fragmentSpread.selectionSet);
182
+ }
183
+ }
184
+ return false;
185
+ });
186
+ }
187
+ const hasId = hasIdField(node);
188
+ checkFragments(node);
189
+ if (hasId) {
190
+ return;
191
+ }
192
+ const pluralSuffix = idNames.length > 1 ? "s" : "";
193
+ const fieldName2 = englishJoinWords(
194
+ idNames.map((name) => `\`${(parent.alias || parent.name).value}.${name}\``)
195
+ );
196
+ const addition = checkedFragmentSpreads.size === 0 ? "" : ` or add to used fragment${checkedFragmentSpreads.size > 1 ? "s" : ""} ${englishJoinWords([...checkedFragmentSpreads].map((name) => `\`${name}\``))}`;
197
+ const problem = {
198
+ loc,
199
+ messageId: RULE_ID,
200
+ data: {
201
+ pluralSuffix,
202
+ fieldName: fieldName2,
203
+ addition
204
+ }
205
+ };
206
+ if ("type" in node) {
207
+ problem.suggest = idNames.map((idName) => ({
208
+ desc: `Add \`${idName}\` selection`,
209
+ fix: (fixer) => {
210
+ let insertNode = node.selections[0];
211
+ insertNode = insertNode.kind === Kind.INLINE_FRAGMENT ? insertNode.selectionSet.selections[0] : insertNode;
212
+ return fixer.insertTextBefore(insertNode, `${idName} `);
213
+ }
214
+ }));
215
+ }
216
+ context.report(problem);
217
+ }
218
+ }
219
+ return {
220
+ [selector](node) {
221
+ const typeInfo2 = node.typeInfo();
222
+ if (typeInfo2.gqlType) {
223
+ checkSelections(node, typeInfo2.gqlType, node.loc.start, node.parent);
224
+ }
225
+ }
226
+ };
227
+ }
228
+ };
229
+ export {
230
+ rule
231
+ };
@@ -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 };