@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,169 @@
1
+ import "../chunk-BMTV3EA2.js";
2
+ import { Kind } from "graphql";
3
+ import {
4
+ ARRAY_DEFAULT_OPTIONS,
5
+ displayNodeName,
6
+ englishJoinWords,
7
+ requireGraphQLSchemaFromContext,
8
+ truthy
9
+ } from "../utils.js";
10
+ const RULE_ID = "strict-id-in-types";
11
+ const schema = {
12
+ type: "array",
13
+ maxItems: 1,
14
+ items: {
15
+ type: "object",
16
+ additionalProperties: false,
17
+ properties: {
18
+ acceptedIdNames: {
19
+ ...ARRAY_DEFAULT_OPTIONS,
20
+ default: ["id"]
21
+ },
22
+ acceptedIdTypes: {
23
+ ...ARRAY_DEFAULT_OPTIONS,
24
+ default: ["ID"]
25
+ },
26
+ exceptions: {
27
+ type: "object",
28
+ additionalProperties: false,
29
+ properties: {
30
+ types: {
31
+ ...ARRAY_DEFAULT_OPTIONS,
32
+ description: "This is used to exclude types with names that match one of the specified values."
33
+ },
34
+ suffixes: {
35
+ ...ARRAY_DEFAULT_OPTIONS,
36
+ description: "This is used to exclude types with names with suffixes that match one of the specified values."
37
+ }
38
+ }
39
+ }
40
+ }
41
+ }
42
+ };
43
+ const rule = {
44
+ meta: {
45
+ type: "suggestion",
46
+ docs: {
47
+ description: "Requires output types to have one unique identifier unless they do not have a logical one. Exceptions can be used to ignore output types that do not have unique identifiers.",
48
+ category: "Schema",
49
+ recommended: true,
50
+ url: `https://the-guild.dev/graphql/eslint/rules/${RULE_ID}`,
51
+ requiresSchema: true,
52
+ examples: [
53
+ {
54
+ title: "Incorrect",
55
+ usage: [
56
+ {
57
+ acceptedIdNames: ["id", "_id"],
58
+ acceptedIdTypes: ["ID"],
59
+ exceptions: { suffixes: ["Payload"] }
60
+ }
61
+ ],
62
+ code: (
63
+ /* GraphQL */
64
+ `
65
+ # Incorrect field name
66
+ type InvalidFieldName {
67
+ key: ID!
68
+ }
69
+
70
+ # Incorrect field type
71
+ type InvalidFieldType {
72
+ id: String!
73
+ }
74
+
75
+ # Incorrect exception suffix
76
+ type InvalidSuffixResult {
77
+ data: String!
78
+ }
79
+
80
+ # Too many unique identifiers. Must only contain one.
81
+ type InvalidFieldName {
82
+ id: ID!
83
+ _id: ID!
84
+ }
85
+ `
86
+ )
87
+ },
88
+ {
89
+ title: "Correct",
90
+ usage: [
91
+ {
92
+ acceptedIdNames: ["id", "_id"],
93
+ acceptedIdTypes: ["ID"],
94
+ exceptions: { types: ["Error"], suffixes: ["Payload"] }
95
+ }
96
+ ],
97
+ code: (
98
+ /* GraphQL */
99
+ `
100
+ type User {
101
+ id: ID!
102
+ }
103
+
104
+ type Post {
105
+ _id: ID!
106
+ }
107
+
108
+ type CreateUserPayload {
109
+ data: String!
110
+ }
111
+
112
+ type Error {
113
+ message: String!
114
+ }
115
+ `
116
+ )
117
+ }
118
+ ]
119
+ },
120
+ schema
121
+ },
122
+ create(context) {
123
+ const options = {
124
+ acceptedIdNames: ["id"],
125
+ acceptedIdTypes: ["ID"],
126
+ exceptions: {},
127
+ ...context.options[0]
128
+ };
129
+ const schema2 = requireGraphQLSchemaFromContext(RULE_ID, context);
130
+ const rootTypeNames = [
131
+ schema2.getQueryType(),
132
+ schema2.getMutationType(),
133
+ schema2.getSubscriptionType()
134
+ ].filter(truthy).map((type) => type.name);
135
+ const selector = `ObjectTypeDefinition[name.value!=/^(${rootTypeNames.join("|")})$/]`;
136
+ return {
137
+ [selector](node) {
138
+ var _a, _b, _c;
139
+ const typeName = node.name.value;
140
+ const shouldIgnoreNode = ((_a = options.exceptions.types) == null ? void 0 : _a.includes(typeName)) || ((_b = options.exceptions.suffixes) == null ? void 0 : _b.some((suffix) => typeName.endsWith(suffix)));
141
+ if (shouldIgnoreNode) {
142
+ return;
143
+ }
144
+ const validIds = (_c = node.fields) == null ? void 0 : _c.filter((field) => {
145
+ const fieldNode = field.rawNode();
146
+ const isValidIdName = options.acceptedIdNames.includes(fieldNode.name.value);
147
+ let isValidIdType = false;
148
+ if (fieldNode.type.kind === Kind.NON_NULL_TYPE && fieldNode.type.type.kind === Kind.NAMED_TYPE) {
149
+ isValidIdType = options.acceptedIdTypes.includes(fieldNode.type.type.name.value);
150
+ }
151
+ return isValidIdName && isValidIdType;
152
+ });
153
+ if ((validIds == null ? void 0 : validIds.length) !== 1) {
154
+ const pluralNamesSuffix = options.acceptedIdNames.length > 1 ? "s" : "";
155
+ const pluralTypesSuffix = options.acceptedIdTypes.length > 1 ? "s" : "";
156
+ context.report({
157
+ node: node.name,
158
+ message: `${displayNodeName(node)} must have exactly one non-nullable unique identifier.
159
+ Accepted name${pluralNamesSuffix}: ${englishJoinWords(options.acceptedIdNames)}.
160
+ Accepted type${pluralTypesSuffix}: ${englishJoinWords(options.acceptedIdTypes)}.`
161
+ });
162
+ }
163
+ }
164
+ };
165
+ }
166
+ };
167
+ export {
168
+ rule
169
+ };
@@ -0,0 +1,13 @@
1
+ import { ExecutableDefinitionNode } from 'graphql';
2
+ import { GraphQLESTreeNode } from '../estree-converter/types.mjs';
3
+ import { c as GraphQLESLintRuleContext, f as GraphQLESLintRule } from '../types-ace77d86.js';
4
+ import 'eslint';
5
+ import 'estree';
6
+ import '@graphql-tools/utils';
7
+ import 'graphql-config';
8
+ import 'json-schema-to-ts';
9
+
10
+ declare const checkNode: (context: GraphQLESLintRuleContext, node: GraphQLESTreeNode<ExecutableDefinitionNode>, ruleId: string) => void;
11
+ declare const rule: GraphQLESLintRule;
12
+
13
+ export { checkNode, rule };
@@ -0,0 +1,94 @@
1
+ import "../chunk-BMTV3EA2.js";
2
+ import { relative } from "path";
3
+ import { Kind } from "graphql";
4
+ import { CWD, normalizePath, requireSiblingsOperations, VIRTUAL_DOCUMENT_REGEX } from "../utils.js";
5
+ const RULE_ID = "unique-fragment-name";
6
+ const checkNode = (context, node, ruleId) => {
7
+ const documentName = node.name.value;
8
+ const siblings = requireSiblingsOperations(ruleId, context);
9
+ const siblingDocuments = node.kind === Kind.FRAGMENT_DEFINITION ? siblings.getFragment(documentName) : siblings.getOperation(documentName);
10
+ const filepath = context.getFilename();
11
+ const conflictingDocuments = siblingDocuments.filter((f) => {
12
+ var _a;
13
+ const isSameName = ((_a = f.document.name) == null ? void 0 : _a.value) === documentName;
14
+ const isSamePath = normalizePath(f.filePath) === normalizePath(filepath);
15
+ return isSameName && !isSamePath;
16
+ });
17
+ if (conflictingDocuments.length > 0) {
18
+ context.report({
19
+ messageId: ruleId,
20
+ data: {
21
+ documentName,
22
+ summary: conflictingDocuments.map((f) => ` ${relative(CWD, f.filePath.replace(VIRTUAL_DOCUMENT_REGEX, ""))}`).join("\n")
23
+ },
24
+ // @ts-expect-error name will exist
25
+ node: node.name
26
+ });
27
+ }
28
+ };
29
+ const rule = {
30
+ meta: {
31
+ type: "suggestion",
32
+ docs: {
33
+ category: "Operations",
34
+ description: "Enforce unique fragment names across your project.",
35
+ url: `https://the-guild.dev/graphql/eslint/rules/${RULE_ID}`,
36
+ requiresSiblings: true,
37
+ examples: [
38
+ {
39
+ title: "Incorrect",
40
+ code: (
41
+ /* GraphQL */
42
+ `
43
+ # user.fragment.graphql
44
+ fragment UserFields on User {
45
+ id
46
+ name
47
+ fullName
48
+ }
49
+
50
+ # user-fields.graphql
51
+ fragment UserFields on User {
52
+ id
53
+ }
54
+ `
55
+ )
56
+ },
57
+ {
58
+ title: "Correct",
59
+ code: (
60
+ /* GraphQL */
61
+ `
62
+ # user.fragment.graphql
63
+ fragment AllUserFields on User {
64
+ id
65
+ name
66
+ fullName
67
+ }
68
+
69
+ # user-fields.graphql
70
+ fragment UserFields on User {
71
+ id
72
+ }
73
+ `
74
+ )
75
+ }
76
+ ]
77
+ },
78
+ messages: {
79
+ [RULE_ID]: 'Fragment named "{{ documentName }}" already defined in:\n{{ summary }}'
80
+ },
81
+ schema: []
82
+ },
83
+ create(context) {
84
+ return {
85
+ FragmentDefinition(node) {
86
+ checkNode(context, node, RULE_ID);
87
+ }
88
+ };
89
+ }
90
+ };
91
+ export {
92
+ checkNode,
93
+ rule
94
+ };
@@ -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,72 @@
1
+ import "../chunk-BMTV3EA2.js";
2
+ import { checkNode } from "./unique-fragment-name.js";
3
+ const RULE_ID = "unique-operation-name";
4
+ const rule = {
5
+ meta: {
6
+ type: "suggestion",
7
+ docs: {
8
+ category: "Operations",
9
+ description: "Enforce unique operation names across your project.",
10
+ url: `https://the-guild.dev/graphql/eslint/rules/${RULE_ID}`,
11
+ requiresSiblings: true,
12
+ examples: [
13
+ {
14
+ title: "Incorrect",
15
+ code: (
16
+ /* GraphQL */
17
+ `
18
+ # foo.query.graphql
19
+ query user {
20
+ user {
21
+ id
22
+ }
23
+ }
24
+
25
+ # bar.query.graphql
26
+ query user {
27
+ me {
28
+ id
29
+ }
30
+ }
31
+ `
32
+ )
33
+ },
34
+ {
35
+ title: "Correct",
36
+ code: (
37
+ /* GraphQL */
38
+ `
39
+ # foo.query.graphql
40
+ query user {
41
+ user {
42
+ id
43
+ }
44
+ }
45
+
46
+ # bar.query.graphql
47
+ query me {
48
+ me {
49
+ id
50
+ }
51
+ }
52
+ `
53
+ )
54
+ }
55
+ ]
56
+ },
57
+ messages: {
58
+ [RULE_ID]: 'Operation named "{{ documentName }}" already defined in:\n{{ summary }}'
59
+ },
60
+ schema: []
61
+ },
62
+ create(context) {
63
+ return {
64
+ "OperationDefinition[name!=undefined]"(node) {
65
+ checkNode(context, node, RULE_ID);
66
+ }
67
+ };
68
+ }
69
+ };
70
+ export {
71
+ rule
72
+ };
@@ -0,0 +1,12 @@
1
+ import { GraphQLProjectConfig } from 'graphql-config';
2
+ import { P as ParserOptions, S as Schema } from './types-ace77d86.js';
3
+ import '@graphql-tools/utils';
4
+ import 'eslint';
5
+ import 'estree';
6
+ import 'graphql';
7
+ import 'json-schema-to-ts';
8
+ import './estree-converter/types.mjs';
9
+
10
+ declare function getSchema(project: GraphQLProjectConfig, schemaOptions?: ParserOptions['schemaOptions']): Schema;
11
+
12
+ export { getSchema };
package/esm/schema.js ADDED
@@ -0,0 +1,32 @@
1
+ import "./chunk-BMTV3EA2.js";
2
+ import debugFactory from "debug";
3
+ import fg from "fast-glob";
4
+ import { GraphQLSchema } from "graphql";
5
+ import { ModuleCache } from "./cache.js";
6
+ const schemaCache = new ModuleCache();
7
+ const debug = debugFactory("graphql-eslint:schema");
8
+ function getSchema(project, schemaOptions) {
9
+ const schemaKey = project.schema;
10
+ if (!schemaKey) {
11
+ return null;
12
+ }
13
+ const cache = schemaCache.get(schemaKey);
14
+ if (cache) {
15
+ return cache;
16
+ }
17
+ debug("Loading schema from %o", project.schema);
18
+ const schema = project.loadSchemaSync(project.schema, "GraphQLSchema", {
19
+ ...schemaOptions,
20
+ pluckConfig: project.extensions.pluckConfig
21
+ });
22
+ if (debug.enabled) {
23
+ debug("Schema loaded: %o", schema instanceof GraphQLSchema);
24
+ const schemaPaths = fg.sync(project.schema, { absolute: true });
25
+ debug("Schema pointers %O", schemaPaths);
26
+ }
27
+ schemaCache.set(schemaKey, schema);
28
+ return schema;
29
+ }
30
+ export {
31
+ getSchema
32
+ };
@@ -0,0 +1,8 @@
1
+ import 'graphql';
2
+ import 'graphql-config';
3
+ export { F as FragmentSource, h as OperationSource, g as SiblingOperations, i as getSiblings } from './types-ace77d86.js';
4
+ import '@graphql-tools/utils';
5
+ import 'eslint';
6
+ import 'estree';
7
+ import 'json-schema-to-ts';
8
+ import './estree-converter/types.mjs';
@@ -0,0 +1,116 @@
1
+ import "./chunk-BMTV3EA2.js";
2
+ import { parseGraphQLSDL } from "@graphql-tools/utils";
3
+ import {
4
+ Kind,
5
+ visit
6
+ } from "graphql";
7
+ import { getDocuments } from "./documents.js";
8
+ import { logger } from "./utils.js";
9
+ const siblingOperationsCache = /* @__PURE__ */ new Map();
10
+ function getSiblings(project, documents) {
11
+ const siblings = project ? getDocuments(project) : typeof documents === "string" ? [parseGraphQLSDL("operation.graphql", documents, { noLocation: true })] : [];
12
+ if (siblings.length === 0) {
13
+ let printed = false;
14
+ const noopWarn = () => {
15
+ if (!printed) {
16
+ logger.warn(
17
+ 'getSiblingOperations was called without any operations. Make sure to set "parserOptions.operations" to make this feature available!'
18
+ );
19
+ printed = true;
20
+ }
21
+ return [];
22
+ };
23
+ return {
24
+ available: false,
25
+ getFragment: noopWarn,
26
+ getFragments: noopWarn,
27
+ getFragmentByType: noopWarn,
28
+ getFragmentsInUse: noopWarn,
29
+ getOperation: noopWarn,
30
+ getOperations: noopWarn,
31
+ getOperationByType: noopWarn
32
+ };
33
+ }
34
+ const value = siblingOperationsCache.get(siblings);
35
+ if (value) {
36
+ return value;
37
+ }
38
+ let fragmentsCache = null;
39
+ const getFragments = () => {
40
+ var _a;
41
+ if (fragmentsCache === null) {
42
+ const result = [];
43
+ for (const source of siblings) {
44
+ for (const definition of ((_a = source.document) == null ? void 0 : _a.definitions) || []) {
45
+ if (definition.kind === Kind.FRAGMENT_DEFINITION) {
46
+ result.push({
47
+ filePath: source.location,
48
+ document: definition
49
+ });
50
+ }
51
+ }
52
+ }
53
+ fragmentsCache = result;
54
+ }
55
+ return fragmentsCache;
56
+ };
57
+ let cachedOperations = null;
58
+ const getOperations = () => {
59
+ var _a;
60
+ if (cachedOperations === null) {
61
+ const result = [];
62
+ for (const source of siblings) {
63
+ for (const definition of ((_a = source.document) == null ? void 0 : _a.definitions) || []) {
64
+ if (definition.kind === Kind.OPERATION_DEFINITION) {
65
+ result.push({
66
+ filePath: source.location,
67
+ document: definition
68
+ });
69
+ }
70
+ }
71
+ }
72
+ cachedOperations = result;
73
+ }
74
+ return cachedOperations;
75
+ };
76
+ const getFragment = (name) => getFragments().filter((f) => f.document.name.value === name);
77
+ const collectFragments = (selectable, recursive, collected = /* @__PURE__ */ new Map()) => {
78
+ visit(selectable, {
79
+ FragmentSpread(spread) {
80
+ const fragmentName = spread.name.value;
81
+ const [fragment] = getFragment(fragmentName);
82
+ if (!fragment) {
83
+ logger.warn(
84
+ `Unable to locate fragment named "${fragmentName}", please make sure it's loaded using "parserOptions.operations"`
85
+ );
86
+ return;
87
+ }
88
+ if (!collected.has(fragmentName)) {
89
+ collected.set(fragmentName, fragment.document);
90
+ if (recursive) {
91
+ collectFragments(fragment.document, recursive, collected);
92
+ }
93
+ }
94
+ }
95
+ });
96
+ return collected;
97
+ };
98
+ const siblingOperations = {
99
+ available: true,
100
+ getFragment,
101
+ getFragments,
102
+ getFragmentByType: (typeName) => getFragments().filter((f) => f.document.typeCondition.name.value === typeName),
103
+ getFragmentsInUse: (selectable, recursive = true) => Array.from(collectFragments(selectable, recursive).values()),
104
+ getOperation: (name) => getOperations().filter((o) => {
105
+ var _a;
106
+ return ((_a = o.document.name) == null ? void 0 : _a.value) === name;
107
+ }),
108
+ getOperations,
109
+ getOperationByType: (type) => getOperations().filter((o) => o.document.operation === type)
110
+ };
111
+ siblingOperationsCache.set(siblings, siblingOperations);
112
+ return siblingOperations;
113
+ }
114
+ export {
115
+ getSiblings
116
+ };
@@ -0,0 +1,107 @@
1
+ import { GraphQLParseOptions } from '@graphql-tools/utils';
2
+ import { Linter, Rule, AST } from 'eslint';
3
+ import * as ESTree from 'estree';
4
+ import { FragmentDefinitionNode, OperationDefinitionNode, SelectionSetNode, OperationTypeNode, GraphQLSchema, ASTKindToNode } from 'graphql';
5
+ import { GraphQLProjectConfig, IExtensions, IGraphQLProject } from 'graphql-config';
6
+ import { JSONSchema } from 'json-schema-to-ts';
7
+ import { GraphQLESTreeNode } from './estree-converter/types.mjs';
8
+
9
+ type FragmentSource = {
10
+ filePath: string;
11
+ document: FragmentDefinitionNode;
12
+ };
13
+ type OperationSource = {
14
+ filePath: string;
15
+ document: OperationDefinitionNode;
16
+ };
17
+ type SiblingOperations = {
18
+ available: boolean;
19
+ getFragment(fragmentName: string): FragmentSource[];
20
+ getFragments(): FragmentSource[];
21
+ getFragmentByType(typeName: string): FragmentSource[];
22
+ getFragmentsInUse(baseOperation: FragmentDefinitionNode | OperationDefinitionNode | SelectionSetNode, recursive?: boolean): FragmentDefinitionNode[];
23
+ getOperation(operationName: string): OperationSource[];
24
+ getOperations(): OperationSource[];
25
+ getOperationByType(operationType: OperationTypeNode): OperationSource[];
26
+ };
27
+ declare function getSiblings(project?: GraphQLProjectConfig, documents?: ParserOptions['documents']): SiblingOperations;
28
+
29
+ type Schema = GraphQLSchema | null;
30
+ type Pointer = string | string[];
31
+ interface ParserOptions {
32
+ schema?: Pointer | Record<string, {
33
+ headers: Record<string, string>;
34
+ }>;
35
+ documents?: Pointer;
36
+ extensions?: IExtensions;
37
+ include?: Pointer;
38
+ exclude?: Pointer;
39
+ projects?: Record<string, IGraphQLProject>;
40
+ schemaOptions?: Omit<GraphQLParseOptions, 'assumeValidSDL'> & {
41
+ headers: Record<string, string>;
42
+ };
43
+ graphQLParserOptions?: Omit<GraphQLParseOptions, 'noLocation'>;
44
+ skipGraphQLConfig?: boolean;
45
+ filePath: string;
46
+ /** @deprecated Use `documents` instead */
47
+ operations?: Pointer;
48
+ }
49
+ type ParserServices = {
50
+ schema: Schema;
51
+ siblingOperations: SiblingOperations;
52
+ };
53
+ type GraphQLESLintParseResult = Linter.ESLintParseResult & {
54
+ services: ParserServices;
55
+ };
56
+ type Location = AST.SourceLocation | ESTree.Position;
57
+ type ReportDescriptorLocation = {
58
+ loc: Location;
59
+ } | {
60
+ node: {
61
+ loc: Location;
62
+ };
63
+ };
64
+ type ReportDescriptor = ReportDescriptorLocation & Rule.ReportDescriptorMessage & Rule.ReportDescriptorOptions;
65
+ type GraphQLESLintRuleContext<Options = any[]> = Omit<Rule.RuleContext, 'options' | 'parserServices' | 'report'> & {
66
+ options: Options;
67
+ parserServices: ParserServices;
68
+ report(descriptor: ReportDescriptor): void;
69
+ };
70
+ type CategoryType = 'Operations' | 'Schema';
71
+ type RuleMetaDataDocs = Required<Rule.RuleMetaData>['docs'];
72
+ type RuleDocsInfo<T> = Omit<RuleMetaDataDocs, 'category' | 'suggestion'> & {
73
+ category: CategoryType | CategoryType[];
74
+ requiresSchema?: true;
75
+ requiresSiblings?: true;
76
+ examples?: {
77
+ title: string;
78
+ code: string;
79
+ usage?: T;
80
+ }[];
81
+ configOptions?: T | {
82
+ schema?: T;
83
+ operations?: T;
84
+ };
85
+ graphQLJSRuleName?: string;
86
+ isDisabledForAllConfig?: true;
87
+ };
88
+ type GraphQLESLintRuleListener<WithTypeInfo extends boolean = false> = Record<string, any> & {
89
+ [K in keyof ASTKindToNode]?: (node: GraphQLESTreeNode<ASTKindToNode[K], WithTypeInfo>) => void;
90
+ };
91
+ type GraphQLESLintRule<Options = [], WithTypeInfo extends boolean = false> = {
92
+ meta: Omit<Rule.RuleMetaData, 'docs' | 'schema'> & {
93
+ docs?: RuleDocsInfo<Options>;
94
+ schema: Readonly<JSONSchema> | [];
95
+ };
96
+ create(context: GraphQLESLintRuleContext<Options>): GraphQLESLintRuleListener<WithTypeInfo>;
97
+ };
98
+ type ValueOf<T> = T[keyof T];
99
+ type Id<T> = {
100
+ [P in keyof T]: T[P];
101
+ } & {};
102
+ type OmitDistributive<T, K extends PropertyKey> = T extends object ? Id<OmitRecursively<T, K>> : T;
103
+ type OmitRecursively<T extends object, K extends PropertyKey> = Omit<{
104
+ [P in keyof T]: OmitDistributive<T[P], K>;
105
+ }, K>;
106
+
107
+ export { CategoryType as C, FragmentSource as F, GraphQLESLintParseResult as G, OmitRecursively as O, ParserOptions as P, ReportDescriptor as R, Schema as S, ValueOf as V, Pointer as a, ParserServices as b, GraphQLESLintRuleContext as c, RuleDocsInfo as d, GraphQLESLintRuleListener as e, GraphQLESLintRule as f, SiblingOperations as g, OperationSource as h, getSiblings as i };
@@ -0,0 +1,8 @@
1
+ import '@graphql-tools/utils';
2
+ import 'eslint';
3
+ import 'estree';
4
+ import 'graphql';
5
+ import 'graphql-config';
6
+ import 'json-schema-to-ts';
7
+ export { C as CategoryType, G as GraphQLESLintParseResult, f as GraphQLESLintRule, c as GraphQLESLintRuleContext, e as GraphQLESLintRuleListener, O as OmitRecursively, P as ParserOptions, b as ParserServices, a as Pointer, R as ReportDescriptor, d as RuleDocsInfo, S as Schema, V as ValueOf } from './types-ace77d86.js';
8
+ import './estree-converter/types.mjs';
package/esm/types.js ADDED
File without changes