@graphql-eslint/eslint-plugin 3.19.3 → 3.20.0-alpha-20230703155329-a20556f

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 (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,142 +1,158 @@
1
- import { Kind, } from 'graphql';
2
- import lowerCase from 'lodash.lowercase';
3
- import { ARRAY_DEFAULT_OPTIONS, displayNodeName, truthy } from '../utils.js';
4
- const RULE_ID = 'alphabetize';
1
+ import {
2
+ Kind
3
+ } from "graphql";
4
+ import lowerCase from "lodash.lowercase";
5
+ import { ARRAY_DEFAULT_OPTIONS, displayNodeName, truthy } from "../utils.js";
6
+ const RULE_ID = "alphabetize";
5
7
  const fieldsEnum = [
6
- Kind.OBJECT_TYPE_DEFINITION,
7
- Kind.INTERFACE_TYPE_DEFINITION,
8
- Kind.INPUT_OBJECT_TYPE_DEFINITION,
8
+ Kind.OBJECT_TYPE_DEFINITION,
9
+ Kind.INTERFACE_TYPE_DEFINITION,
10
+ Kind.INPUT_OBJECT_TYPE_DEFINITION
9
11
  ];
10
12
  const valuesEnum = [Kind.ENUM_TYPE_DEFINITION];
11
13
  const selectionsEnum = [
12
- Kind.OPERATION_DEFINITION,
13
- Kind.FRAGMENT_DEFINITION,
14
+ Kind.OPERATION_DEFINITION,
15
+ Kind.FRAGMENT_DEFINITION
14
16
  ];
15
17
  const variablesEnum = [Kind.OPERATION_DEFINITION];
16
18
  const argumentsEnum = [
17
- Kind.FIELD_DEFINITION,
18
- Kind.FIELD,
19
- Kind.DIRECTIVE_DEFINITION,
20
- Kind.DIRECTIVE,
19
+ Kind.FIELD_DEFINITION,
20
+ Kind.FIELD,
21
+ Kind.DIRECTIVE_DEFINITION,
22
+ Kind.DIRECTIVE
21
23
  ];
22
24
  const schema = {
23
- type: 'array',
24
- minItems: 1,
25
- maxItems: 1,
26
- items: {
27
- type: 'object',
28
- additionalProperties: false,
29
- minProperties: 1,
30
- properties: {
31
- fields: {
32
- ...ARRAY_DEFAULT_OPTIONS,
33
- items: {
34
- enum: fieldsEnum,
35
- },
36
- description: 'Fields of `type`, `interface`, and `input`.',
37
- },
38
- values: {
39
- ...ARRAY_DEFAULT_OPTIONS,
40
- items: {
41
- enum: valuesEnum,
42
- },
43
- description: 'Values of `enum`.',
44
- },
45
- selections: {
46
- ...ARRAY_DEFAULT_OPTIONS,
47
- items: {
48
- enum: selectionsEnum,
49
- },
50
- description: 'Selections of `fragment` and operations `query`, `mutation` and `subscription`.',
51
- },
52
- variables: {
53
- ...ARRAY_DEFAULT_OPTIONS,
54
- items: {
55
- enum: variablesEnum,
56
- },
57
- description: 'Variables of operations `query`, `mutation` and `subscription`.',
58
- },
59
- arguments: {
60
- ...ARRAY_DEFAULT_OPTIONS,
61
- items: {
62
- enum: argumentsEnum,
63
- },
64
- description: 'Arguments of fields and directives.',
65
- },
66
- definitions: {
67
- type: 'boolean',
68
- description: 'Definitions – `type`, `interface`, `enum`, `scalar`, `input`, `union` and `directive`.',
69
- default: false,
70
- },
71
- groups: {
72
- ...ARRAY_DEFAULT_OPTIONS,
73
- minItems: 2,
74
- description: "Custom order group. Example: `['id', '*', 'createdAt', 'updatedAt']` where `*` says for everything else.",
75
- },
25
+ type: "array",
26
+ minItems: 1,
27
+ maxItems: 1,
28
+ items: {
29
+ type: "object",
30
+ additionalProperties: false,
31
+ minProperties: 1,
32
+ properties: {
33
+ fields: {
34
+ ...ARRAY_DEFAULT_OPTIONS,
35
+ items: {
36
+ enum: fieldsEnum
76
37
  },
77
- },
38
+ description: "Fields of `type`, `interface`, and `input`."
39
+ },
40
+ values: {
41
+ ...ARRAY_DEFAULT_OPTIONS,
42
+ items: {
43
+ enum: valuesEnum
44
+ },
45
+ description: "Values of `enum`."
46
+ },
47
+ selections: {
48
+ ...ARRAY_DEFAULT_OPTIONS,
49
+ items: {
50
+ enum: selectionsEnum
51
+ },
52
+ description: "Selections of `fragment` and operations `query`, `mutation` and `subscription`."
53
+ },
54
+ variables: {
55
+ ...ARRAY_DEFAULT_OPTIONS,
56
+ items: {
57
+ enum: variablesEnum
58
+ },
59
+ description: "Variables of operations `query`, `mutation` and `subscription`."
60
+ },
61
+ arguments: {
62
+ ...ARRAY_DEFAULT_OPTIONS,
63
+ items: {
64
+ enum: argumentsEnum
65
+ },
66
+ description: "Arguments of fields and directives."
67
+ },
68
+ definitions: {
69
+ type: "boolean",
70
+ description: "Definitions \u2013 `type`, `interface`, `enum`, `scalar`, `input`, `union` and `directive`.",
71
+ default: false
72
+ },
73
+ groups: {
74
+ ...ARRAY_DEFAULT_OPTIONS,
75
+ minItems: 2,
76
+ description: "Custom order group. Example: `['id', '*', 'createdAt', 'updatedAt']` where `*` says for everything else."
77
+ }
78
+ }
79
+ }
78
80
  };
79
- export const rule = {
80
- meta: {
81
- type: 'suggestion',
82
- fixable: 'code',
83
- docs: {
84
- category: ['Schema', 'Operations'],
85
- description: 'Enforce arrange in alphabetical order for type fields, enum values, input object fields, operation selections and more.',
86
- url: `https://the-guild.dev/graphql/eslint/rules/${RULE_ID}`,
87
- examples: [
88
- {
89
- title: 'Incorrect',
90
- usage: [{ fields: [Kind.OBJECT_TYPE_DEFINITION] }],
91
- code: /* GraphQL */ `
81
+ const rule = {
82
+ meta: {
83
+ type: "suggestion",
84
+ fixable: "code",
85
+ docs: {
86
+ category: ["Schema", "Operations"],
87
+ description: "Enforce arrange in alphabetical order for type fields, enum values, input object fields, operation selections and more.",
88
+ url: `https://the-guild.dev/graphql/eslint/rules/${RULE_ID}`,
89
+ examples: [
90
+ {
91
+ title: "Incorrect",
92
+ usage: [{ fields: [Kind.OBJECT_TYPE_DEFINITION] }],
93
+ code: (
94
+ /* GraphQL */
95
+ `
92
96
  type User {
93
97
  password: String
94
98
  firstName: String! # should be before "password"
95
99
  age: Int # should be before "firstName"
96
100
  lastName: String!
97
101
  }
98
- `,
99
- },
100
- {
101
- title: 'Correct',
102
- usage: [{ fields: [Kind.OBJECT_TYPE_DEFINITION] }],
103
- code: /* GraphQL */ `
102
+ `
103
+ )
104
+ },
105
+ {
106
+ title: "Correct",
107
+ usage: [{ fields: [Kind.OBJECT_TYPE_DEFINITION] }],
108
+ code: (
109
+ /* GraphQL */
110
+ `
104
111
  type User {
105
112
  age: Int
106
113
  firstName: String!
107
114
  lastName: String!
108
115
  password: String
109
116
  }
110
- `,
111
- },
112
- {
113
- title: 'Incorrect',
114
- usage: [{ values: [Kind.ENUM_TYPE_DEFINITION] }],
115
- code: /* GraphQL */ `
117
+ `
118
+ )
119
+ },
120
+ {
121
+ title: "Incorrect",
122
+ usage: [{ values: [Kind.ENUM_TYPE_DEFINITION] }],
123
+ code: (
124
+ /* GraphQL */
125
+ `
116
126
  enum Role {
117
127
  SUPER_ADMIN
118
128
  ADMIN # should be before "SUPER_ADMIN"
119
129
  USER
120
130
  GOD # should be before "USER"
121
131
  }
122
- `,
123
- },
124
- {
125
- title: 'Correct',
126
- usage: [{ values: [Kind.ENUM_TYPE_DEFINITION] }],
127
- code: /* GraphQL */ `
132
+ `
133
+ )
134
+ },
135
+ {
136
+ title: "Correct",
137
+ usage: [{ values: [Kind.ENUM_TYPE_DEFINITION] }],
138
+ code: (
139
+ /* GraphQL */
140
+ `
128
141
  enum Role {
129
142
  ADMIN
130
143
  GOD
131
144
  SUPER_ADMIN
132
145
  USER
133
146
  }
134
- `,
135
- },
136
- {
137
- title: 'Incorrect',
138
- usage: [{ selections: [Kind.OPERATION_DEFINITION] }],
139
- code: /* GraphQL */ `
147
+ `
148
+ )
149
+ },
150
+ {
151
+ title: "Incorrect",
152
+ usage: [{ selections: [Kind.OPERATION_DEFINITION] }],
153
+ code: (
154
+ /* GraphQL */
155
+ `
140
156
  query {
141
157
  me {
142
158
  firstName
@@ -144,12 +160,15 @@ export const rule = {
144
160
  email # should be before "lastName"
145
161
  }
146
162
  }
147
- `,
148
- },
149
- {
150
- title: 'Correct',
151
- usage: [{ selections: [Kind.OPERATION_DEFINITION] }],
152
- code: /* GraphQL */ `
163
+ `
164
+ )
165
+ },
166
+ {
167
+ title: "Correct",
168
+ usage: [{ selections: [Kind.OPERATION_DEFINITION] }],
169
+ code: (
170
+ /* GraphQL */
171
+ `
153
172
  query {
154
173
  me {
155
174
  email
@@ -157,190 +176,185 @@ export const rule = {
157
176
  lastName
158
177
  }
159
178
  }
160
- `,
161
- },
162
- ],
163
- configOptions: {
164
- schema: [
165
- {
166
- fields: fieldsEnum,
167
- values: valuesEnum,
168
- arguments: argumentsEnum,
169
- // TODO: add in graphql-eslint v4
170
- // definitions: true,
171
- // groups: ['id', '*', 'createdAt', 'updatedAt']
172
- },
173
- ],
174
- operations: [
175
- {
176
- selections: selectionsEnum,
177
- variables: variablesEnum,
178
- arguments: [Kind.FIELD, Kind.DIRECTIVE],
179
- },
180
- ],
181
- },
182
- },
183
- messages: {
184
- [RULE_ID]: '{{ currNode }} should be before {{ prevNode }}',
185
- },
186
- schema,
179
+ `
180
+ )
181
+ }
182
+ ],
183
+ configOptions: {
184
+ schema: [
185
+ {
186
+ fields: fieldsEnum,
187
+ values: valuesEnum,
188
+ arguments: argumentsEnum
189
+ // TODO: add in graphql-eslint v4
190
+ // definitions: true,
191
+ // groups: ['id', '*', 'createdAt', 'updatedAt']
192
+ }
193
+ ],
194
+ operations: [
195
+ {
196
+ selections: selectionsEnum,
197
+ variables: variablesEnum,
198
+ arguments: [Kind.FIELD, Kind.DIRECTIVE]
199
+ }
200
+ ]
201
+ }
202
+ },
203
+ messages: {
204
+ [RULE_ID]: "{{ currNode }} should be before {{ prevNode }}"
187
205
  },
188
- create(context) {
189
- var _a, _b, _c, _d, _e;
190
- const sourceCode = context.getSourceCode();
191
- function isNodeAndCommentOnSameLine(node, comment) {
192
- return node.loc.end.line === comment.loc.start.line;
206
+ schema
207
+ },
208
+ create(context) {
209
+ const sourceCode = context.getSourceCode();
210
+ function isNodeAndCommentOnSameLine(node, comment) {
211
+ return node.loc.end.line === comment.loc.start.line;
212
+ }
213
+ function getBeforeComments(node) {
214
+ const commentsBefore = sourceCode.getCommentsBefore(node);
215
+ if (commentsBefore.length === 0) {
216
+ return [];
217
+ }
218
+ const tokenBefore = sourceCode.getTokenBefore(node);
219
+ if (tokenBefore) {
220
+ return commentsBefore.filter((comment) => !isNodeAndCommentOnSameLine(tokenBefore, comment));
221
+ }
222
+ const filteredComments = [];
223
+ const nodeLine = node.loc.start.line;
224
+ for (let i = commentsBefore.length - 1; i >= 0; i -= 1) {
225
+ const comment = commentsBefore[i];
226
+ if (nodeLine - comment.loc.start.line - filteredComments.length > 1) {
227
+ break;
193
228
  }
194
- function getBeforeComments(node) {
195
- const commentsBefore = sourceCode.getCommentsBefore(node);
196
- if (commentsBefore.length === 0) {
197
- return [];
198
- }
199
- const tokenBefore = sourceCode.getTokenBefore(node);
200
- if (tokenBefore) {
201
- return commentsBefore.filter(comment => !isNodeAndCommentOnSameLine(tokenBefore, comment));
202
- }
203
- const filteredComments = [];
204
- const nodeLine = node.loc.start.line;
205
- // Break on comment that not attached to node
206
- for (let i = commentsBefore.length - 1; i >= 0; i -= 1) {
207
- const comment = commentsBefore[i];
208
- if (nodeLine - comment.loc.start.line - filteredComments.length > 1) {
209
- break;
210
- }
211
- filteredComments.unshift(comment);
212
- }
213
- return filteredComments;
229
+ filteredComments.unshift(comment);
230
+ }
231
+ return filteredComments;
232
+ }
233
+ function getRangeWithComments(node) {
234
+ if (node.kind === Kind.VARIABLE) {
235
+ node = node.parent;
236
+ }
237
+ const [firstBeforeComment] = getBeforeComments(node);
238
+ const [firstAfterComment] = sourceCode.getCommentsAfter(node);
239
+ const from = firstBeforeComment || node;
240
+ const to = firstAfterComment && isNodeAndCommentOnSameLine(node, firstAfterComment) ? firstAfterComment : node;
241
+ return [from.range[0], to.range[1]];
242
+ }
243
+ function checkNodes(nodes = []) {
244
+ for (let i = 1; i < nodes.length; i += 1) {
245
+ const currNode = nodes[i];
246
+ const currName = "alias" in currNode && currNode.alias?.value || "name" in currNode && currNode.name?.value;
247
+ if (!currName) {
248
+ continue;
214
249
  }
215
- function getRangeWithComments(node) {
216
- if (node.kind === Kind.VARIABLE) {
217
- node = node.parent;
250
+ const prevNode = nodes[i - 1];
251
+ const prevName = "alias" in prevNode && prevNode.alias?.value || "name" in prevNode && prevNode.name?.value;
252
+ if (prevName) {
253
+ const compareResult = prevName.localeCompare(currName);
254
+ const { groups } = opts;
255
+ let shouldSortByGroup = false;
256
+ if (groups?.length) {
257
+ if (!groups.includes("*")) {
258
+ throw new Error("`groups` option should contain `*` string.");
218
259
  }
219
- const [firstBeforeComment] = getBeforeComments(node);
220
- const [firstAfterComment] = sourceCode.getCommentsAfter(node);
221
- const from = firstBeforeComment || node;
222
- const to = firstAfterComment && isNodeAndCommentOnSameLine(node, firstAfterComment)
223
- ? firstAfterComment
224
- : node;
225
- return [from.range[0], to.range[1]];
226
- }
227
- function checkNodes(nodes = []) {
228
- var _a, _b, _c, _d;
229
- // Starts from 1, ignore nodes.length <= 1
230
- for (let i = 1; i < nodes.length; i += 1) {
231
- const currNode = nodes[i];
232
- const currName = ('alias' in currNode && ((_a = currNode.alias) === null || _a === void 0 ? void 0 : _a.value)) ||
233
- ('name' in currNode && ((_b = currNode.name) === null || _b === void 0 ? void 0 : _b.value));
234
- if (!currName) {
235
- // we don't move unnamed current nodes
236
- continue;
237
- }
238
- const prevNode = nodes[i - 1];
239
- const prevName = ('alias' in prevNode && ((_c = prevNode.alias) === null || _c === void 0 ? void 0 : _c.value)) ||
240
- ('name' in prevNode && ((_d = prevNode.name) === null || _d === void 0 ? void 0 : _d.value));
241
- if (prevName) {
242
- // Compare with lexicographic order
243
- const compareResult = prevName.localeCompare(currName);
244
- const { groups } = opts;
245
- let shouldSortByGroup = false;
246
- if (groups === null || groups === void 0 ? void 0 : groups.length) {
247
- if (!groups.includes('*')) {
248
- throw new Error('`groups` option should contain `*` string.');
249
- }
250
- let indexForPrev = groups.indexOf(prevName);
251
- if (indexForPrev === -1)
252
- indexForPrev = groups.indexOf('*');
253
- let indexForCurr = groups.indexOf(currName);
254
- if (indexForCurr === -1)
255
- indexForCurr = groups.indexOf('*');
256
- shouldSortByGroup = indexForPrev - indexForCurr > 0;
257
- if (indexForPrev < indexForCurr) {
258
- continue;
259
- }
260
- }
261
- const shouldSort = compareResult === 1;
262
- if (!shouldSortByGroup && !shouldSort) {
263
- const isSameName = compareResult === 0;
264
- if (!isSameName ||
265
- !prevNode.kind.endsWith('Extension') ||
266
- currNode.kind.endsWith('Extension')) {
267
- continue;
268
- }
269
- }
270
- }
271
- context.report({
272
- // @ts-expect-error can't be undefined
273
- node: ('alias' in currNode && currNode.alias) || currNode.name,
274
- messageId: RULE_ID,
275
- data: {
276
- currNode: displayNodeName(currNode),
277
- prevNode: prevName ? displayNodeName(prevNode) : lowerCase(prevNode.kind),
278
- },
279
- *fix(fixer) {
280
- const prevRange = getRangeWithComments(prevNode);
281
- const currRange = getRangeWithComments(currNode);
282
- yield fixer.replaceTextRange(prevRange, sourceCode.getText({ range: currRange }));
283
- yield fixer.replaceTextRange(currRange, sourceCode.getText({ range: prevRange }));
284
- },
285
- });
260
+ let indexForPrev = groups.indexOf(prevName);
261
+ if (indexForPrev === -1)
262
+ indexForPrev = groups.indexOf("*");
263
+ let indexForCurr = groups.indexOf(currName);
264
+ if (indexForCurr === -1)
265
+ indexForCurr = groups.indexOf("*");
266
+ shouldSortByGroup = indexForPrev - indexForCurr > 0;
267
+ if (indexForPrev < indexForCurr) {
268
+ continue;
286
269
  }
270
+ }
271
+ const shouldSort = compareResult === 1;
272
+ if (!shouldSortByGroup && !shouldSort) {
273
+ const isSameName = compareResult === 0;
274
+ if (!isSameName || !prevNode.kind.endsWith("Extension") || currNode.kind.endsWith("Extension")) {
275
+ continue;
276
+ }
277
+ }
287
278
  }
288
- const opts = context.options[0];
289
- const fields = new Set((_a = opts.fields) !== null && _a !== void 0 ? _a : []);
290
- const listeners = {};
291
- const kinds = [
292
- fields.has(Kind.OBJECT_TYPE_DEFINITION) && [
293
- Kind.OBJECT_TYPE_DEFINITION,
294
- Kind.OBJECT_TYPE_EXTENSION,
295
- ],
296
- fields.has(Kind.INTERFACE_TYPE_DEFINITION) && [
297
- Kind.INTERFACE_TYPE_DEFINITION,
298
- Kind.INTERFACE_TYPE_EXTENSION,
299
- ],
300
- fields.has(Kind.INPUT_OBJECT_TYPE_DEFINITION) && [
301
- Kind.INPUT_OBJECT_TYPE_DEFINITION,
302
- Kind.INPUT_OBJECT_TYPE_EXTENSION,
303
- ],
304
- ]
305
- .filter(truthy)
306
- .flat();
307
- const fieldsSelector = kinds.join(',');
308
- const hasEnumValues = ((_b = opts.values) === null || _b === void 0 ? void 0 : _b[0]) === Kind.ENUM_TYPE_DEFINITION;
309
- const selectionsSelector = (_c = opts.selections) === null || _c === void 0 ? void 0 : _c.join(',');
310
- const hasVariables = ((_d = opts.variables) === null || _d === void 0 ? void 0 : _d[0]) === Kind.OPERATION_DEFINITION;
311
- const argumentsSelector = (_e = opts.arguments) === null || _e === void 0 ? void 0 : _e.join(',');
312
- if (fieldsSelector) {
313
- listeners[fieldsSelector] = (node) => {
314
- checkNodes(node.fields);
315
- };
316
- }
317
- if (hasEnumValues) {
318
- const enumValuesSelector = [Kind.ENUM_TYPE_DEFINITION, Kind.ENUM_TYPE_EXTENSION].join(',');
319
- listeners[enumValuesSelector] = (node) => {
320
- checkNodes(node.values);
321
- };
322
- }
323
- if (selectionsSelector) {
324
- listeners[`:matches(${selectionsSelector}) SelectionSet`] = (node) => {
325
- checkNodes(node.selections);
326
- };
327
- }
328
- if (hasVariables) {
329
- listeners.OperationDefinition = (node) => {
330
- var _a;
331
- checkNodes((_a = node.variableDefinitions) === null || _a === void 0 ? void 0 : _a.map(varDef => varDef.variable));
332
- };
333
- }
334
- if (argumentsSelector) {
335
- listeners[argumentsSelector] = (node) => {
336
- checkNodes(node.arguments);
337
- };
338
- }
339
- if (opts.definitions) {
340
- listeners.Document = node => {
341
- checkNodes(node.definitions);
342
- };
343
- }
344
- return listeners;
345
- },
279
+ context.report({
280
+ // @ts-expect-error can't be undefined
281
+ node: "alias" in currNode && currNode.alias || currNode.name,
282
+ messageId: RULE_ID,
283
+ data: {
284
+ currNode: displayNodeName(currNode),
285
+ prevNode: prevName ? displayNodeName(prevNode) : lowerCase(prevNode.kind)
286
+ },
287
+ *fix(fixer) {
288
+ const prevRange = getRangeWithComments(prevNode);
289
+ const currRange = getRangeWithComments(currNode);
290
+ yield fixer.replaceTextRange(
291
+ prevRange,
292
+ sourceCode.getText({ range: currRange })
293
+ );
294
+ yield fixer.replaceTextRange(
295
+ currRange,
296
+ sourceCode.getText({ range: prevRange })
297
+ );
298
+ }
299
+ });
300
+ }
301
+ }
302
+ const opts = context.options[0];
303
+ const fields = new Set(opts.fields ?? []);
304
+ const listeners = {};
305
+ const kinds = [
306
+ fields.has(Kind.OBJECT_TYPE_DEFINITION) && [
307
+ Kind.OBJECT_TYPE_DEFINITION,
308
+ Kind.OBJECT_TYPE_EXTENSION
309
+ ],
310
+ fields.has(Kind.INTERFACE_TYPE_DEFINITION) && [
311
+ Kind.INTERFACE_TYPE_DEFINITION,
312
+ Kind.INTERFACE_TYPE_EXTENSION
313
+ ],
314
+ fields.has(Kind.INPUT_OBJECT_TYPE_DEFINITION) && [
315
+ Kind.INPUT_OBJECT_TYPE_DEFINITION,
316
+ Kind.INPUT_OBJECT_TYPE_EXTENSION
317
+ ]
318
+ ].filter(truthy).flat();
319
+ const fieldsSelector = kinds.join(",");
320
+ const hasEnumValues = opts.values?.[0] === Kind.ENUM_TYPE_DEFINITION;
321
+ const selectionsSelector = opts.selections?.join(",");
322
+ const hasVariables = opts.variables?.[0] === Kind.OPERATION_DEFINITION;
323
+ const argumentsSelector = opts.arguments?.join(",");
324
+ if (fieldsSelector) {
325
+ listeners[fieldsSelector] = (node) => {
326
+ checkNodes(node.fields);
327
+ };
328
+ }
329
+ if (hasEnumValues) {
330
+ const enumValuesSelector = [Kind.ENUM_TYPE_DEFINITION, Kind.ENUM_TYPE_EXTENSION].join(",");
331
+ listeners[enumValuesSelector] = (node) => {
332
+ checkNodes(node.values);
333
+ };
334
+ }
335
+ if (selectionsSelector) {
336
+ listeners[`:matches(${selectionsSelector}) SelectionSet`] = (node) => {
337
+ checkNodes(node.selections);
338
+ };
339
+ }
340
+ if (hasVariables) {
341
+ listeners.OperationDefinition = (node) => {
342
+ checkNodes(node.variableDefinitions?.map((varDef) => varDef.variable));
343
+ };
344
+ }
345
+ if (argumentsSelector) {
346
+ listeners[argumentsSelector] = (node) => {
347
+ checkNodes(node.arguments);
348
+ };
349
+ }
350
+ if (opts.definitions) {
351
+ listeners.Document = (node) => {
352
+ checkNodes(node.definitions);
353
+ };
354
+ }
355
+ return listeners;
356
+ }
357
+ };
358
+ export {
359
+ rule
346
360
  };