@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,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 };