@graphql-eslint/eslint-plugin 4.0.0-alpha-20220821140530-e968cfc → 4.0.0-alpha-20230810155929-e89edf7

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 (346) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +14 -252
  3. package/cjs/cache.d.ts +12 -0
  4. package/cjs/cache.js +53 -0
  5. package/cjs/configs/index.d.ts +174 -0
  6. package/cjs/configs/index.js +40 -0
  7. package/cjs/configs/operations-all.d.ts +23 -0
  8. package/cjs/configs/operations-all.js +28 -0
  9. package/cjs/configs/operations-recommended.d.ts +54 -0
  10. package/{configs/operations-recommended.json → cjs/configs/operations-recommended.js} +19 -15
  11. package/cjs/configs/schema-all.d.ts +24 -0
  12. package/cjs/configs/schema-all.js +24 -0
  13. package/cjs/configs/schema-recommended.d.ts +67 -0
  14. package/cjs/configs/schema-recommended.js +68 -0
  15. package/cjs/configs/schema-relay.d.ts +12 -0
  16. package/{configs/relay.json → cjs/configs/schema-relay.js} +6 -4
  17. package/cjs/documents.d.ts +6 -0
  18. package/cjs/documents.js +66 -0
  19. package/cjs/estree-converter/converter.d.ts +8 -0
  20. package/cjs/estree-converter/converter.js +70 -0
  21. package/cjs/estree-converter/index.d.ts +8 -0
  22. package/cjs/estree-converter/index.js +23 -0
  23. package/cjs/estree-converter/types.d.ts +42 -0
  24. package/cjs/estree-converter/types.js +14 -0
  25. package/cjs/estree-converter/utils.d.ts +17 -0
  26. package/cjs/estree-converter/utils.js +105 -0
  27. package/cjs/flat-configs.d.ts +307 -0
  28. package/cjs/flat-configs.js +55 -0
  29. package/cjs/graphql-config.d.ts +14 -0
  30. package/cjs/graphql-config.js +65 -0
  31. package/cjs/index.d.ts +28 -0
  32. package/cjs/index.js +41 -0
  33. package/cjs/parser.d.ts +13 -0
  34. package/cjs/parser.js +96 -0
  35. package/cjs/processor.d.ts +13 -0
  36. package/cjs/processor.js +95 -0
  37. package/cjs/rules/alphabetize.d.ts +74 -0
  38. package/cjs/rules/alphabetize.js +323 -0
  39. package/cjs/rules/description-style.d.ts +29 -0
  40. package/cjs/rules/description-style.js +102 -0
  41. package/cjs/rules/graphql-js-validation.d.ts +13 -0
  42. package/cjs/rules/graphql-js-validation.js +595 -0
  43. package/cjs/rules/index.d.ts +127 -0
  44. package/cjs/rules/index.js +62 -0
  45. package/cjs/rules/input-name.d.ts +44 -0
  46. package/cjs/rules/input-name.js +154 -0
  47. package/cjs/rules/lone-executable-definition.d.ts +35 -0
  48. package/cjs/rules/lone-executable-definition.js +105 -0
  49. package/cjs/rules/match-document-filename.d.ts +81 -0
  50. package/cjs/rules/match-document-filename.js +251 -0
  51. package/cjs/rules/naming-convention.d.ts +108 -0
  52. package/cjs/rules/naming-convention.js +416 -0
  53. package/cjs/rules/no-anonymous-operations.d.ts +13 -0
  54. package/cjs/rules/no-anonymous-operations.js +91 -0
  55. package/cjs/rules/no-deprecated.d.ts +13 -0
  56. package/cjs/rules/no-deprecated.js +143 -0
  57. package/cjs/rules/no-duplicate-fields.d.ts +13 -0
  58. package/cjs/rules/no-duplicate-fields.js +136 -0
  59. package/cjs/rules/no-hashtag-description.d.ts +14 -0
  60. package/cjs/rules/no-hashtag-description.js +127 -0
  61. package/cjs/rules/no-one-place-fragments.d.ts +13 -0
  62. package/cjs/rules/no-one-place-fragments.js +101 -0
  63. package/cjs/rules/no-root-type.d.ts +34 -0
  64. package/cjs/rules/no-root-type.js +103 -0
  65. package/cjs/rules/no-scalar-result-type-on-mutation.d.ts +13 -0
  66. package/cjs/rules/no-scalar-result-type-on-mutation.js +88 -0
  67. package/cjs/rules/no-typename-prefix.d.ts +13 -0
  68. package/cjs/rules/no-typename-prefix.js +91 -0
  69. package/cjs/rules/no-unreachable-types.d.ts +13 -0
  70. package/cjs/rules/no-unreachable-types.js +177 -0
  71. package/cjs/rules/no-unused-fields.d.ts +13 -0
  72. package/cjs/rules/no-unused-fields.js +132 -0
  73. package/cjs/rules/relay-arguments.d.ts +30 -0
  74. package/cjs/rules/relay-arguments.js +126 -0
  75. package/cjs/rules/relay-connection-types.d.ts +14 -0
  76. package/cjs/rules/relay-connection-types.js +111 -0
  77. package/cjs/rules/relay-edge-types.d.ts +40 -0
  78. package/cjs/rules/relay-edge-types.js +161 -0
  79. package/cjs/rules/relay-page-info.d.ts +13 -0
  80. package/cjs/rules/relay-page-info.js +98 -0
  81. package/cjs/rules/require-deprecation-date.d.ts +27 -0
  82. package/cjs/rules/require-deprecation-date.js +148 -0
  83. package/cjs/rules/require-deprecation-reason.d.ts +13 -0
  84. package/cjs/rules/require-deprecation-reason.js +85 -0
  85. package/cjs/rules/require-description.d.ts +24 -0
  86. package/cjs/rules/require-description.js +179 -0
  87. package/cjs/rules/require-field-of-type-query-in-mutation-result.d.ts +13 -0
  88. package/cjs/rules/require-field-of-type-query-in-mutation-result.js +87 -0
  89. package/cjs/rules/require-import-fragment.d.ts +13 -0
  90. package/cjs/rules/require-import-fragment.js +148 -0
  91. package/cjs/rules/require-nullable-fields-with-oneof.d.ts +13 -0
  92. package/cjs/rules/require-nullable-fields-with-oneof.js +81 -0
  93. package/cjs/rules/require-nullable-result-in-root.d.ts +13 -0
  94. package/cjs/rules/require-nullable-result-in-root.js +99 -0
  95. package/cjs/rules/require-selections.d.ts +45 -0
  96. package/cjs/rules/require-selections.js +198 -0
  97. package/cjs/rules/require-type-pattern-with-oneof.d.ts +13 -0
  98. package/cjs/rules/require-type-pattern-with-oneof.js +83 -0
  99. package/cjs/rules/selection-set-depth.d.ts +37 -0
  100. package/cjs/rules/selection-set-depth.js +159 -0
  101. package/cjs/rules/strict-id-in-types.d.ts +66 -0
  102. package/cjs/rules/strict-id-in-types.js +168 -0
  103. package/cjs/rules/unique-enum-value-names.d.ts +13 -0
  104. package/cjs/rules/unique-enum-value-names.js +91 -0
  105. package/cjs/rules/unique-fragment-name.d.ts +14 -0
  106. package/cjs/rules/unique-fragment-name.js +106 -0
  107. package/cjs/rules/unique-operation-name.d.ts +13 -0
  108. package/cjs/rules/unique-operation-name.js +93 -0
  109. package/cjs/schema.d.ts +13 -0
  110. package/cjs/schema.js +52 -0
  111. package/{sibling-operations.d.ts → cjs/siblings.d.ts} +9 -6
  112. package/cjs/siblings.js +96 -0
  113. package/cjs/types.d.ts +75 -0
  114. package/cjs/types.js +14 -0
  115. package/cjs/utils.d.ts +45 -0
  116. package/cjs/utils.js +188 -0
  117. package/esm/cache.d.mts +12 -0
  118. package/esm/cache.js +25 -0
  119. package/esm/chunk-U3TKCM4X.js +8 -0
  120. package/esm/configs/index.d.mts +174 -0
  121. package/esm/configs/index.js +16 -0
  122. package/esm/configs/operations-all.d.mts +23 -0
  123. package/esm/configs/operations-all.js +35 -0
  124. package/esm/configs/operations-recommended.d.mts +54 -0
  125. package/esm/configs/operations-recommended.js +61 -0
  126. package/esm/configs/schema-all.d.mts +24 -0
  127. package/esm/configs/schema-all.js +31 -0
  128. package/esm/configs/schema-recommended.d.mts +67 -0
  129. package/esm/configs/schema-recommended.js +75 -0
  130. package/esm/configs/schema-relay.d.mts +12 -0
  131. package/esm/configs/schema-relay.js +18 -0
  132. package/esm/documents.d.mts +6 -0
  133. package/esm/documents.js +41 -0
  134. package/esm/estree-converter/converter.d.mts +8 -0
  135. package/esm/estree-converter/converter.js +56 -0
  136. package/esm/estree-converter/index.d.mts +8 -0
  137. package/esm/estree-converter/index.js +3 -0
  138. package/esm/estree-converter/types.d.mts +42 -0
  139. package/esm/estree-converter/types.js +0 -0
  140. package/esm/estree-converter/utils.d.mts +17 -0
  141. package/esm/estree-converter/utils.js +87 -0
  142. package/esm/flat-configs.d.mts +307 -0
  143. package/esm/flat-configs.js +36 -0
  144. package/esm/graphql-config.d.mts +14 -0
  145. package/esm/graphql-config.js +39 -0
  146. package/esm/index.d.mts +28 -0
  147. package/esm/index.js +18 -0
  148. package/esm/package.json +1 -0
  149. package/esm/parser.d.mts +13 -0
  150. package/esm/parser.js +76 -0
  151. package/esm/processor.d.mts +13 -0
  152. package/esm/processor.js +81 -0
  153. package/esm/rules/alphabetize.d.mts +74 -0
  154. package/esm/rules/alphabetize.js +299 -0
  155. package/esm/rules/description-style.d.mts +29 -0
  156. package/esm/rules/description-style.js +82 -0
  157. package/esm/rules/graphql-js-validation.d.mts +13 -0
  158. package/esm/rules/graphql-js-validation.js +618 -0
  159. package/esm/rules/index.d.mts +127 -0
  160. package/esm/rules/index.js +76 -0
  161. package/esm/rules/input-name.d.mts +44 -0
  162. package/esm/rules/input-name.js +136 -0
  163. package/esm/rules/lone-executable-definition.d.mts +35 -0
  164. package/esm/rules/lone-executable-definition.js +86 -0
  165. package/esm/rules/match-document-filename.d.mts +81 -0
  166. package/esm/rules/match-document-filename.js +237 -0
  167. package/esm/rules/naming-convention.d.mts +108 -0
  168. package/esm/rules/naming-convention.js +403 -0
  169. package/esm/rules/no-anonymous-operations.d.mts +13 -0
  170. package/esm/rules/no-anonymous-operations.js +72 -0
  171. package/esm/rules/no-deprecated.d.mts +13 -0
  172. package/esm/rules/no-deprecated.js +124 -0
  173. package/esm/rules/no-duplicate-fields.d.mts +13 -0
  174. package/esm/rules/no-duplicate-fields.js +116 -0
  175. package/esm/rules/no-hashtag-description.d.mts +14 -0
  176. package/esm/rules/no-hashtag-description.js +107 -0
  177. package/esm/rules/no-one-place-fragments.d.mts +13 -0
  178. package/esm/rules/no-one-place-fragments.js +83 -0
  179. package/esm/rules/no-root-type.d.mts +34 -0
  180. package/esm/rules/no-root-type.js +83 -0
  181. package/esm/rules/no-scalar-result-type-on-mutation.d.mts +13 -0
  182. package/esm/rules/no-scalar-result-type-on-mutation.js +69 -0
  183. package/esm/rules/no-typename-prefix.d.mts +13 -0
  184. package/esm/rules/no-typename-prefix.js +71 -0
  185. package/esm/rules/no-unreachable-types.d.mts +13 -0
  186. package/esm/rules/no-unreachable-types.js +156 -0
  187. package/esm/rules/no-unused-fields.d.mts +13 -0
  188. package/esm/rules/no-unused-fields.js +113 -0
  189. package/esm/rules/relay-arguments.d.mts +30 -0
  190. package/esm/rules/relay-arguments.js +107 -0
  191. package/esm/rules/relay-connection-types.d.mts +14 -0
  192. package/esm/rules/relay-connection-types.js +90 -0
  193. package/esm/rules/relay-edge-types.d.mts +40 -0
  194. package/esm/rules/relay-edge-types.js +148 -0
  195. package/esm/rules/relay-page-info.d.mts +13 -0
  196. package/esm/rules/relay-page-info.js +80 -0
  197. package/esm/rules/require-deprecation-date.d.mts +27 -0
  198. package/esm/rules/require-deprecation-date.js +129 -0
  199. package/esm/rules/require-deprecation-reason.d.mts +13 -0
  200. package/esm/rules/require-deprecation-reason.js +66 -0
  201. package/esm/rules/require-description.d.mts +24 -0
  202. package/esm/rules/require-description.js +165 -0
  203. package/esm/rules/require-field-of-type-query-in-mutation-result.d.mts +13 -0
  204. package/esm/rules/require-field-of-type-query-in-mutation-result.js +68 -0
  205. package/esm/rules/require-import-fragment.d.mts +13 -0
  206. package/esm/rules/require-import-fragment.js +121 -0
  207. package/esm/rules/require-nullable-fields-with-oneof.d.mts +13 -0
  208. package/esm/rules/require-nullable-fields-with-oneof.js +62 -0
  209. package/esm/rules/require-nullable-result-in-root.d.mts +13 -0
  210. package/esm/rules/require-nullable-result-in-root.js +80 -0
  211. package/esm/rules/require-selections.d.mts +45 -0
  212. package/esm/rules/require-selections.js +194 -0
  213. package/esm/rules/require-type-pattern-with-oneof.d.mts +13 -0
  214. package/esm/rules/require-type-pattern-with-oneof.js +63 -0
  215. package/esm/rules/selection-set-depth.d.mts +37 -0
  216. package/esm/rules/selection-set-depth.js +133 -0
  217. package/esm/rules/strict-id-in-types.d.mts +66 -0
  218. package/esm/rules/strict-id-in-types.js +155 -0
  219. package/esm/rules/unique-enum-value-names.d.mts +13 -0
  220. package/esm/rules/unique-enum-value-names.js +72 -0
  221. package/esm/rules/unique-fragment-name.d.mts +14 -0
  222. package/esm/rules/unique-fragment-name.js +87 -0
  223. package/esm/rules/unique-operation-name.d.mts +13 -0
  224. package/esm/rules/unique-operation-name.js +73 -0
  225. package/esm/schema.d.mts +13 -0
  226. package/esm/schema.js +27 -0
  227. package/esm/siblings.d.mts +24 -0
  228. package/esm/siblings.js +80 -0
  229. package/esm/types.d.mts +75 -0
  230. package/esm/types.js +0 -0
  231. package/esm/utils.d.mts +45 -0
  232. package/esm/utils.js +144 -0
  233. package/index.browser.mjs +5323 -0
  234. package/package.json +43 -35
  235. package/configs/base.json +0 -4
  236. package/configs/operations-all.json +0 -24
  237. package/configs/schema-all.json +0 -26
  238. package/configs/schema-recommended.json +0 -49
  239. package/docs/README.md +0 -75
  240. package/docs/custom-rules.md +0 -148
  241. package/docs/deprecated-rules.md +0 -21
  242. package/docs/parser-options.md +0 -85
  243. package/docs/parser.md +0 -49
  244. package/docs/rules/alphabetize.md +0 -178
  245. package/docs/rules/description-style.md +0 -54
  246. package/docs/rules/executable-definitions.md +0 -17
  247. package/docs/rules/fields-on-correct-type.md +0 -17
  248. package/docs/rules/fragments-on-composite-type.md +0 -17
  249. package/docs/rules/input-name.md +0 -76
  250. package/docs/rules/known-argument-names.md +0 -17
  251. package/docs/rules/known-directives.md +0 -44
  252. package/docs/rules/known-fragment-names.md +0 -69
  253. package/docs/rules/known-type-names.md +0 -17
  254. package/docs/rules/lone-anonymous-operation.md +0 -17
  255. package/docs/rules/lone-schema-definition.md +0 -17
  256. package/docs/rules/match-document-filename.md +0 -156
  257. package/docs/rules/naming-convention.md +0 -300
  258. package/docs/rules/no-anonymous-operations.md +0 -39
  259. package/docs/rules/no-case-insensitive-enum-values-duplicates.md +0 -43
  260. package/docs/rules/no-deprecated.md +0 -85
  261. package/docs/rules/no-duplicate-fields.md +0 -65
  262. package/docs/rules/no-fragment-cycles.md +0 -17
  263. package/docs/rules/no-hashtag-description.md +0 -59
  264. package/docs/rules/no-root-type.md +0 -53
  265. package/docs/rules/no-scalar-result-type-on-mutation.md +0 -37
  266. package/docs/rules/no-typename-prefix.md +0 -39
  267. package/docs/rules/no-undefined-variables.md +0 -17
  268. package/docs/rules/no-unreachable-types.md +0 -49
  269. package/docs/rules/no-unused-fields.md +0 -62
  270. package/docs/rules/no-unused-fragments.md +0 -17
  271. package/docs/rules/no-unused-variables.md +0 -17
  272. package/docs/rules/one-field-subscriptions.md +0 -17
  273. package/docs/rules/overlapping-fields-can-be-merged.md +0 -17
  274. package/docs/rules/possible-fragment-spread.md +0 -17
  275. package/docs/rules/possible-type-extension.md +0 -15
  276. package/docs/rules/provided-required-arguments.md +0 -17
  277. package/docs/rules/relay-arguments.md +0 -57
  278. package/docs/rules/relay-connection-types.md +0 -42
  279. package/docs/rules/relay-edge-types.md +0 -56
  280. package/docs/rules/relay-page-info.md +0 -32
  281. package/docs/rules/require-deprecation-date.md +0 -56
  282. package/docs/rules/require-deprecation-reason.md +0 -47
  283. package/docs/rules/require-description.md +0 -115
  284. package/docs/rules/require-field-of-type-query-in-mutation-result.md +0 -47
  285. package/docs/rules/require-id-when-available.md +0 -88
  286. package/docs/rules/scalar-leafs.md +0 -17
  287. package/docs/rules/selection-set-depth.md +0 -76
  288. package/docs/rules/strict-id-in-types.md +0 -130
  289. package/docs/rules/unique-argument-names.md +0 -17
  290. package/docs/rules/unique-directive-names-per-location.md +0 -17
  291. package/docs/rules/unique-directive-names.md +0 -17
  292. package/docs/rules/unique-enum-value-names.md +0 -15
  293. package/docs/rules/unique-field-definition-names.md +0 -17
  294. package/docs/rules/unique-fragment-name.md +0 -51
  295. package/docs/rules/unique-input-field-names.md +0 -17
  296. package/docs/rules/unique-operation-name.md +0 -55
  297. package/docs/rules/unique-operation-types.md +0 -17
  298. package/docs/rules/unique-type-names.md +0 -17
  299. package/docs/rules/unique-variable-names.md +0 -17
  300. package/docs/rules/value-literals-of-correct-type.md +0 -17
  301. package/docs/rules/variables-are-input-types.md +0 -17
  302. package/docs/rules/variables-in-allowed-position.md +0 -17
  303. package/estree-converter/converter.d.ts +0 -3
  304. package/estree-converter/index.d.ts +0 -3
  305. package/estree-converter/types.d.ts +0 -40
  306. package/estree-converter/utils.d.ts +0 -13
  307. package/graphql-config.d.ts +0 -3
  308. package/index.d.ts +0 -16
  309. package/index.js +0 -4653
  310. package/index.mjs +0 -4641
  311. package/parser.d.ts +0 -2
  312. package/processor.d.ts +0 -7
  313. package/rules/alphabetize.d.ts +0 -16
  314. package/rules/description-style.d.ts +0 -6
  315. package/rules/graphql-js-validation.d.ts +0 -2
  316. package/rules/index.d.ts +0 -41
  317. package/rules/input-name.d.ts +0 -9
  318. package/rules/match-document-filename.d.ts +0 -18
  319. package/rules/naming-convention.d.ts +0 -37
  320. package/rules/no-anonymous-operations.d.ts +0 -3
  321. package/rules/no-case-insensitive-enum-values-duplicates.d.ts +0 -3
  322. package/rules/no-deprecated.d.ts +0 -3
  323. package/rules/no-duplicate-fields.d.ts +0 -3
  324. package/rules/no-hashtag-description.d.ts +0 -3
  325. package/rules/no-root-type.d.ts +0 -7
  326. package/rules/no-scalar-result-type-on-mutation.d.ts +0 -3
  327. package/rules/no-typename-prefix.d.ts +0 -3
  328. package/rules/no-unreachable-types.d.ts +0 -3
  329. package/rules/no-unused-fields.d.ts +0 -3
  330. package/rules/relay-arguments.d.ts +0 -6
  331. package/rules/relay-connection-types.d.ts +0 -5
  332. package/rules/relay-edge-types.d.ts +0 -8
  333. package/rules/relay-page-info.d.ts +0 -3
  334. package/rules/require-deprecation-date.d.ts +0 -5
  335. package/rules/require-deprecation-reason.d.ts +0 -3
  336. package/rules/require-description.d.ts +0 -11
  337. package/rules/require-field-of-type-query-in-mutation-result.d.ts +0 -3
  338. package/rules/require-id-when-available.d.ts +0 -6
  339. package/rules/selection-set-depth.d.ts +0 -7
  340. package/rules/strict-id-in-types.d.ts +0 -11
  341. package/rules/unique-fragment-name.d.ts +0 -6
  342. package/rules/unique-operation-name.d.ts +0 -3
  343. package/schema.d.ts +0 -3
  344. package/testkit.d.ts +0 -27
  345. package/types.d.ts +0 -79
  346. package/utils.d.ts +0 -39
@@ -0,0 +1,111 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: !0 });
9
+ }, __copyProps = (to, from, except, desc) => {
10
+ if (from && typeof from == "object" || typeof from == "function")
11
+ for (let key of __getOwnPropNames(from))
12
+ !__hasOwnProp.call(to, key) && key !== except && __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
13
+ return to;
14
+ };
15
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: !0 }), mod);
16
+ var relay_connection_types_exports = {};
17
+ __export(relay_connection_types_exports, {
18
+ NON_OBJECT_TYPES: () => NON_OBJECT_TYPES,
19
+ rule: () => rule
20
+ });
21
+ module.exports = __toCommonJS(relay_connection_types_exports);
22
+ var import_graphql = require("graphql");
23
+ const MUST_BE_OBJECT_TYPE = "MUST_BE_OBJECT_TYPE", MUST_CONTAIN_FIELD_EDGES = "MUST_CONTAIN_FIELD_EDGES", MUST_CONTAIN_FIELD_PAGE_INFO = "MUST_CONTAIN_FIELD_PAGE_INFO", MUST_HAVE_CONNECTION_SUFFIX = "MUST_HAVE_CONNECTION_SUFFIX", EDGES_FIELD_MUST_RETURN_LIST_TYPE = "EDGES_FIELD_MUST_RETURN_LIST_TYPE", PAGE_INFO_FIELD_MUST_RETURN_NON_NULL_TYPE = "PAGE_INFO_FIELD_MUST_RETURN_NON_NULL_TYPE", NON_OBJECT_TYPES = [
24
+ import_graphql.Kind.SCALAR_TYPE_DEFINITION,
25
+ import_graphql.Kind.UNION_TYPE_DEFINITION,
26
+ import_graphql.Kind.UNION_TYPE_EXTENSION,
27
+ import_graphql.Kind.INPUT_OBJECT_TYPE_DEFINITION,
28
+ import_graphql.Kind.INPUT_OBJECT_TYPE_EXTENSION,
29
+ import_graphql.Kind.ENUM_TYPE_DEFINITION,
30
+ import_graphql.Kind.ENUM_TYPE_EXTENSION,
31
+ import_graphql.Kind.INTERFACE_TYPE_DEFINITION,
32
+ import_graphql.Kind.INTERFACE_TYPE_EXTENSION
33
+ ], notConnectionTypesSelector = `:matches(${NON_OBJECT_TYPES})[name.value=/Connection$/] > .name`, hasEdgesField = (node) => node.fields?.some((field) => field.name.value === "edges"), hasPageInfoField = (node) => node.fields?.some((field) => field.name.value === "pageInfo"), rule = {
34
+ meta: {
35
+ type: "problem",
36
+ docs: {
37
+ category: "Schema",
38
+ description: [
39
+ "Set of rules to follow Relay specification for Connection types.",
40
+ "",
41
+ '- Any type whose name ends in "Connection" is considered by spec to be a `Connection type`',
42
+ "- Connection type must be an Object type",
43
+ "- Connection type must contain a field `edges` that return a list type that wraps an edge type",
44
+ "- Connection type must contain a field `pageInfo` that return a non-null `PageInfo` Object type"
45
+ ].join(`
46
+ `),
47
+ url: "https://the-guild.dev/graphql/eslint/rules/relay-connection-types",
48
+ isDisabledForAllConfig: !0,
49
+ examples: [
50
+ {
51
+ title: "Incorrect",
52
+ code: (
53
+ /* GraphQL */
54
+ `
55
+ type UserPayload { # should be an Object type with \`Connection\` suffix
56
+ edges: UserEdge! # should return a list type
57
+ pageInfo: PageInfo # should return a non-null \`PageInfo\` Object type
58
+ }
59
+ `
60
+ )
61
+ },
62
+ {
63
+ title: "Correct",
64
+ code: (
65
+ /* GraphQL */
66
+ `
67
+ type UserConnection {
68
+ edges: [UserEdge]
69
+ pageInfo: PageInfo!
70
+ }
71
+ `
72
+ )
73
+ }
74
+ ]
75
+ },
76
+ messages: {
77
+ // Connection types
78
+ [MUST_BE_OBJECT_TYPE]: "Connection type must be an Object type.",
79
+ [MUST_HAVE_CONNECTION_SUFFIX]: "Connection type must have `Connection` suffix.",
80
+ [MUST_CONTAIN_FIELD_EDGES]: "Connection type must contain a field `edges` that return a list type.",
81
+ [MUST_CONTAIN_FIELD_PAGE_INFO]: "Connection type must contain a field `pageInfo` that return a non-null `PageInfo` Object type.",
82
+ [EDGES_FIELD_MUST_RETURN_LIST_TYPE]: "`edges` field must return a list type.",
83
+ [PAGE_INFO_FIELD_MUST_RETURN_NON_NULL_TYPE]: "`pageInfo` field must return a non-null `PageInfo` Object type."
84
+ },
85
+ schema: []
86
+ },
87
+ create(context) {
88
+ return {
89
+ [notConnectionTypesSelector](node) {
90
+ context.report({ node, messageId: MUST_BE_OBJECT_TYPE });
91
+ },
92
+ ":matches(ObjectTypeDefinition, ObjectTypeExtension)[name.value!=/Connection$/]"(node) {
93
+ hasEdgesField(node) && hasPageInfoField(node) && context.report({ node: node.name, messageId: MUST_HAVE_CONNECTION_SUFFIX });
94
+ },
95
+ ":matches(ObjectTypeDefinition, ObjectTypeExtension)[name.value=/Connection$/]"(node) {
96
+ hasEdgesField(node) || context.report({ node: node.name, messageId: MUST_CONTAIN_FIELD_EDGES }), hasPageInfoField(node) || context.report({ node: node.name, messageId: MUST_CONTAIN_FIELD_PAGE_INFO });
97
+ },
98
+ ":matches(ObjectTypeDefinition, ObjectTypeExtension)[name.value=/Connection$/] > FieldDefinition[name.value=edges] > .gqlType"(node) {
99
+ node.kind === import_graphql.Kind.LIST_TYPE || node.kind === import_graphql.Kind.NON_NULL_TYPE && node.gqlType.kind === import_graphql.Kind.LIST_TYPE || context.report({ node, messageId: EDGES_FIELD_MUST_RETURN_LIST_TYPE });
100
+ },
101
+ ":matches(ObjectTypeDefinition, ObjectTypeExtension)[name.value=/Connection$/] > FieldDefinition[name.value=pageInfo] > .gqlType"(node) {
102
+ node.kind === import_graphql.Kind.NON_NULL_TYPE && node.gqlType.kind === import_graphql.Kind.NAMED_TYPE && node.gqlType.name.value === "PageInfo" || context.report({ node, messageId: PAGE_INFO_FIELD_MUST_RETURN_NON_NULL_TYPE });
103
+ }
104
+ };
105
+ }
106
+ };
107
+ // Annotate the CommonJS export names for ESM import in node:
108
+ 0 && (module.exports = {
109
+ NON_OBJECT_TYPES,
110
+ rule
111
+ });
@@ -0,0 +1,40 @@
1
+ import { FromSchema } from 'json-schema-to-ts';
2
+ import { GraphQLESLintRule } from '../types.js';
3
+ import 'eslint';
4
+ import 'estree';
5
+ import 'graphql';
6
+ import '../siblings.js';
7
+ import '@graphql-tools/utils';
8
+ import '../estree-converter/types.js';
9
+ import 'graphql-config';
10
+
11
+ declare const schema: {
12
+ readonly type: "array";
13
+ readonly maxItems: 1;
14
+ readonly items: {
15
+ readonly type: "object";
16
+ readonly additionalProperties: false;
17
+ readonly minProperties: 1;
18
+ readonly properties: {
19
+ readonly withEdgeSuffix: {
20
+ readonly type: "boolean";
21
+ readonly default: true;
22
+ readonly description: "Edge type name must end in \"Edge\".";
23
+ };
24
+ readonly shouldImplementNode: {
25
+ readonly type: "boolean";
26
+ readonly default: true;
27
+ readonly description: "Edge type's field `node` must implement `Node` interface.";
28
+ };
29
+ readonly listTypeCanWrapOnlyEdgeType: {
30
+ readonly type: "boolean";
31
+ readonly default: true;
32
+ readonly description: "A list type should only wrap an edge type.";
33
+ };
34
+ };
35
+ };
36
+ };
37
+ type RuleOptions = FromSchema<typeof schema>;
38
+ declare const rule: GraphQLESLintRule<RuleOptions, true>;
39
+
40
+ export { RuleOptions, rule };
@@ -0,0 +1,161 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: !0 });
9
+ }, __copyProps = (to, from, except, desc) => {
10
+ if (from && typeof from == "object" || typeof from == "function")
11
+ for (let key of __getOwnPropNames(from))
12
+ !__hasOwnProp.call(to, key) && key !== except && __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
13
+ return to;
14
+ };
15
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: !0 }), mod);
16
+ var relay_edge_types_exports = {};
17
+ __export(relay_edge_types_exports, {
18
+ rule: () => rule
19
+ });
20
+ module.exports = __toCommonJS(relay_edge_types_exports);
21
+ var import_utils = require("@graphql-tools/utils"), import_graphql = require("graphql"), import_utils2 = require("../utils.js");
22
+ const RULE_ID = "relay-edge-types", MESSAGE_MUST_BE_OBJECT_TYPE = "MESSAGE_MUST_BE_OBJECT_TYPE", MESSAGE_MISSING_EDGE_SUFFIX = "MESSAGE_MISSING_EDGE_SUFFIX", MESSAGE_LIST_TYPE_ONLY_EDGE_TYPE = "MESSAGE_LIST_TYPE_ONLY_EDGE_TYPE", MESSAGE_SHOULD_IMPLEMENTS_NODE = "MESSAGE_SHOULD_IMPLEMENTS_NODE";
23
+ let edgeTypesCache;
24
+ function getEdgeTypes(schema2) {
25
+ if (edgeTypesCache)
26
+ return edgeTypesCache;
27
+ const edgeTypes = /* @__PURE__ */ new Set(), visitor = {
28
+ ObjectTypeDefinition(node) {
29
+ if (!node.name.value.endsWith("Connection"))
30
+ return;
31
+ const edges = node.fields?.find((field) => field.name.value === "edges");
32
+ if (edges) {
33
+ const edgesTypeName = (0, import_utils2.getTypeName)(edges), edgesType = schema2.getType(edgesTypeName);
34
+ (0, import_graphql.isObjectType)(edgesType) && edgeTypes.add(edgesTypeName);
35
+ }
36
+ }
37
+ }, astNode = (0, import_utils.getDocumentNodeFromSchema)(schema2);
38
+ return (0, import_graphql.visit)(astNode, visitor), edgeTypesCache = edgeTypes, edgeTypesCache;
39
+ }
40
+ const schema = {
41
+ type: "array",
42
+ maxItems: 1,
43
+ items: {
44
+ type: "object",
45
+ additionalProperties: !1,
46
+ minProperties: 1,
47
+ properties: {
48
+ withEdgeSuffix: {
49
+ type: "boolean",
50
+ default: !0,
51
+ description: 'Edge type name must end in "Edge".'
52
+ },
53
+ shouldImplementNode: {
54
+ type: "boolean",
55
+ default: !0,
56
+ description: "Edge type's field `node` must implement `Node` interface."
57
+ },
58
+ listTypeCanWrapOnlyEdgeType: {
59
+ type: "boolean",
60
+ default: !0,
61
+ description: "A list type should only wrap an edge type."
62
+ }
63
+ }
64
+ }
65
+ }, rule = {
66
+ meta: {
67
+ type: "problem",
68
+ docs: {
69
+ category: "Schema",
70
+ description: [
71
+ "Set of rules to follow Relay specification for Edge types.",
72
+ "",
73
+ "- 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",
74
+ "- Edge type must be an Object type",
75
+ "- 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",
76
+ "- Edge type must contain a field `cursor` that return either String, Scalar, or a non-null wrapper around one of those types",
77
+ '- Edge type name must end in "Edge" _(optional)_',
78
+ "- Edge type's field `node` must implement `Node` interface _(optional)_",
79
+ "- A list type should only wrap an edge type _(optional)_"
80
+ ].join(`
81
+ `),
82
+ url: `https://the-guild.dev/graphql/eslint/rules/${RULE_ID}`,
83
+ isDisabledForAllConfig: !0,
84
+ requiresSchema: !0,
85
+ examples: [
86
+ {
87
+ title: "Correct",
88
+ code: (
89
+ /* GraphQL */
90
+ `
91
+ type UserConnection {
92
+ edges: [UserEdge]
93
+ pageInfo: PageInfo!
94
+ }
95
+ `
96
+ )
97
+ }
98
+ ]
99
+ },
100
+ messages: {
101
+ [MESSAGE_MUST_BE_OBJECT_TYPE]: "Edge type must be an Object type.",
102
+ [MESSAGE_MISSING_EDGE_SUFFIX]: 'Edge type must have "Edge" suffix.',
103
+ [MESSAGE_LIST_TYPE_ONLY_EDGE_TYPE]: "A list type should only wrap an edge type.",
104
+ [MESSAGE_SHOULD_IMPLEMENTS_NODE]: "Edge type's field `node` must implement `Node` interface."
105
+ },
106
+ schema
107
+ },
108
+ create(context) {
109
+ const schema2 = (0, import_utils2.requireGraphQLSchemaFromContext)(RULE_ID, context), edgeTypes = getEdgeTypes(schema2), options = {
110
+ withEdgeSuffix: !0,
111
+ shouldImplementNode: !0,
112
+ listTypeCanWrapOnlyEdgeType: !0,
113
+ ...context.options[0]
114
+ }, isNamedOrNonNullNamed = (node) => node.kind === import_graphql.Kind.NAMED_TYPE || node.kind === import_graphql.Kind.NON_NULL_TYPE && node.gqlType.kind === import_graphql.Kind.NAMED_TYPE, checkNodeField = (node) => {
115
+ const nodeField = node.fields?.find((field) => field.name.value === "node"), message = "return either a Scalar, Enum, Object, Interface, Union, or a non-null wrapper around one of those types.";
116
+ if (!nodeField)
117
+ context.report({
118
+ node: node.name,
119
+ message: `Edge type must contain a field \`node\` that ${message}`
120
+ });
121
+ else if (!isNamedOrNonNullNamed(nodeField.gqlType))
122
+ context.report({ node: nodeField.name, message: `Field \`node\` must ${message}` });
123
+ else if (options.shouldImplementNode) {
124
+ const nodeReturnTypeName = (0, import_utils2.getTypeName)(nodeField.gqlType.rawNode()), type = schema2.getType(nodeReturnTypeName);
125
+ if (!(0, import_graphql.isObjectType)(type))
126
+ return;
127
+ type.astNode.interfaces?.some((n) => n.name.value === "Node") || context.report({ node: node.name, messageId: MESSAGE_SHOULD_IMPLEMENTS_NODE });
128
+ }
129
+ }, checkCursorField = (node) => {
130
+ const cursorField = node.fields?.find((field) => field.name.value === "cursor"), message = "return either a String, Scalar, or a non-null wrapper wrapper around one of those types.";
131
+ if (!cursorField) {
132
+ context.report({
133
+ node: node.name,
134
+ message: `Edge type must contain a field \`cursor\` that ${message}`
135
+ });
136
+ return;
137
+ }
138
+ const typeName = (0, import_utils2.getTypeName)(cursorField.rawNode());
139
+ (!isNamedOrNonNullNamed(cursorField.gqlType) || typeName !== "String" && !(0, import_graphql.isScalarType)(schema2.getType(typeName))) && context.report({ node: cursorField.name, message: `Field \`cursor\` must ${message}` });
140
+ }, listeners = {
141
+ ":matches(ObjectTypeDefinition, ObjectTypeExtension)[name.value=/Connection$/] > FieldDefinition[name.value=edges] > .gqlType Name"(node) {
142
+ const type = schema2.getType(node.value);
143
+ (0, import_graphql.isObjectType)(type) || context.report({ node, messageId: MESSAGE_MUST_BE_OBJECT_TYPE });
144
+ },
145
+ ":matches(ObjectTypeDefinition, ObjectTypeExtension)"(node) {
146
+ const typeName = node.name.value;
147
+ edgeTypes.has(typeName) && (checkNodeField(node), checkCursorField(node), options.withEdgeSuffix && !typeName.endsWith("Edge") && context.report({ node: node.name, messageId: MESSAGE_MISSING_EDGE_SUFFIX }));
148
+ }
149
+ };
150
+ return options.listTypeCanWrapOnlyEdgeType && (listeners["FieldDefinition > .gqlType"] = (node) => {
151
+ if (node.kind === import_graphql.Kind.LIST_TYPE || node.kind === import_graphql.Kind.NON_NULL_TYPE && node.gqlType.kind === import_graphql.Kind.LIST_TYPE) {
152
+ const typeName = (0, import_utils2.getTypeName)(node.rawNode());
153
+ edgeTypes.has(typeName) || context.report({ node, messageId: MESSAGE_LIST_TYPE_ONLY_EDGE_TYPE });
154
+ }
155
+ }), listeners;
156
+ }
157
+ };
158
+ // Annotate the CommonJS export names for ESM import in node:
159
+ 0 && (module.exports = {
160
+ rule
161
+ });
@@ -0,0 +1,13 @@
1
+ import { GraphQLESLintRule } from '../types.js';
2
+ import 'eslint';
3
+ import 'estree';
4
+ import 'graphql';
5
+ import 'json-schema-to-ts';
6
+ import '../siblings.js';
7
+ import '@graphql-tools/utils';
8
+ import '../estree-converter/types.js';
9
+ import 'graphql-config';
10
+
11
+ declare const rule: GraphQLESLintRule;
12
+
13
+ export { rule };
@@ -0,0 +1,98 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: !0 });
9
+ }, __copyProps = (to, from, except, desc) => {
10
+ if (from && typeof from == "object" || typeof from == "function")
11
+ for (let key of __getOwnPropNames(from))
12
+ !__hasOwnProp.call(to, key) && key !== except && __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
13
+ return to;
14
+ };
15
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: !0 }), mod);
16
+ var relay_page_info_exports = {};
17
+ __export(relay_page_info_exports, {
18
+ rule: () => rule
19
+ });
20
+ module.exports = __toCommonJS(relay_page_info_exports);
21
+ var import_graphql = require("graphql"), import_utils = require("../utils.js"), import_relay_connection_types = require("./relay-connection-types.js");
22
+ const RULE_ID = "relay-page-info", MESSAGE_MUST_EXIST = "MESSAGE_MUST_EXIST", MESSAGE_MUST_BE_OBJECT_TYPE = "MESSAGE_MUST_BE_OBJECT_TYPE", notPageInfoTypesSelector = `:matches(${import_relay_connection_types.NON_OBJECT_TYPES})[name.value=PageInfo] > .name`;
23
+ let hasPageInfoChecked = !1;
24
+ const rule = {
25
+ meta: {
26
+ type: "problem",
27
+ docs: {
28
+ category: "Schema",
29
+ description: [
30
+ "Set of rules to follow Relay specification for `PageInfo` object.",
31
+ "",
32
+ "- `PageInfo` must be an Object type",
33
+ "- `PageInfo` must contain fields `hasPreviousPage` and `hasNextPage`, that return non-null Boolean",
34
+ "- `PageInfo` must contain fields `startCursor` and `endCursor`, that return either String or Scalar, which can be null if there are no results"
35
+ ].join(`
36
+ `),
37
+ url: `https://the-guild.dev/graphql/eslint/rules/${RULE_ID}`,
38
+ examples: [
39
+ {
40
+ title: "Correct",
41
+ code: (
42
+ /* GraphQL */
43
+ `
44
+ type PageInfo {
45
+ hasPreviousPage: Boolean!
46
+ hasNextPage: Boolean!
47
+ startCursor: String
48
+ endCursor: String
49
+ }
50
+ `
51
+ )
52
+ }
53
+ ],
54
+ isDisabledForAllConfig: !0,
55
+ requiresSchema: !0
56
+ },
57
+ messages: {
58
+ [MESSAGE_MUST_EXIST]: "The server must provide a `PageInfo` object.",
59
+ [MESSAGE_MUST_BE_OBJECT_TYPE]: "`PageInfo` must be an Object type."
60
+ },
61
+ schema: []
62
+ },
63
+ create(context) {
64
+ const schema = (0, import_utils.requireGraphQLSchemaFromContext)(RULE_ID, context);
65
+ return hasPageInfoChecked || (schema.getType("PageInfo") || context.report({
66
+ loc: import_utils.REPORT_ON_FIRST_CHARACTER,
67
+ messageId: MESSAGE_MUST_EXIST
68
+ }), hasPageInfoChecked = !0), {
69
+ [notPageInfoTypesSelector](node) {
70
+ context.report({ node, messageId: MESSAGE_MUST_BE_OBJECT_TYPE });
71
+ },
72
+ "ObjectTypeDefinition[name.value=PageInfo]"(node) {
73
+ const fieldMap = Object.fromEntries(
74
+ node.fields?.map((field) => [field.name.value, field]) || []
75
+ ), checkField = (fieldName, typeName) => {
76
+ const field = fieldMap[fieldName];
77
+ let isAllowedType = !1;
78
+ if (field) {
79
+ const type = field.gqlType;
80
+ typeName === "Boolean" ? isAllowedType = type.kind === import_graphql.Kind.NON_NULL_TYPE && type.gqlType.kind === import_graphql.Kind.NAMED_TYPE && type.gqlType.name.value === "Boolean" : type.kind === import_graphql.Kind.NAMED_TYPE && (isAllowedType = type.name.value === "String" || (0, import_graphql.isScalarType)(schema.getType(type.name.value)));
81
+ }
82
+ if (!isAllowedType) {
83
+ const returnType = typeName === "Boolean" ? "non-null Boolean" : "either String or Scalar, which can be null if there are no results";
84
+ context.report({
85
+ node: field ? field.name : node.name,
86
+ message: field ? `Field \`${fieldName}\` must return ${returnType}.` : `\`PageInfo\` must contain a field \`${fieldName}\`, that return ${returnType}.`
87
+ });
88
+ }
89
+ };
90
+ checkField("hasPreviousPage", "Boolean"), checkField("hasNextPage", "Boolean"), checkField("startCursor", "String"), checkField("endCursor", "String");
91
+ }
92
+ };
93
+ }
94
+ };
95
+ // Annotate the CommonJS export names for ESM import in node:
96
+ 0 && (module.exports = {
97
+ rule
98
+ });
@@ -0,0 +1,27 @@
1
+ import { FromSchema } from 'json-schema-to-ts';
2
+ import { GraphQLESLintRule } from '../types.js';
3
+ import 'eslint';
4
+ import 'estree';
5
+ import 'graphql';
6
+ import '../siblings.js';
7
+ import '@graphql-tools/utils';
8
+ import '../estree-converter/types.js';
9
+ import 'graphql-config';
10
+
11
+ declare const schema: {
12
+ readonly type: "array";
13
+ readonly maxItems: 1;
14
+ readonly items: {
15
+ readonly type: "object";
16
+ readonly additionalProperties: false;
17
+ readonly properties: {
18
+ readonly argumentName: {
19
+ readonly type: "string";
20
+ };
21
+ };
22
+ };
23
+ };
24
+ type RuleOptions = FromSchema<typeof schema>;
25
+ declare const rule: GraphQLESLintRule<RuleOptions>;
26
+
27
+ export { RuleOptions, rule };
@@ -0,0 +1,148 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: !0 });
9
+ }, __copyProps = (to, from, except, desc) => {
10
+ if (from && typeof from == "object" || typeof from == "function")
11
+ for (let key of __getOwnPropNames(from))
12
+ !__hasOwnProp.call(to, key) && key !== except && __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
13
+ return to;
14
+ };
15
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: !0 }), mod);
16
+ var require_deprecation_date_exports = {};
17
+ __export(require_deprecation_date_exports, {
18
+ rule: () => rule
19
+ });
20
+ module.exports = __toCommonJS(require_deprecation_date_exports);
21
+ var import_estree_converter = require("../estree-converter/index.js"), import_utils = require("../utils.js");
22
+ const DATE_REGEX = /^\d{2}\/\d{2}\/\d{4}$/, MESSAGE_REQUIRE_DATE = "MESSAGE_REQUIRE_DATE", MESSAGE_INVALID_FORMAT = "MESSAGE_INVALID_FORMAT", MESSAGE_INVALID_DATE = "MESSAGE_INVALID_DATE", MESSAGE_CAN_BE_REMOVED = "MESSAGE_CAN_BE_REMOVED", schema = {
23
+ type: "array",
24
+ maxItems: 1,
25
+ items: {
26
+ type: "object",
27
+ additionalProperties: !1,
28
+ properties: {
29
+ argumentName: {
30
+ type: "string"
31
+ }
32
+ }
33
+ }
34
+ }, rule = {
35
+ meta: {
36
+ type: "suggestion",
37
+ hasSuggestions: !0,
38
+ docs: {
39
+ category: "Schema",
40
+ description: "Require deletion date on `@deprecated` directive. Suggest removing deprecated things after deprecated date.",
41
+ url: "https://the-guild.dev/graphql/eslint/rules/require-deprecation-date",
42
+ examples: [
43
+ {
44
+ title: "Incorrect",
45
+ code: (
46
+ /* GraphQL */
47
+ `
48
+ type User {
49
+ firstname: String @deprecated
50
+ firstName: String
51
+ }
52
+ `
53
+ )
54
+ },
55
+ {
56
+ title: "Incorrect",
57
+ code: (
58
+ /* GraphQL */
59
+ `
60
+ type User {
61
+ firstname: String @deprecated(reason: "Use 'firstName' instead")
62
+ firstName: String
63
+ }
64
+ `
65
+ )
66
+ },
67
+ {
68
+ title: "Correct",
69
+ code: (
70
+ /* GraphQL */
71
+ `
72
+ type User {
73
+ firstname: String
74
+ @deprecated(reason: "Use 'firstName' instead", deletionDate: "25/12/2022")
75
+ firstName: String
76
+ }
77
+ `
78
+ )
79
+ }
80
+ ]
81
+ },
82
+ messages: {
83
+ [MESSAGE_REQUIRE_DATE]: 'Directive "@deprecated" must have a deletion date for {{ nodeName }}',
84
+ [MESSAGE_INVALID_FORMAT]: 'Deletion date must be in format "DD/MM/YYYY" for {{ nodeName }}',
85
+ [MESSAGE_INVALID_DATE]: 'Invalid "{{ deletionDate }}" deletion date for {{ nodeName }}',
86
+ [MESSAGE_CAN_BE_REMOVED]: "{{ nodeName }} \u0441an be removed"
87
+ },
88
+ schema
89
+ },
90
+ create(context) {
91
+ return {
92
+ "Directive[name.value=deprecated]"(node) {
93
+ const argName = context.options[0]?.argumentName || "deletionDate", deletionDateNode = node.arguments?.find((arg) => arg.name.value === argName);
94
+ if (!deletionDateNode) {
95
+ context.report({
96
+ node: node.name,
97
+ messageId: MESSAGE_REQUIRE_DATE,
98
+ data: {
99
+ nodeName: (0, import_utils.getNodeName)(node.parent)
100
+ }
101
+ });
102
+ return;
103
+ }
104
+ const deletionDate = (0, import_estree_converter.valueFromNode)(deletionDateNode.value);
105
+ if (!DATE_REGEX.test(deletionDate)) {
106
+ context.report({
107
+ node: deletionDateNode.value,
108
+ messageId: MESSAGE_INVALID_FORMAT,
109
+ data: { nodeName: (0, import_utils.getNodeName)(node.parent) }
110
+ });
111
+ return;
112
+ }
113
+ let [day, month, year] = deletionDate.split("/");
114
+ day = day.padStart(2, "0"), month = month.padStart(2, "0");
115
+ const deletionDateInMS = Date.parse(`${year}-${month}-${day}`);
116
+ if (Number.isNaN(deletionDateInMS)) {
117
+ context.report({
118
+ node: deletionDateNode.value,
119
+ messageId: MESSAGE_INVALID_DATE,
120
+ data: {
121
+ deletionDate,
122
+ nodeName: (0, import_utils.getNodeName)(node.parent)
123
+ }
124
+ });
125
+ return;
126
+ }
127
+ if (Date.now() > deletionDateInMS) {
128
+ const { parent } = node, nodeName = parent.name.value;
129
+ context.report({
130
+ node: parent.name,
131
+ messageId: MESSAGE_CAN_BE_REMOVED,
132
+ data: { nodeName: (0, import_utils.getNodeName)(parent) },
133
+ suggest: [
134
+ {
135
+ desc: `Remove \`${nodeName}\``,
136
+ fix: (fixer) => fixer.remove(parent)
137
+ }
138
+ ]
139
+ });
140
+ }
141
+ }
142
+ };
143
+ }
144
+ };
145
+ // Annotate the CommonJS export names for ESM import in node:
146
+ 0 && (module.exports = {
147
+ rule
148
+ });
@@ -0,0 +1,13 @@
1
+ import { GraphQLESLintRule } from '../types.js';
2
+ import 'eslint';
3
+ import 'estree';
4
+ import 'graphql';
5
+ import 'json-schema-to-ts';
6
+ import '../siblings.js';
7
+ import '@graphql-tools/utils';
8
+ import '../estree-converter/types.js';
9
+ import 'graphql-config';
10
+
11
+ declare const rule: GraphQLESLintRule;
12
+
13
+ export { rule };