@graphql-eslint/eslint-plugin 3.19.3 → 3.20.0-alpha-20230703154330-0d51273

Sign up to get free protection for your applications and to get access to all the features.
Files changed (302) hide show
  1. package/{typings → cjs}/cache.d.ts +3 -1
  2. package/cjs/cache.js +57 -26
  3. package/{typings → cjs}/configs/index.d.ts +3 -1
  4. package/cjs/configs/index.js +47 -14
  5. package/{typings → cjs}/configs/operations-all.d.ts +2 -1
  6. package/cjs/configs/operations-all.js +47 -30
  7. package/{typings → cjs}/configs/operations-recommended.d.ts +2 -1
  8. package/cjs/configs/operations-recommended.js +72 -55
  9. package/{typings → cjs}/configs/relay.d.ts +2 -1
  10. package/cjs/configs/relay.js +31 -11
  11. package/{typings → cjs}/configs/schema-all.d.ts +2 -1
  12. package/cjs/configs/schema-all.js +41 -24
  13. package/{typings → cjs}/configs/schema-recommended.d.ts +2 -1
  14. package/cjs/configs/schema-recommended.js +68 -51
  15. package/{typings → cjs}/documents.d.ts +4 -1
  16. package/cjs/documents.js +74 -43
  17. package/cjs/estree-converter/converter.d.ts +8 -0
  18. package/cjs/estree-converter/converter.js +80 -59
  19. package/cjs/estree-converter/index.d.ts +8 -0
  20. package/cjs/estree-converter/index.js +25 -5
  21. package/{typings → cjs}/estree-converter/types.d.ts +7 -5
  22. package/cjs/estree-converter/types.js +16 -0
  23. package/cjs/estree-converter/utils.d.ts +18 -0
  24. package/cjs/estree-converter/utils.js +119 -95
  25. package/{typings → cjs}/flat-configs.d.ts +12 -1
  26. package/cjs/flat-configs.js +56 -32
  27. package/cjs/graphql-config.d.ts +13 -0
  28. package/cjs/graphql-config.js +78 -47
  29. package/cjs/index.d.ts +22 -0
  30. package/cjs/index.js +50 -18
  31. package/cjs/parser.d.ts +12 -0
  32. package/cjs/parser.js +96 -76
  33. package/cjs/processor.d.ts +9 -0
  34. package/cjs/processor.js +119 -88
  35. package/{typings → cjs}/rules/alphabetize.d.ts +12 -4
  36. package/cjs/rules/alphabetize.js +337 -295
  37. package/{typings → cjs}/rules/description-style.d.ts +12 -4
  38. package/cjs/rules/description-style.js +96 -66
  39. package/cjs/rules/graphql-js-validation.d.ts +12 -0
  40. package/cjs/rules/graphql-js-validation.js +595 -433
  41. package/cjs/rules/index.d.ts +125 -0
  42. package/cjs/rules/index.js +97 -76
  43. package/{typings → cjs}/rules/input-name.d.ts +12 -4
  44. package/cjs/rules/input-name.js +153 -123
  45. package/{typings → cjs}/rules/lone-executable-definition.d.ts +12 -4
  46. package/cjs/rules/lone-executable-definition.js +101 -72
  47. package/{typings → cjs}/rules/match-document-filename.d.ts +14 -6
  48. package/cjs/rules/match-document-filename.js +229 -182
  49. package/{typings → cjs}/rules/naming-convention.d.ts +12 -4
  50. package/cjs/rules/naming-convention.js +380 -316
  51. package/cjs/rules/no-anonymous-operations.d.ts +12 -0
  52. package/cjs/rules/no-anonymous-operations.js +88 -57
  53. package/cjs/rules/no-case-insensitive-enum-values-duplicates.d.ts +12 -0
  54. package/cjs/rules/no-case-insensitive-enum-values-duplicates.js +82 -50
  55. package/cjs/rules/no-deprecated.d.ts +12 -0
  56. package/cjs/rules/no-deprecated.js +106 -75
  57. package/cjs/rules/no-duplicate-fields.d.ts +12 -0
  58. package/cjs/rules/no-duplicate-fields.js +116 -82
  59. package/cjs/rules/no-hashtag-description.d.ts +13 -0
  60. package/cjs/rules/no-hashtag-description.js +119 -82
  61. package/cjs/rules/no-one-place-fragments.d.ts +12 -0
  62. package/cjs/rules/no-one-place-fragments.js +88 -58
  63. package/{typings → cjs}/rules/no-root-type.d.ts +12 -4
  64. package/cjs/rules/no-root-type.js +101 -74
  65. package/cjs/rules/no-scalar-result-type-on-mutation.d.ts +12 -0
  66. package/cjs/rules/no-scalar-result-type-on-mutation.js +90 -60
  67. package/cjs/rules/no-typename-prefix.d.ts +12 -0
  68. package/cjs/rules/no-typename-prefix.js +88 -55
  69. package/cjs/rules/no-unreachable-types.d.ts +12 -0
  70. package/cjs/rules/no-unreachable-types.js +169 -134
  71. package/cjs/rules/no-unused-fields.d.ts +12 -0
  72. package/cjs/rules/no-unused-fields.js +117 -92
  73. package/{typings → cjs}/rules/relay-arguments.d.ts +12 -4
  74. package/cjs/rules/relay-arguments.js +136 -110
  75. package/cjs/rules/relay-connection-types.d.ts +13 -0
  76. package/cjs/rules/relay-connection-types.js +123 -94
  77. package/{typings → cjs}/rules/relay-edge-types.d.ts +12 -4
  78. package/cjs/rules/relay-edge-types.js +196 -179
  79. package/cjs/rules/relay-page-info.d.ts +12 -0
  80. package/cjs/rules/relay-page-info.js +108 -89
  81. package/{typings → cjs}/rules/require-deprecation-date.d.ts +12 -4
  82. package/cjs/rules/require-deprecation-date.js +143 -112
  83. package/cjs/rules/require-deprecation-reason.d.ts +12 -0
  84. package/cjs/rules/require-deprecation-reason.js +80 -46
  85. package/{typings → cjs}/rules/require-description.d.ts +13 -5
  86. package/cjs/rules/require-description.js +170 -132
  87. package/cjs/rules/require-field-of-type-query-in-mutation-result.d.ts +12 -0
  88. package/cjs/rules/require-field-of-type-query-in-mutation-result.js +81 -51
  89. package/{typings → cjs}/rules/require-id-when-available.d.ts +12 -4
  90. package/cjs/rules/require-id-when-available.js +196 -173
  91. package/cjs/rules/require-import-fragment.d.ts +12 -0
  92. package/cjs/rules/require-import-fragment.js +138 -88
  93. package/cjs/rules/require-nullable-fields-with-oneof.d.ts +12 -0
  94. package/cjs/rules/require-nullable-fields-with-oneof.js +80 -50
  95. package/cjs/rules/require-nullable-result-in-root.d.ts +12 -0
  96. package/cjs/rules/require-nullable-result-in-root.js +97 -68
  97. package/cjs/rules/require-type-pattern-with-oneof.d.ts +12 -0
  98. package/cjs/rules/require-type-pattern-with-oneof.js +70 -42
  99. package/{typings → cjs}/rules/selection-set-depth.d.ts +12 -4
  100. package/cjs/rules/selection-set-depth.js +147 -107
  101. package/{typings → cjs}/rules/strict-id-in-types.d.ts +12 -4
  102. package/cjs/rules/strict-id-in-types.js +143 -122
  103. package/cjs/rules/unique-fragment-name.d.ts +13 -0
  104. package/cjs/rules/unique-fragment-name.js +88 -62
  105. package/cjs/rules/unique-operation-name.d.ts +12 -0
  106. package/cjs/rules/unique-operation-name.js +65 -35
  107. package/cjs/schema.d.ts +12 -0
  108. package/cjs/schema.js +62 -30
  109. package/cjs/siblings.d.ts +8 -0
  110. package/cjs/siblings.js +124 -106
  111. package/cjs/testkit.d.ts +8 -0
  112. package/cjs/testkit.js +165 -144
  113. package/cjs/types-e3367e3c.d.ts +129 -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 +181 -124
  118. package/{typings/cache.d.cts → esm/cache.d.mts} +3 -1
  119. package/esm/cache.js +25 -23
  120. package/{typings/configs/index.d.cts → esm/configs/index.d.mts} +3 -1
  121. package/esm/configs/index.js +14 -11
  122. package/{typings/configs/operations-all.d.cts → esm/configs/operations-all.d.mts} +2 -1
  123. package/esm/configs/operations-all.js +28 -28
  124. package/{typings/configs/operations-recommended.d.cts → esm/configs/operations-recommended.d.mts} +2 -1
  125. package/esm/configs/operations-recommended.js +53 -53
  126. package/{typings/configs/relay.d.cts → esm/configs/relay.d.mts} +2 -1
  127. package/esm/configs/relay.js +12 -9
  128. package/{typings/configs/schema-all.d.cts → esm/configs/schema-all.d.mts} +2 -1
  129. package/esm/configs/schema-all.js +22 -22
  130. package/{typings/configs/schema-recommended.d.cts → esm/configs/schema-recommended.d.mts} +2 -1
  131. package/esm/configs/schema-recommended.js +49 -49
  132. package/{typings/documents.d.cts → esm/documents.d.mts} +4 -1
  133. package/esm/documents.js +41 -39
  134. package/esm/estree-converter/converter.d.mts +8 -0
  135. package/esm/estree-converter/converter.js +63 -57
  136. package/esm/estree-converter/index.d.mts +8 -0
  137. package/esm/estree-converter/index.js +3 -3
  138. package/{typings/estree-converter/types.d.cts → esm/estree-converter/types.d.mts} +7 -5
  139. package/esm/estree-converter/utils.d.mts +18 -0
  140. package/esm/estree-converter/utils.js +102 -93
  141. package/{typings/flat-configs.d.cts → esm/flat-configs.d.mts} +13 -2
  142. package/esm/flat-configs.js +33 -30
  143. package/esm/graphql-config.d.mts +13 -0
  144. package/esm/graphql-config.js +49 -44
  145. package/esm/index.d.mts +22 -0
  146. package/esm/index.js +18 -9
  147. package/esm/package.json +1 -1
  148. package/esm/parser.d.mts +12 -0
  149. package/esm/parser.js +64 -73
  150. package/esm/processor.d.mts +9 -0
  151. package/esm/processor.js +98 -86
  152. package/{typings/rules/alphabetize.d.cts → esm/rules/alphabetize.d.mts} +12 -4
  153. package/esm/rules/alphabetize.js +304 -290
  154. package/{typings/rules/description-style.d.cts → esm/rules/description-style.d.mts} +12 -4
  155. package/esm/rules/description-style.js +73 -64
  156. package/esm/rules/graphql-js-validation.d.mts +12 -0
  157. package/esm/rules/graphql-js-validation.js +580 -429
  158. package/esm/rules/index.d.mts +125 -0
  159. package/esm/rules/index.js +74 -74
  160. package/{typings/rules/input-name.d.cts → esm/rules/input-name.d.mts} +12 -4
  161. package/esm/rules/input-name.js +132 -121
  162. package/{typings/rules/lone-executable-definition.d.cts → esm/rules/lone-executable-definition.d.mts} +12 -4
  163. package/esm/rules/lone-executable-definition.js +78 -70
  164. package/{typings/rules/match-document-filename.d.cts → esm/rules/match-document-filename.d.mts} +14 -6
  165. package/esm/rules/match-document-filename.js +210 -180
  166. package/{typings/rules/naming-convention.d.cts → esm/rules/naming-convention.d.mts} +12 -4
  167. package/esm/rules/naming-convention.js +363 -314
  168. package/esm/rules/no-anonymous-operations.d.mts +12 -0
  169. package/esm/rules/no-anonymous-operations.js +65 -55
  170. package/esm/rules/no-case-insensitive-enum-values-duplicates.d.mts +12 -0
  171. package/esm/rules/no-case-insensitive-enum-values-duplicates.js +59 -48
  172. package/esm/rules/no-deprecated.d.mts +12 -0
  173. package/esm/rules/no-deprecated.js +83 -73
  174. package/esm/rules/no-duplicate-fields.d.mts +12 -0
  175. package/esm/rules/no-duplicate-fields.js +93 -80
  176. package/esm/rules/no-hashtag-description.d.mts +13 -0
  177. package/esm/rules/no-hashtag-description.js +95 -80
  178. package/esm/rules/no-one-place-fragments.d.mts +12 -0
  179. package/esm/rules/no-one-place-fragments.js +65 -56
  180. package/{typings/rules/no-root-type.d.cts → esm/rules/no-root-type.d.mts} +12 -4
  181. package/esm/rules/no-root-type.js +78 -72
  182. package/esm/rules/no-scalar-result-type-on-mutation.d.mts +12 -0
  183. package/esm/rules/no-scalar-result-type-on-mutation.js +67 -58
  184. package/esm/rules/no-typename-prefix.d.mts +12 -0
  185. package/esm/rules/no-typename-prefix.js +65 -53
  186. package/esm/rules/no-unreachable-types.d.mts +12 -0
  187. package/esm/rules/no-unreachable-types.js +141 -131
  188. package/esm/rules/no-unused-fields.d.mts +12 -0
  189. package/esm/rules/no-unused-fields.js +94 -90
  190. package/{typings/rules/relay-arguments.d.cts → esm/rules/relay-arguments.d.mts} +12 -4
  191. package/esm/rules/relay-arguments.js +113 -108
  192. package/esm/rules/relay-connection-types.d.mts +13 -0
  193. package/esm/rules/relay-connection-types.js +98 -91
  194. package/{typings/rules/relay-edge-types.d.cts → esm/rules/relay-edge-types.d.mts} +12 -4
  195. package/esm/rules/relay-edge-types.js +178 -177
  196. package/esm/rules/relay-page-info.d.mts +12 -0
  197. package/esm/rules/relay-page-info.js +84 -86
  198. package/{typings/rules/require-deprecation-date.d.cts → esm/rules/require-deprecation-date.d.mts} +12 -4
  199. package/esm/rules/require-deprecation-date.js +120 -110
  200. package/esm/rules/require-deprecation-reason.d.mts +12 -0
  201. package/esm/rules/require-deprecation-reason.js +57 -44
  202. package/{typings/rules/require-description.d.cts → esm/rules/require-description.d.mts} +13 -5
  203. package/esm/rules/require-description.js +151 -130
  204. package/esm/rules/require-field-of-type-query-in-mutation-result.d.mts +12 -0
  205. package/esm/rules/require-field-of-type-query-in-mutation-result.js +58 -49
  206. package/{typings/rules/require-id-when-available.d.cts → esm/rules/require-id-when-available.d.mts} +12 -4
  207. package/esm/rules/require-id-when-available.js +186 -171
  208. package/esm/rules/require-import-fragment.d.mts +12 -0
  209. package/esm/rules/require-import-fragment.js +105 -85
  210. package/esm/rules/require-nullable-fields-with-oneof.d.mts +12 -0
  211. package/esm/rules/require-nullable-fields-with-oneof.js +57 -48
  212. package/esm/rules/require-nullable-result-in-root.d.mts +12 -0
  213. package/esm/rules/require-nullable-result-in-root.js +74 -66
  214. package/esm/rules/require-type-pattern-with-oneof.d.mts +12 -0
  215. package/esm/rules/require-type-pattern-with-oneof.js +47 -40
  216. package/{typings/rules/selection-set-depth.d.cts → esm/rules/selection-set-depth.d.mts} +12 -4
  217. package/esm/rules/selection-set-depth.js +114 -104
  218. package/{typings/rules/strict-id-in-types.d.cts → esm/rules/strict-id-in-types.d.mts} +12 -4
  219. package/esm/rules/strict-id-in-types.js +125 -119
  220. package/esm/rules/unique-fragment-name.d.mts +13 -0
  221. package/esm/rules/unique-fragment-name.js +65 -60
  222. package/esm/rules/unique-operation-name.d.mts +12 -0
  223. package/esm/rules/unique-operation-name.js +42 -33
  224. package/esm/schema.d.mts +12 -0
  225. package/esm/schema.js +29 -26
  226. package/esm/siblings.d.mts +8 -0
  227. package/esm/siblings.js +105 -104
  228. package/esm/testkit.d.mts +8 -0
  229. package/esm/testkit.js +132 -141
  230. package/esm/types-2e1afd7c.d.ts +129 -0
  231. package/esm/types.d.mts +8 -0
  232. package/esm/utils.d.mts +44 -0
  233. package/esm/utils.js +138 -116
  234. package/package.json +40 -30
  235. package/typings/estree-converter/converter.d.cts +0 -3
  236. package/typings/estree-converter/converter.d.ts +0 -3
  237. package/typings/estree-converter/index.d.cts +0 -3
  238. package/typings/estree-converter/index.d.ts +0 -3
  239. package/typings/estree-converter/utils.d.cts +0 -13
  240. package/typings/estree-converter/utils.d.ts +0 -13
  241. package/typings/graphql-config.d.cts +0 -4
  242. package/typings/graphql-config.d.ts +0 -4
  243. package/typings/index.d.cts +0 -10
  244. package/typings/index.d.ts +0 -10
  245. package/typings/parser.d.cts +0 -2
  246. package/typings/parser.d.ts +0 -2
  247. package/typings/processor.d.cts +0 -6
  248. package/typings/processor.d.ts +0 -6
  249. package/typings/rules/graphql-js-validation.d.cts +0 -2
  250. package/typings/rules/graphql-js-validation.d.ts +0 -2
  251. package/typings/rules/index.d.cts +0 -111
  252. package/typings/rules/index.d.ts +0 -111
  253. package/typings/rules/no-anonymous-operations.d.cts +0 -2
  254. package/typings/rules/no-anonymous-operations.d.ts +0 -2
  255. package/typings/rules/no-case-insensitive-enum-values-duplicates.d.cts +0 -2
  256. package/typings/rules/no-case-insensitive-enum-values-duplicates.d.ts +0 -2
  257. package/typings/rules/no-deprecated.d.cts +0 -2
  258. package/typings/rules/no-deprecated.d.ts +0 -2
  259. package/typings/rules/no-duplicate-fields.d.cts +0 -2
  260. package/typings/rules/no-duplicate-fields.d.ts +0 -2
  261. package/typings/rules/no-hashtag-description.d.cts +0 -3
  262. package/typings/rules/no-hashtag-description.d.ts +0 -3
  263. package/typings/rules/no-one-place-fragments.d.cts +0 -2
  264. package/typings/rules/no-one-place-fragments.d.ts +0 -2
  265. package/typings/rules/no-scalar-result-type-on-mutation.d.cts +0 -2
  266. package/typings/rules/no-scalar-result-type-on-mutation.d.ts +0 -2
  267. package/typings/rules/no-typename-prefix.d.cts +0 -2
  268. package/typings/rules/no-typename-prefix.d.ts +0 -2
  269. package/typings/rules/no-unreachable-types.d.cts +0 -2
  270. package/typings/rules/no-unreachable-types.d.ts +0 -2
  271. package/typings/rules/no-unused-fields.d.cts +0 -2
  272. package/typings/rules/no-unused-fields.d.ts +0 -2
  273. package/typings/rules/relay-connection-types.d.cts +0 -4
  274. package/typings/rules/relay-connection-types.d.ts +0 -4
  275. package/typings/rules/relay-page-info.d.cts +0 -2
  276. package/typings/rules/relay-page-info.d.ts +0 -2
  277. package/typings/rules/require-deprecation-reason.d.cts +0 -2
  278. package/typings/rules/require-deprecation-reason.d.ts +0 -2
  279. package/typings/rules/require-field-of-type-query-in-mutation-result.d.cts +0 -2
  280. package/typings/rules/require-field-of-type-query-in-mutation-result.d.ts +0 -2
  281. package/typings/rules/require-import-fragment.d.cts +0 -2
  282. package/typings/rules/require-import-fragment.d.ts +0 -2
  283. package/typings/rules/require-nullable-fields-with-oneof.d.cts +0 -2
  284. package/typings/rules/require-nullable-fields-with-oneof.d.ts +0 -2
  285. package/typings/rules/require-nullable-result-in-root.d.cts +0 -2
  286. package/typings/rules/require-nullable-result-in-root.d.ts +0 -2
  287. package/typings/rules/require-type-pattern-with-oneof.d.cts +0 -2
  288. package/typings/rules/require-type-pattern-with-oneof.d.ts +0 -2
  289. package/typings/rules/unique-fragment-name.d.cts +0 -5
  290. package/typings/rules/unique-fragment-name.d.ts +0 -5
  291. package/typings/rules/unique-operation-name.d.cts +0 -2
  292. package/typings/rules/unique-operation-name.d.ts +0 -2
  293. package/typings/schema.d.cts +0 -3
  294. package/typings/schema.d.ts +0 -3
  295. package/typings/siblings.d.cts +0 -22
  296. package/typings/siblings.d.ts +0 -22
  297. package/typings/testkit.d.cts +0 -29
  298. package/typings/testkit.d.ts +0 -29
  299. package/typings/types.d.cts +0 -83
  300. package/typings/types.d.ts +0 -83
  301. package/typings/utils.d.cts +0 -40
  302. package/typings/utils.d.ts +0 -40
@@ -1,189 +1,190 @@
1
- import { getDocumentNodeFromSchema } from '@graphql-tools/utils';
2
- import { isObjectType, isScalarType, Kind, visit, } from 'graphql';
3
- import { getTypeName, requireGraphQLSchemaFromContext } from '../utils.js';
4
- const RULE_ID = 'relay-edge-types';
5
- const MESSAGE_MUST_BE_OBJECT_TYPE = 'MESSAGE_MUST_BE_OBJECT_TYPE';
6
- const MESSAGE_MISSING_EDGE_SUFFIX = 'MESSAGE_MISSING_EDGE_SUFFIX';
7
- const MESSAGE_LIST_TYPE_ONLY_EDGE_TYPE = 'MESSAGE_LIST_TYPE_ONLY_EDGE_TYPE';
8
- const MESSAGE_SHOULD_IMPLEMENTS_NODE = 'MESSAGE_SHOULD_IMPLEMENTS_NODE';
1
+ import { getDocumentNodeFromSchema } from "@graphql-tools/utils";
2
+ import {
3
+ isObjectType,
4
+ isScalarType,
5
+ Kind,
6
+ visit
7
+ } from "graphql";
8
+ import { getTypeName, requireGraphQLSchemaFromContext } from "../utils.js";
9
+ const RULE_ID = "relay-edge-types";
10
+ const MESSAGE_MUST_BE_OBJECT_TYPE = "MESSAGE_MUST_BE_OBJECT_TYPE";
11
+ const MESSAGE_MISSING_EDGE_SUFFIX = "MESSAGE_MISSING_EDGE_SUFFIX";
12
+ const MESSAGE_LIST_TYPE_ONLY_EDGE_TYPE = "MESSAGE_LIST_TYPE_ONLY_EDGE_TYPE";
13
+ const MESSAGE_SHOULD_IMPLEMENTS_NODE = "MESSAGE_SHOULD_IMPLEMENTS_NODE";
9
14
  let edgeTypesCache;
10
- function getEdgeTypes(schema) {
11
- // We don't want cache edgeTypes on test environment
12
- // Otherwise edgeTypes will be same for all tests
13
- if (process.env.NODE_ENV !== 'test' && edgeTypesCache) {
14
- return edgeTypesCache;
15
- }
16
- const edgeTypes = new Set();
17
- const visitor = {
18
- ObjectTypeDefinition(node) {
19
- var _a;
20
- const typeName = node.name.value;
21
- const hasConnectionSuffix = typeName.endsWith('Connection');
22
- if (!hasConnectionSuffix) {
23
- return;
24
- }
25
- const edges = (_a = node.fields) === null || _a === void 0 ? void 0 : _a.find(field => field.name.value === 'edges');
26
- if (edges) {
27
- const edgesTypeName = getTypeName(edges);
28
- const edgesType = schema.getType(edgesTypeName);
29
- if (isObjectType(edgesType)) {
30
- edgeTypes.add(edgesTypeName);
31
- }
32
- }
33
- },
34
- };
35
- const astNode = getDocumentNodeFromSchema(schema); // Transforms the schema into ASTNode
36
- visit(astNode, visitor);
37
- edgeTypesCache = edgeTypes;
15
+ function getEdgeTypes(schema2) {
16
+ if (process.env.NODE_ENV !== "test" && edgeTypesCache) {
38
17
  return edgeTypesCache;
18
+ }
19
+ const edgeTypes = /* @__PURE__ */ new Set();
20
+ const visitor = {
21
+ ObjectTypeDefinition(node) {
22
+ const typeName = node.name.value;
23
+ const hasConnectionSuffix = typeName.endsWith("Connection");
24
+ if (!hasConnectionSuffix) {
25
+ return;
26
+ }
27
+ const edges = node.fields?.find((field) => field.name.value === "edges");
28
+ if (edges) {
29
+ const edgesTypeName = getTypeName(edges);
30
+ const edgesType = schema2.getType(edgesTypeName);
31
+ if (isObjectType(edgesType)) {
32
+ edgeTypes.add(edgesTypeName);
33
+ }
34
+ }
35
+ }
36
+ };
37
+ const astNode = getDocumentNodeFromSchema(schema2);
38
+ visit(astNode, visitor);
39
+ edgeTypesCache = edgeTypes;
40
+ return edgeTypesCache;
39
41
  }
40
42
  const schema = {
41
- type: 'array',
42
- maxItems: 1,
43
- items: {
44
- type: 'object',
45
- additionalProperties: false,
46
- minProperties: 1,
47
- properties: {
48
- withEdgeSuffix: {
49
- type: 'boolean',
50
- default: true,
51
- description: 'Edge type name must end in "Edge".',
52
- },
53
- shouldImplementNode: {
54
- type: 'boolean',
55
- default: true,
56
- description: "Edge type's field `node` must implement `Node` interface.",
57
- },
58
- listTypeCanWrapOnlyEdgeType: {
59
- type: 'boolean',
60
- default: true,
61
- description: 'A list type should only wrap an edge type.',
62
- },
63
- },
64
- },
43
+ type: "array",
44
+ maxItems: 1,
45
+ items: {
46
+ type: "object",
47
+ additionalProperties: false,
48
+ minProperties: 1,
49
+ properties: {
50
+ withEdgeSuffix: {
51
+ type: "boolean",
52
+ default: true,
53
+ description: 'Edge type name must end in "Edge".'
54
+ },
55
+ shouldImplementNode: {
56
+ type: "boolean",
57
+ default: true,
58
+ description: "Edge type's field `node` must implement `Node` interface."
59
+ },
60
+ listTypeCanWrapOnlyEdgeType: {
61
+ type: "boolean",
62
+ default: true,
63
+ description: "A list type should only wrap an edge type."
64
+ }
65
+ }
66
+ }
65
67
  };
66
- export const rule = {
67
- meta: {
68
- type: 'problem',
69
- docs: {
70
- category: 'Schema',
71
- description: [
72
- 'Set of rules to follow Relay specification for Edge types.',
73
- '',
74
- "- A type that is returned in list form by a connection type's `edges` field is considered by this spec to be an Edge type",
75
- '- Edge type must be an Object type',
76
- '- Edge type must contain a field `node` that return either Scalar, Enum, Object, Interface, Union, or a non-null wrapper around one of those types. Notably, this field cannot return a list',
77
- '- Edge type must contain a field `cursor` that return either String, Scalar, or a non-null wrapper around one of those types',
78
- '- Edge type name must end in "Edge" _(optional)_',
79
- "- Edge type's field `node` must implement `Node` interface _(optional)_",
80
- '- A list type should only wrap an edge type _(optional)_',
81
- ].join('\n'),
82
- url: `https://the-guild.dev/graphql/eslint/rules/${RULE_ID}`,
83
- isDisabledForAllConfig: true,
84
- requiresSchema: true,
85
- examples: [
86
- {
87
- title: 'Correct',
88
- code: /* GraphQL */ `
68
+ const rule = {
69
+ meta: {
70
+ type: "problem",
71
+ docs: {
72
+ category: "Schema",
73
+ description: [
74
+ "Set of rules to follow Relay specification for Edge types.",
75
+ "",
76
+ "- A type that is returned in list form by a connection type's `edges` field is considered by this spec to be an Edge type",
77
+ "- Edge type must be an Object type",
78
+ "- Edge type must contain a field `node` that return either Scalar, Enum, Object, Interface, Union, or a non-null wrapper around one of those types. Notably, this field cannot return a list",
79
+ "- Edge type must contain a field `cursor` that return either String, Scalar, or a non-null wrapper around one of those types",
80
+ '- Edge type name must end in "Edge" _(optional)_',
81
+ "- Edge type's field `node` must implement `Node` interface _(optional)_",
82
+ "- A list type should only wrap an edge type _(optional)_"
83
+ ].join("\n"),
84
+ url: `https://the-guild.dev/graphql/eslint/rules/${RULE_ID}`,
85
+ isDisabledForAllConfig: true,
86
+ requiresSchema: true,
87
+ examples: [
88
+ {
89
+ title: "Correct",
90
+ code: (
91
+ /* GraphQL */
92
+ `
89
93
  type UserConnection {
90
94
  edges: [UserEdge]
91
95
  pageInfo: PageInfo!
92
96
  }
93
- `,
94
- },
95
- ],
96
- },
97
- messages: {
98
- [MESSAGE_MUST_BE_OBJECT_TYPE]: 'Edge type must be an Object type.',
99
- [MESSAGE_MISSING_EDGE_SUFFIX]: 'Edge type must have "Edge" suffix.',
100
- [MESSAGE_LIST_TYPE_ONLY_EDGE_TYPE]: 'A list type should only wrap an edge type.',
101
- [MESSAGE_SHOULD_IMPLEMENTS_NODE]: "Edge type's field `node` must implement `Node` interface.",
102
- },
103
- schema,
104
- },
105
- create(context) {
106
- const schema = requireGraphQLSchemaFromContext(RULE_ID, context);
107
- const edgeTypes = getEdgeTypes(schema);
108
- const options = {
109
- withEdgeSuffix: true,
110
- shouldImplementNode: true,
111
- listTypeCanWrapOnlyEdgeType: true,
112
- ...context.options[0],
113
- };
114
- const isNamedOrNonNullNamed = (node) => node.kind === Kind.NAMED_TYPE ||
115
- (node.kind === Kind.NON_NULL_TYPE && node.gqlType.kind === Kind.NAMED_TYPE);
116
- const checkNodeField = (node) => {
117
- var _a, _b;
118
- const nodeField = (_a = node.fields) === null || _a === void 0 ? void 0 : _a.find(field => field.name.value === 'node');
119
- const message = 'return either a Scalar, Enum, Object, Interface, Union, or a non-null wrapper around one of those types.';
120
- if (!nodeField) {
121
- context.report({
122
- node: node.name,
123
- message: `Edge type must contain a field \`node\` that ${message}`,
124
- });
125
- }
126
- else if (!isNamedOrNonNullNamed(nodeField.gqlType)) {
127
- context.report({ node: nodeField.name, message: `Field \`node\` must ${message}` });
128
- }
129
- else if (options.shouldImplementNode) {
130
- const nodeReturnTypeName = getTypeName(nodeField.gqlType.rawNode());
131
- const type = schema.getType(nodeReturnTypeName);
132
- if (!isObjectType(type)) {
133
- return;
134
- }
135
- const implementsNode = (_b = type.astNode.interfaces) === null || _b === void 0 ? void 0 : _b.some(n => n.name.value === 'Node');
136
- if (!implementsNode) {
137
- context.report({ node: node.name, messageId: MESSAGE_SHOULD_IMPLEMENTS_NODE });
138
- }
139
- }
140
- };
141
- const checkCursorField = (node) => {
142
- var _a;
143
- const cursorField = (_a = node.fields) === null || _a === void 0 ? void 0 : _a.find(field => field.name.value === 'cursor');
144
- const message = 'return either a String, Scalar, or a non-null wrapper wrapper around one of those types.';
145
- if (!cursorField) {
146
- context.report({
147
- node: node.name,
148
- message: `Edge type must contain a field \`cursor\` that ${message}`,
149
- });
150
- return;
151
- }
152
- const typeName = getTypeName(cursorField.rawNode());
153
- if (!isNamedOrNonNullNamed(cursorField.gqlType) ||
154
- (typeName !== 'String' && !isScalarType(schema.getType(typeName)))) {
155
- context.report({ node: cursorField.name, message: `Field \`cursor\` must ${message}` });
156
- }
157
- };
158
- const listeners = {
159
- ':matches(ObjectTypeDefinition, ObjectTypeExtension)[name.value=/Connection$/] > FieldDefinition[name.value=edges] > .gqlType Name'(node) {
160
- const type = schema.getType(node.value);
161
- if (!isObjectType(type)) {
162
- context.report({ node, messageId: MESSAGE_MUST_BE_OBJECT_TYPE });
163
- }
164
- },
165
- ':matches(ObjectTypeDefinition, ObjectTypeExtension)'(node) {
166
- const typeName = node.name.value;
167
- if (edgeTypes.has(typeName)) {
168
- checkNodeField(node);
169
- checkCursorField(node);
170
- if (options.withEdgeSuffix && !typeName.endsWith('Edge')) {
171
- context.report({ node: node.name, messageId: MESSAGE_MISSING_EDGE_SUFFIX });
172
- }
173
- }
174
- },
175
- };
176
- if (options.listTypeCanWrapOnlyEdgeType) {
177
- listeners['FieldDefinition > .gqlType'] = (node) => {
178
- if (node.kind === Kind.LIST_TYPE ||
179
- (node.kind === Kind.NON_NULL_TYPE && node.gqlType.kind === Kind.LIST_TYPE)) {
180
- const typeName = getTypeName(node.rawNode());
181
- if (!edgeTypes.has(typeName)) {
182
- context.report({ node, messageId: MESSAGE_LIST_TYPE_ONLY_EDGE_TYPE });
183
- }
184
- }
185
- };
97
+ `
98
+ )
186
99
  }
187
- return listeners;
100
+ ]
101
+ },
102
+ messages: {
103
+ [MESSAGE_MUST_BE_OBJECT_TYPE]: "Edge type must be an Object type.",
104
+ [MESSAGE_MISSING_EDGE_SUFFIX]: 'Edge type must have "Edge" suffix.',
105
+ [MESSAGE_LIST_TYPE_ONLY_EDGE_TYPE]: "A list type should only wrap an edge type.",
106
+ [MESSAGE_SHOULD_IMPLEMENTS_NODE]: "Edge type's field `node` must implement `Node` interface."
188
107
  },
108
+ schema
109
+ },
110
+ create(context) {
111
+ const schema2 = requireGraphQLSchemaFromContext(RULE_ID, context);
112
+ const edgeTypes = getEdgeTypes(schema2);
113
+ const options = {
114
+ withEdgeSuffix: true,
115
+ shouldImplementNode: true,
116
+ listTypeCanWrapOnlyEdgeType: true,
117
+ ...context.options[0]
118
+ };
119
+ const isNamedOrNonNullNamed = (node) => node.kind === Kind.NAMED_TYPE || node.kind === Kind.NON_NULL_TYPE && node.gqlType.kind === Kind.NAMED_TYPE;
120
+ const checkNodeField = (node) => {
121
+ const nodeField = node.fields?.find((field) => field.name.value === "node");
122
+ const message = "return either a Scalar, Enum, Object, Interface, Union, or a non-null wrapper around one of those types.";
123
+ if (!nodeField) {
124
+ context.report({
125
+ node: node.name,
126
+ message: `Edge type must contain a field \`node\` that ${message}`
127
+ });
128
+ } else if (!isNamedOrNonNullNamed(nodeField.gqlType)) {
129
+ context.report({ node: nodeField.name, message: `Field \`node\` must ${message}` });
130
+ } else if (options.shouldImplementNode) {
131
+ const nodeReturnTypeName = getTypeName(nodeField.gqlType.rawNode());
132
+ const type = schema2.getType(nodeReturnTypeName);
133
+ if (!isObjectType(type)) {
134
+ return;
135
+ }
136
+ const implementsNode = type.astNode.interfaces?.some((n) => n.name.value === "Node");
137
+ if (!implementsNode) {
138
+ context.report({ node: node.name, messageId: MESSAGE_SHOULD_IMPLEMENTS_NODE });
139
+ }
140
+ }
141
+ };
142
+ const checkCursorField = (node) => {
143
+ const cursorField = node.fields?.find((field) => field.name.value === "cursor");
144
+ const message = "return either a String, Scalar, or a non-null wrapper wrapper around one of those types.";
145
+ if (!cursorField) {
146
+ context.report({
147
+ node: node.name,
148
+ message: `Edge type must contain a field \`cursor\` that ${message}`
149
+ });
150
+ return;
151
+ }
152
+ const typeName = getTypeName(cursorField.rawNode());
153
+ if (!isNamedOrNonNullNamed(cursorField.gqlType) || typeName !== "String" && !isScalarType(schema2.getType(typeName))) {
154
+ context.report({ node: cursorField.name, message: `Field \`cursor\` must ${message}` });
155
+ }
156
+ };
157
+ const listeners = {
158
+ ":matches(ObjectTypeDefinition, ObjectTypeExtension)[name.value=/Connection$/] > FieldDefinition[name.value=edges] > .gqlType Name"(node) {
159
+ const type = schema2.getType(node.value);
160
+ if (!isObjectType(type)) {
161
+ context.report({ node, messageId: MESSAGE_MUST_BE_OBJECT_TYPE });
162
+ }
163
+ },
164
+ ":matches(ObjectTypeDefinition, ObjectTypeExtension)"(node) {
165
+ const typeName = node.name.value;
166
+ if (edgeTypes.has(typeName)) {
167
+ checkNodeField(node);
168
+ checkCursorField(node);
169
+ if (options.withEdgeSuffix && !typeName.endsWith("Edge")) {
170
+ context.report({ node: node.name, messageId: MESSAGE_MISSING_EDGE_SUFFIX });
171
+ }
172
+ }
173
+ }
174
+ };
175
+ if (options.listTypeCanWrapOnlyEdgeType) {
176
+ listeners["FieldDefinition > .gqlType"] = (node) => {
177
+ if (node.kind === Kind.LIST_TYPE || node.kind === Kind.NON_NULL_TYPE && node.gqlType.kind === Kind.LIST_TYPE) {
178
+ const typeName = getTypeName(node.rawNode());
179
+ if (!edgeTypes.has(typeName)) {
180
+ context.report({ node, messageId: MESSAGE_LIST_TYPE_ONLY_EDGE_TYPE });
181
+ }
182
+ }
183
+ };
184
+ }
185
+ return listeners;
186
+ }
187
+ };
188
+ export {
189
+ rule
189
190
  };
@@ -0,0 +1,12 @@
1
+ import { i as GraphQLESLintRule } from '../types-2e1afd7c.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 };
@@ -1,98 +1,96 @@
1
- import { isScalarType, Kind } from 'graphql';
2
- import { REPORT_ON_FIRST_CHARACTER, requireGraphQLSchemaFromContext } from '../utils.js';
3
- import { NON_OBJECT_TYPES } from './relay-connection-types.js';
4
- const RULE_ID = 'relay-page-info';
5
- const MESSAGE_MUST_EXIST = 'MESSAGE_MUST_EXIST';
6
- const MESSAGE_MUST_BE_OBJECT_TYPE = 'MESSAGE_MUST_BE_OBJECT_TYPE';
1
+ import { isScalarType, Kind } from "graphql";
2
+ import { REPORT_ON_FIRST_CHARACTER, requireGraphQLSchemaFromContext } from "../utils.js";
3
+ import { NON_OBJECT_TYPES } from "./relay-connection-types.js";
4
+ const RULE_ID = "relay-page-info";
5
+ const MESSAGE_MUST_EXIST = "MESSAGE_MUST_EXIST";
6
+ const MESSAGE_MUST_BE_OBJECT_TYPE = "MESSAGE_MUST_BE_OBJECT_TYPE";
7
7
  const notPageInfoTypesSelector = `:matches(${NON_OBJECT_TYPES})[name.value=PageInfo] > .name`;
8
8
  let hasPageInfoChecked = false;
9
- export const rule = {
10
- meta: {
11
- type: 'problem',
12
- docs: {
13
- category: 'Schema',
14
- description: [
15
- 'Set of rules to follow Relay specification for `PageInfo` object.',
16
- '',
17
- '- `PageInfo` must be an Object type',
18
- '- `PageInfo` must contain fields `hasPreviousPage` and `hasNextPage`, that return non-null Boolean',
19
- '- `PageInfo` must contain fields `startCursor` and `endCursor`, that return either String or Scalar, which can be null if there are no results',
20
- ].join('\n'),
21
- url: `https://the-guild.dev/graphql/eslint/rules/${RULE_ID}`,
22
- examples: [
23
- {
24
- title: 'Correct',
25
- code: /* GraphQL */ `
9
+ const rule = {
10
+ meta: {
11
+ type: "problem",
12
+ docs: {
13
+ category: "Schema",
14
+ description: [
15
+ "Set of rules to follow Relay specification for `PageInfo` object.",
16
+ "",
17
+ "- `PageInfo` must be an Object type",
18
+ "- `PageInfo` must contain fields `hasPreviousPage` and `hasNextPage`, that return non-null Boolean",
19
+ "- `PageInfo` must contain fields `startCursor` and `endCursor`, that return either String or Scalar, which can be null if there are no results"
20
+ ].join("\n"),
21
+ url: `https://the-guild.dev/graphql/eslint/rules/${RULE_ID}`,
22
+ examples: [
23
+ {
24
+ title: "Correct",
25
+ code: (
26
+ /* GraphQL */
27
+ `
26
28
  type PageInfo {
27
29
  hasPreviousPage: Boolean!
28
30
  hasNextPage: Boolean!
29
31
  startCursor: String
30
32
  endCursor: String
31
33
  }
32
- `,
33
- },
34
- ],
35
- isDisabledForAllConfig: true,
36
- requiresSchema: true,
37
- },
38
- messages: {
39
- [MESSAGE_MUST_EXIST]: 'The server must provide a `PageInfo` object.',
40
- [MESSAGE_MUST_BE_OBJECT_TYPE]: '`PageInfo` must be an Object type.',
41
- },
42
- schema: [],
34
+ `
35
+ )
36
+ }
37
+ ],
38
+ isDisabledForAllConfig: true,
39
+ requiresSchema: true
40
+ },
41
+ messages: {
42
+ [MESSAGE_MUST_EXIST]: "The server must provide a `PageInfo` object.",
43
+ [MESSAGE_MUST_BE_OBJECT_TYPE]: "`PageInfo` must be an Object type."
43
44
  },
44
- create(context) {
45
- const schema = requireGraphQLSchemaFromContext(RULE_ID, context);
46
- if (process.env.NODE_ENV === 'test' || !hasPageInfoChecked) {
47
- const pageInfoType = schema.getType('PageInfo');
48
- if (!pageInfoType) {
49
- context.report({
50
- loc: REPORT_ON_FIRST_CHARACTER,
51
- messageId: MESSAGE_MUST_EXIST,
52
- });
45
+ schema: []
46
+ },
47
+ create(context) {
48
+ const schema = requireGraphQLSchemaFromContext(RULE_ID, context);
49
+ if (process.env.NODE_ENV === "test" || !hasPageInfoChecked) {
50
+ const pageInfoType = schema.getType("PageInfo");
51
+ if (!pageInfoType) {
52
+ context.report({
53
+ loc: REPORT_ON_FIRST_CHARACTER,
54
+ messageId: MESSAGE_MUST_EXIST
55
+ });
56
+ }
57
+ hasPageInfoChecked = true;
58
+ }
59
+ return {
60
+ [notPageInfoTypesSelector](node) {
61
+ context.report({ node, messageId: MESSAGE_MUST_BE_OBJECT_TYPE });
62
+ },
63
+ "ObjectTypeDefinition[name.value=PageInfo]"(node) {
64
+ const fieldMap = Object.fromEntries(
65
+ node.fields?.map((field) => [field.name.value, field]) || []
66
+ );
67
+ const checkField = (fieldName, typeName) => {
68
+ const field = fieldMap[fieldName];
69
+ let isAllowedType = false;
70
+ if (field) {
71
+ const type = field.gqlType;
72
+ if (typeName === "Boolean") {
73
+ isAllowedType = type.kind === Kind.NON_NULL_TYPE && type.gqlType.kind === Kind.NAMED_TYPE && type.gqlType.name.value === "Boolean";
74
+ } else if (type.kind === Kind.NAMED_TYPE) {
75
+ isAllowedType = type.name.value === "String" || isScalarType(schema.getType(type.name.value));
53
76
  }
54
- hasPageInfoChecked = true;
55
- }
56
- return {
57
- [notPageInfoTypesSelector](node) {
58
- context.report({ node, messageId: MESSAGE_MUST_BE_OBJECT_TYPE });
59
- },
60
- 'ObjectTypeDefinition[name.value=PageInfo]'(node) {
61
- var _a;
62
- const fieldMap = Object.fromEntries(((_a = node.fields) === null || _a === void 0 ? void 0 : _a.map(field => [field.name.value, field])) || []);
63
- const checkField = (fieldName, typeName) => {
64
- const field = fieldMap[fieldName];
65
- let isAllowedType = false;
66
- if (field) {
67
- const type = field.gqlType;
68
- if (typeName === 'Boolean') {
69
- isAllowedType =
70
- type.kind === Kind.NON_NULL_TYPE &&
71
- type.gqlType.kind === Kind.NAMED_TYPE &&
72
- type.gqlType.name.value === 'Boolean';
73
- }
74
- else if (type.kind === Kind.NAMED_TYPE) {
75
- isAllowedType =
76
- type.name.value === 'String' || isScalarType(schema.getType(type.name.value));
77
- }
78
- }
79
- if (!isAllowedType) {
80
- const returnType = typeName === 'Boolean'
81
- ? 'non-null Boolean'
82
- : 'either String or Scalar, which can be null if there are no results';
83
- context.report({
84
- node: field ? field.name : node.name,
85
- message: field
86
- ? `Field \`${fieldName}\` must return ${returnType}.`
87
- : `\`PageInfo\` must contain a field \`${fieldName}\`, that return ${returnType}.`,
88
- });
89
- }
90
- };
91
- checkField('hasPreviousPage', 'Boolean');
92
- checkField('hasNextPage', 'Boolean');
93
- checkField('startCursor', 'String');
94
- checkField('endCursor', 'String');
95
- },
77
+ }
78
+ if (!isAllowedType) {
79
+ const returnType = typeName === "Boolean" ? "non-null Boolean" : "either String or Scalar, which can be null if there are no results";
80
+ context.report({
81
+ node: field ? field.name : node.name,
82
+ message: field ? `Field \`${fieldName}\` must return ${returnType}.` : `\`PageInfo\` must contain a field \`${fieldName}\`, that return ${returnType}.`
83
+ });
84
+ }
96
85
  };
97
- },
86
+ checkField("hasPreviousPage", "Boolean");
87
+ checkField("hasNextPage", "Boolean");
88
+ checkField("startCursor", "String");
89
+ checkField("endCursor", "String");
90
+ }
91
+ };
92
+ }
93
+ };
94
+ export {
95
+ rule
98
96
  };
@@ -1,5 +1,12 @@
1
1
  import { FromSchema } from 'json-schema-to-ts';
2
- import { GraphQLESLintRule } from '../types.cjs';
2
+ import { i as GraphQLESLintRule } from '../types-2e1afd7c.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
+
3
10
  declare const schema: {
4
11
  readonly type: "array";
5
12
  readonly maxItems: 1;
@@ -13,6 +20,7 @@ declare const schema: {
13
20
  };
14
21
  };
15
22
  };
16
- export type RuleOptions = FromSchema<typeof schema>;
17
- export declare const rule: GraphQLESLintRule<RuleOptions>;
18
- export {};
23
+ type RuleOptions = FromSchema<typeof schema>;
24
+ declare const rule: GraphQLESLintRule<RuleOptions>;
25
+
26
+ export { RuleOptions, rule };