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