@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
package/esm/schema.js ADDED
@@ -0,0 +1,27 @@
1
+ import "./chunk-U3TKCM4X.js";
2
+ import debugFactory from "debug";
3
+ import fg from "fast-glob";
4
+ import { GraphQLSchema } from "graphql";
5
+ import { ModuleCache } from "./cache.js";
6
+ const schemaCache = new ModuleCache(), debug = debugFactory("graphql-eslint:schema");
7
+ function getSchema(project) {
8
+ const schemaKey = project.schema;
9
+ if (!schemaKey)
10
+ return null;
11
+ const cache = schemaCache.get(schemaKey);
12
+ if (cache)
13
+ return cache;
14
+ debug("Loading schema from %o", project.schema);
15
+ const schema = project.loadSchemaSync(project.schema, "GraphQLSchema", {
16
+ pluckConfig: project.extensions.pluckConfig
17
+ });
18
+ if (debug.enabled) {
19
+ debug("Schema loaded: %o", schema instanceof GraphQLSchema);
20
+ const schemaPaths = fg.sync(project.schema, { absolute: !0 });
21
+ debug("Schema pointers %O", schemaPaths);
22
+ }
23
+ return schemaCache.set(schemaKey, schema), schema;
24
+ }
25
+ export {
26
+ getSchema
27
+ };
@@ -0,0 +1,24 @@
1
+ import { Source } from '@graphql-tools/utils';
2
+ import { FragmentDefinitionNode, OperationDefinitionNode, SelectionSetNode, OperationTypeNode } from 'graphql';
3
+
4
+ type FragmentSource = {
5
+ filePath: string;
6
+ document: FragmentDefinitionNode;
7
+ };
8
+ type OperationSource = {
9
+ filePath: string;
10
+ document: OperationDefinitionNode;
11
+ };
12
+ type SiblingOperations = {
13
+ available: boolean;
14
+ getFragment(fragmentName: string): FragmentSource[];
15
+ getFragments(): FragmentSource[];
16
+ getFragmentByType(typeName: string): FragmentSource[];
17
+ getFragmentsInUse(baseOperation: FragmentDefinitionNode | OperationDefinitionNode | SelectionSetNode, recursive?: boolean): FragmentDefinitionNode[];
18
+ getOperation(operationName: string): OperationSource[];
19
+ getOperations(): OperationSource[];
20
+ getOperationByType(operationType: OperationTypeNode): OperationSource[];
21
+ };
22
+ declare function getSiblings(documents: Source[]): SiblingOperations;
23
+
24
+ export { FragmentSource, OperationSource, SiblingOperations, getSiblings };
@@ -0,0 +1,80 @@
1
+ import "./chunk-U3TKCM4X.js";
2
+ import {
3
+ Kind,
4
+ visit
5
+ } from "graphql";
6
+ import { logger } from "./utils.js";
7
+ const siblingOperationsCache = /* @__PURE__ */ new Map();
8
+ function getSiblings(documents) {
9
+ if (documents.length === 0) {
10
+ let printed = !1;
11
+ const noopWarn = () => (printed || (logger.warn(
12
+ "getSiblingOperations was called without any operations. Make sure to set graphql-config `documents` field to make this feature available! See https://the-guild.dev/graphql/config/docs/user/documents for more info"
13
+ ), printed = !0), []);
14
+ return {
15
+ available: !1,
16
+ getFragment: noopWarn,
17
+ getFragments: noopWarn,
18
+ getFragmentByType: noopWarn,
19
+ getFragmentsInUse: noopWarn,
20
+ getOperation: noopWarn,
21
+ getOperations: noopWarn,
22
+ getOperationByType: noopWarn
23
+ };
24
+ }
25
+ const value = siblingOperationsCache.get(documents);
26
+ if (value)
27
+ return value;
28
+ let fragmentsCache = null;
29
+ const getFragments = () => {
30
+ if (fragmentsCache === null) {
31
+ const result = [];
32
+ for (const source of documents)
33
+ for (const definition of source.document?.definitions || [])
34
+ definition.kind === Kind.FRAGMENT_DEFINITION && result.push({
35
+ filePath: source.location,
36
+ document: definition
37
+ });
38
+ fragmentsCache = result;
39
+ }
40
+ return fragmentsCache;
41
+ };
42
+ let cachedOperations = null;
43
+ const getOperations = () => {
44
+ if (cachedOperations === null) {
45
+ const result = [];
46
+ for (const source of documents)
47
+ for (const definition of source.document?.definitions || [])
48
+ definition.kind === Kind.OPERATION_DEFINITION && result.push({
49
+ filePath: source.location,
50
+ document: definition
51
+ });
52
+ cachedOperations = result;
53
+ }
54
+ return cachedOperations;
55
+ }, getFragment = (name) => getFragments().filter((f) => f.document.name.value === name), collectFragments = (selectable, recursive, collected = /* @__PURE__ */ new Map()) => (visit(selectable, {
56
+ FragmentSpread(spread) {
57
+ const fragmentName = spread.name.value, [fragment] = getFragment(fragmentName);
58
+ if (!fragment) {
59
+ logger.warn(
60
+ `Unable to locate fragment named "${fragmentName}", please make sure it's loaded using "parserOptions.operations"`
61
+ );
62
+ return;
63
+ }
64
+ collected.has(fragmentName) || (collected.set(fragmentName, fragment.document), recursive && collectFragments(fragment.document, recursive, collected));
65
+ }
66
+ }), collected), siblingOperations = {
67
+ available: !0,
68
+ getFragment,
69
+ getFragments,
70
+ getFragmentByType: (typeName) => getFragments().filter((f) => f.document.typeCondition.name.value === typeName),
71
+ getFragmentsInUse: (selectable, recursive = !0) => Array.from(collectFragments(selectable, recursive).values()),
72
+ getOperation: (name) => getOperations().filter((o) => o.document.name?.value === name),
73
+ getOperations,
74
+ getOperationByType: (type) => getOperations().filter((o) => o.document.operation === type)
75
+ };
76
+ return siblingOperationsCache.set(documents, siblingOperations), siblingOperations;
77
+ }
78
+ export {
79
+ getSiblings
80
+ };
@@ -0,0 +1,75 @@
1
+ import { Linter, Rule, AST } from 'eslint';
2
+ import * as ESTree from 'estree';
3
+ import { GraphQLSchema, ASTKindToNode } from 'graphql';
4
+ import { JSONSchema } from 'json-schema-to-ts';
5
+ import { SiblingOperations } from './siblings.mjs';
6
+ import { GraphQLESTreeNode } from './estree-converter/types.mjs';
7
+ import { IGraphQLConfig } from 'graphql-config';
8
+ import '@graphql-tools/utils';
9
+
10
+ type Schema = GraphQLSchema | null;
11
+ type Pointer = string | string[];
12
+ interface ParserOptions {
13
+ graphQLConfig?: IGraphQLConfig;
14
+ filePath: string;
15
+ }
16
+ type ParserServices = {
17
+ schema: Schema;
18
+ siblingOperations: SiblingOperations;
19
+ };
20
+ type GraphQLESLintParseResult = Linter.ESLintParseResult & {
21
+ services: ParserServices;
22
+ };
23
+ type Location = AST.SourceLocation | ESTree.Position;
24
+ type ReportDescriptorLocation = {
25
+ loc: Location;
26
+ } | {
27
+ node: {
28
+ loc: Location;
29
+ };
30
+ };
31
+ type ReportDescriptor = ReportDescriptorLocation & Rule.ReportDescriptorMessage & Rule.ReportDescriptorOptions;
32
+ type GraphQLESLintRuleContext<Options = any[]> = Omit<Rule.RuleContext, 'options' | 'parserServices' | 'report'> & {
33
+ options: Options;
34
+ parserServices: ParserServices;
35
+ report(descriptor: ReportDescriptor): void;
36
+ };
37
+ type CategoryType = 'Operations' | 'Schema';
38
+ type RuleMetaDataDocs = Required<Rule.RuleMetaData>['docs'];
39
+ type RuleDocsInfo<T> = Omit<RuleMetaDataDocs, 'category' | 'suggestion'> & {
40
+ category: CategoryType | CategoryType[];
41
+ requiresSchema?: true;
42
+ requiresSiblings?: true;
43
+ examples?: {
44
+ title: string;
45
+ code: string;
46
+ usage?: T;
47
+ }[];
48
+ configOptions?: T | {
49
+ schema?: T;
50
+ operations?: T;
51
+ };
52
+ graphQLJSRuleName?: string;
53
+ isDisabledForAllConfig?: true;
54
+ };
55
+ type GraphQLESLintRuleListener<WithTypeInfo extends boolean = false> = Record<string, any> & {
56
+ [K in keyof ASTKindToNode]?: (node: GraphQLESTreeNode<ASTKindToNode[K], WithTypeInfo>) => void;
57
+ };
58
+ type GraphQLESLintRule<Options = [], WithTypeInfo extends boolean = false> = {
59
+ meta: Omit<Rule.RuleMetaData, 'docs' | 'schema'> & {
60
+ docs?: RuleDocsInfo<Options>;
61
+ schema: Readonly<JSONSchema> | [];
62
+ };
63
+ create(context: GraphQLESLintRuleContext<Options>): GraphQLESLintRuleListener<WithTypeInfo>;
64
+ };
65
+ type ValueOf<T> = T[keyof T];
66
+ type Id<T> = {
67
+ [P in keyof T]: T[P];
68
+ } & {};
69
+ type OmitDistributive<T, K extends PropertyKey> = T extends object ? Id<OmitRecursively<T, K>> : T;
70
+ type OmitRecursively<T extends object, K extends PropertyKey> = Omit<{
71
+ [P in keyof T]: OmitDistributive<T[P], K>;
72
+ }, K>;
73
+ type ConfigName = 'operations-all' | 'operations-recommended' | 'schema-all' | 'schema-recommended' | 'schema-relay';
74
+
75
+ export { CategoryType, ConfigName, GraphQLESLintParseResult, GraphQLESLintRule, GraphQLESLintRuleContext, GraphQLESLintRuleListener, OmitRecursively, ParserOptions, ParserServices, Pointer, ReportDescriptor, RuleDocsInfo, Schema, ValueOf };
package/esm/types.js ADDED
File without changes
@@ -0,0 +1,45 @@
1
+ import { AST } from 'eslint';
2
+ import { Position } from 'estree';
3
+ import { GraphQLSchema, ASTNode, Kind } from 'graphql';
4
+ import { SiblingOperations } from './siblings.mjs';
5
+ import { GraphQLESLintRuleContext } from './types.mjs';
6
+ import { GraphQLESTreeNode } from './estree-converter/types.mjs';
7
+ import '@graphql-tools/utils';
8
+ import 'json-schema-to-ts';
9
+ import 'graphql-config';
10
+
11
+ declare function requireSiblingsOperations(ruleId: string, context: GraphQLESLintRuleContext): SiblingOperations | never;
12
+ declare function requireGraphQLSchemaFromContext(ruleId: string, context: GraphQLESLintRuleContext): GraphQLSchema | never;
13
+ declare const logger: {
14
+ error: (...args: unknown[]) => void;
15
+ warn: (...args: unknown[]) => void;
16
+ };
17
+ declare const normalizePath: (path: string) => string;
18
+ declare const VIRTUAL_DOCUMENT_REGEX: RegExp;
19
+ declare const CWD: string;
20
+ declare const getTypeName: (node: ASTNode) => string;
21
+ declare const TYPES_KINDS: readonly [Kind.OBJECT_TYPE_DEFINITION, Kind.INTERFACE_TYPE_DEFINITION, Kind.ENUM_TYPE_DEFINITION, Kind.SCALAR_TYPE_DEFINITION, Kind.INPUT_OBJECT_TYPE_DEFINITION, Kind.UNION_TYPE_DEFINITION];
22
+ type CaseStyle = 'camelCase' | 'kebab-case' | 'PascalCase' | 'snake_case' | 'UPPER_CASE';
23
+ declare const pascalCase: (str: string) => string;
24
+ declare const camelCase: (str: string) => string;
25
+ declare const convertCase: (style: CaseStyle, str: string) => string;
26
+ declare function getLocation(start: Position, fieldName?: string): AST.SourceLocation;
27
+ declare const REPORT_ON_FIRST_CHARACTER: {
28
+ column: number;
29
+ line: number;
30
+ };
31
+ declare const ARRAY_DEFAULT_OPTIONS: {
32
+ readonly type: "array";
33
+ readonly uniqueItems: true;
34
+ readonly minItems: 1;
35
+ readonly items: {
36
+ readonly type: "string";
37
+ };
38
+ };
39
+ declare const englishJoinWords: (words: string[]) => string;
40
+ type Truthy<T> = T extends '' | 0 | false | null | undefined ? never : T;
41
+ declare function truthy<T>(value: T): value is Truthy<T>;
42
+ declare function displayNodeName(node: GraphQLESTreeNode<ASTNode>): string;
43
+ declare function getNodeName(node: GraphQLESTreeNode<ASTNode>): string;
44
+
45
+ export { ARRAY_DEFAULT_OPTIONS, CWD, CaseStyle, REPORT_ON_FIRST_CHARACTER, TYPES_KINDS, VIRTUAL_DOCUMENT_REGEX, camelCase, convertCase, displayNodeName, englishJoinWords, getLocation, getNodeName, getTypeName, logger, normalizePath, pascalCase, requireGraphQLSchemaFromContext, requireSiblingsOperations, truthy };
package/esm/utils.js ADDED
@@ -0,0 +1,144 @@
1
+ import "./chunk-U3TKCM4X.js";
2
+ import { Kind } from "graphql";
3
+ import lowerCase from "lodash.lowercase";
4
+ function requireSiblingsOperations(ruleId, context) {
5
+ const { siblingOperations } = context.sourceCode.parserServices;
6
+ if (!siblingOperations.available)
7
+ throw new Error(
8
+ `Rule \`${ruleId}\` requires graphql-config \`documents\` field to be set and loaded. See https://the-guild.dev/graphql/config/docs/user/documents for more info`
9
+ );
10
+ return siblingOperations;
11
+ }
12
+ function requireGraphQLSchemaFromContext(ruleId, context) {
13
+ const { schema } = context.sourceCode.parserServices;
14
+ if (!schema)
15
+ throw new Error(
16
+ `Rule \`${ruleId}\` requires graphql-config \`schema\` field to be set and loaded. See https://the-guild.dev/graphql/config/docs/user/schema for more info`
17
+ );
18
+ return schema;
19
+ }
20
+ const chalk = {
21
+ red: (str) => `\x1B[31m${str}\x1B[39m`,
22
+ yellow: (str) => `\x1B[33m${str}\x1B[39m`
23
+ }, logger = {
24
+ error: (...args) => (
25
+ // eslint-disable-next-line no-console
26
+ console.error(chalk.red("error"), "[graphql-eslint]", ...args)
27
+ ),
28
+ warn: (...args) => (
29
+ // eslint-disable-next-line no-console
30
+ console.warn(chalk.yellow("warning"), "[graphql-eslint]", ...args)
31
+ )
32
+ }, normalizePath = (path) => (path || "").replace(/\\/g, "/"), VIRTUAL_DOCUMENT_REGEX = /\/\d+_document.graphql$/, CWD = process.cwd(), getTypeName = (node) => "type" in node ? getTypeName(node.type) : "name" in node && node.name ? node.name.value : "", TYPES_KINDS = [
33
+ Kind.OBJECT_TYPE_DEFINITION,
34
+ Kind.INTERFACE_TYPE_DEFINITION,
35
+ Kind.ENUM_TYPE_DEFINITION,
36
+ Kind.SCALAR_TYPE_DEFINITION,
37
+ Kind.INPUT_OBJECT_TYPE_DEFINITION,
38
+ Kind.UNION_TYPE_DEFINITION
39
+ ], pascalCase = (str) => lowerCase(str).split(" ").map((word) => word.charAt(0).toUpperCase() + word.slice(1)).join(""), camelCase = (str) => {
40
+ const result = pascalCase(str);
41
+ return result.charAt(0).toLowerCase() + result.slice(1);
42
+ }, convertCase = (style, str) => {
43
+ switch (style) {
44
+ case "camelCase":
45
+ return camelCase(str);
46
+ case "PascalCase":
47
+ return pascalCase(str);
48
+ case "snake_case":
49
+ return lowerCase(str).replace(/ /g, "_");
50
+ case "UPPER_CASE":
51
+ return lowerCase(str).replace(/ /g, "_").toUpperCase();
52
+ case "kebab-case":
53
+ return lowerCase(str).replace(/ /g, "-");
54
+ }
55
+ };
56
+ function getLocation(start, fieldName = "") {
57
+ const { line, column } = start;
58
+ return {
59
+ start: {
60
+ line,
61
+ column
62
+ },
63
+ end: {
64
+ line,
65
+ column: column + fieldName.length
66
+ }
67
+ };
68
+ }
69
+ const REPORT_ON_FIRST_CHARACTER = { column: 0, line: 1 }, ARRAY_DEFAULT_OPTIONS = {
70
+ type: "array",
71
+ uniqueItems: !0,
72
+ minItems: 1,
73
+ items: {
74
+ type: "string"
75
+ }
76
+ }, englishJoinWords = (words) => new Intl.ListFormat("en-US", { type: "disjunction" }).format(words);
77
+ function truthy(value) {
78
+ return !!value;
79
+ }
80
+ const DisplayNodeNameMap = {
81
+ [Kind.OBJECT_TYPE_DEFINITION]: "type",
82
+ [Kind.OBJECT_TYPE_EXTENSION]: "type",
83
+ [Kind.INTERFACE_TYPE_DEFINITION]: "interface",
84
+ [Kind.INTERFACE_TYPE_EXTENSION]: "interface",
85
+ [Kind.ENUM_TYPE_DEFINITION]: "enum",
86
+ [Kind.ENUM_TYPE_EXTENSION]: "enum",
87
+ [Kind.SCALAR_TYPE_DEFINITION]: "scalar",
88
+ [Kind.INPUT_OBJECT_TYPE_DEFINITION]: "input",
89
+ [Kind.INPUT_OBJECT_TYPE_EXTENSION]: "input",
90
+ [Kind.UNION_TYPE_DEFINITION]: "union",
91
+ [Kind.UNION_TYPE_EXTENSION]: "union",
92
+ [Kind.DIRECTIVE_DEFINITION]: "directive",
93
+ [Kind.FIELD_DEFINITION]: "field",
94
+ [Kind.ENUM_VALUE_DEFINITION]: "enum value",
95
+ [Kind.INPUT_VALUE_DEFINITION]: "input value",
96
+ [Kind.ARGUMENT]: "argument",
97
+ [Kind.VARIABLE]: "variable",
98
+ [Kind.FRAGMENT_DEFINITION]: "fragment",
99
+ [Kind.OPERATION_DEFINITION]: "operation",
100
+ [Kind.FIELD]: "field"
101
+ };
102
+ function displayNodeName(node) {
103
+ return `${node.kind === Kind.OPERATION_DEFINITION ? node.operation : DisplayNodeNameMap[node.kind]} "${"alias" in node && node.alias?.value || "name" in node && node.name?.value}"`;
104
+ }
105
+ function getNodeName(node) {
106
+ switch (node.kind) {
107
+ case Kind.OBJECT_TYPE_DEFINITION:
108
+ case Kind.OBJECT_TYPE_EXTENSION:
109
+ case Kind.INTERFACE_TYPE_DEFINITION:
110
+ case Kind.ENUM_TYPE_DEFINITION:
111
+ case Kind.SCALAR_TYPE_DEFINITION:
112
+ case Kind.INPUT_OBJECT_TYPE_DEFINITION:
113
+ case Kind.UNION_TYPE_DEFINITION:
114
+ case Kind.DIRECTIVE_DEFINITION:
115
+ return displayNodeName(node);
116
+ case Kind.FIELD_DEFINITION:
117
+ case Kind.INPUT_VALUE_DEFINITION:
118
+ case Kind.ENUM_VALUE_DEFINITION:
119
+ return `${displayNodeName(node)} in ${displayNodeName(node.parent)}`;
120
+ case Kind.OPERATION_DEFINITION:
121
+ return node.name ? displayNodeName(node) : node.operation;
122
+ }
123
+ return "";
124
+ }
125
+ export {
126
+ ARRAY_DEFAULT_OPTIONS,
127
+ CWD,
128
+ REPORT_ON_FIRST_CHARACTER,
129
+ TYPES_KINDS,
130
+ VIRTUAL_DOCUMENT_REGEX,
131
+ camelCase,
132
+ convertCase,
133
+ displayNodeName,
134
+ englishJoinWords,
135
+ getLocation,
136
+ getNodeName,
137
+ getTypeName,
138
+ logger,
139
+ normalizePath,
140
+ pascalCase,
141
+ requireGraphQLSchemaFromContext,
142
+ requireSiblingsOperations,
143
+ truthy
144
+ };