@gqlkit-ts/cli 0.1.0 → 0.3.0

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 (339) hide show
  1. package/dist/auto-type-generator/auto-type-generator.d.ts +26 -4
  2. package/dist/auto-type-generator/auto-type-generator.d.ts.map +1 -1
  3. package/dist/auto-type-generator/auto-type-generator.js +846 -152
  4. package/dist/auto-type-generator/auto-type-generator.js.map +1 -1
  5. package/dist/auto-type-generator/index.d.ts +9 -2
  6. package/dist/auto-type-generator/index.d.ts.map +1 -1
  7. package/dist/auto-type-generator/index.js +3 -0
  8. package/dist/auto-type-generator/index.js.map +1 -1
  9. package/dist/auto-type-generator/inline-enum-collector.d.ts +39 -0
  10. package/dist/auto-type-generator/inline-enum-collector.d.ts.map +1 -0
  11. package/dist/auto-type-generator/inline-enum-collector.js +193 -0
  12. package/dist/auto-type-generator/inline-enum-collector.js.map +1 -0
  13. package/dist/auto-type-generator/inline-object-traverser.d.ts +20 -0
  14. package/dist/auto-type-generator/inline-object-traverser.d.ts.map +1 -0
  15. package/dist/auto-type-generator/inline-object-traverser.js +22 -0
  16. package/dist/auto-type-generator/inline-object-traverser.js.map +1 -0
  17. package/dist/auto-type-generator/inline-union-collector.d.ts +29 -0
  18. package/dist/auto-type-generator/inline-union-collector.d.ts.map +1 -0
  19. package/dist/auto-type-generator/inline-union-collector.js +216 -0
  20. package/dist/auto-type-generator/inline-union-collector.js.map +1 -0
  21. package/dist/auto-type-generator/inline-union-types.d.ts +29 -0
  22. package/dist/auto-type-generator/inline-union-types.d.ts.map +1 -0
  23. package/dist/auto-type-generator/inline-union-types.js +2 -0
  24. package/dist/auto-type-generator/inline-union-types.js.map +1 -0
  25. package/dist/auto-type-generator/inline-union-validator.d.ts +76 -0
  26. package/dist/auto-type-generator/inline-union-validator.d.ts.map +1 -0
  27. package/dist/auto-type-generator/inline-union-validator.js +329 -0
  28. package/dist/auto-type-generator/inline-union-validator.js.map +1 -0
  29. package/dist/auto-type-generator/naming-convention.d.ts +22 -1
  30. package/dist/auto-type-generator/naming-convention.d.ts.map +1 -1
  31. package/dist/auto-type-generator/naming-convention.js +24 -0
  32. package/dist/auto-type-generator/naming-convention.js.map +1 -1
  33. package/dist/auto-type-generator/resolve-type-generator.d.ts +20 -0
  34. package/dist/auto-type-generator/resolve-type-generator.d.ts.map +1 -0
  35. package/dist/auto-type-generator/resolve-type-generator.js +2 -0
  36. package/dist/auto-type-generator/resolve-type-generator.js.map +1 -0
  37. package/dist/auto-type-generator/resolver-field-iterator.d.ts +13 -0
  38. package/dist/auto-type-generator/resolver-field-iterator.d.ts.map +1 -0
  39. package/dist/auto-type-generator/resolver-field-iterator.js +22 -0
  40. package/dist/auto-type-generator/resolver-field-iterator.js.map +1 -0
  41. package/dist/auto-type-generator/typename-extractor.d.ts +26 -0
  42. package/dist/auto-type-generator/typename-extractor.d.ts.map +1 -0
  43. package/dist/auto-type-generator/typename-extractor.js +142 -0
  44. package/dist/auto-type-generator/typename-extractor.js.map +1 -0
  45. package/dist/auto-type-generator/typename-resolve-type-generator.d.ts +35 -0
  46. package/dist/auto-type-generator/typename-resolve-type-generator.d.ts.map +1 -0
  47. package/dist/auto-type-generator/typename-resolve-type-generator.js +177 -0
  48. package/dist/auto-type-generator/typename-resolve-type-generator.js.map +1 -0
  49. package/dist/auto-type-generator/typename-types.d.ts +43 -0
  50. package/dist/auto-type-generator/typename-types.d.ts.map +1 -0
  51. package/dist/auto-type-generator/typename-types.js +37 -0
  52. package/dist/auto-type-generator/typename-types.js.map +1 -0
  53. package/dist/auto-type-generator/typename-validator.d.ts +37 -0
  54. package/dist/auto-type-generator/typename-validator.d.ts.map +1 -0
  55. package/dist/auto-type-generator/typename-validator.js +206 -0
  56. package/dist/auto-type-generator/typename-validator.js.map +1 -0
  57. package/dist/cli.js +2 -0
  58. package/dist/cli.js.map +1 -1
  59. package/dist/commands/docs.d.ts +51 -0
  60. package/dist/commands/docs.d.ts.map +1 -0
  61. package/dist/commands/docs.js +154 -0
  62. package/dist/commands/docs.js.map +1 -0
  63. package/dist/gen-orchestrator/orchestrator.d.ts.map +1 -1
  64. package/dist/gen-orchestrator/orchestrator.js +119 -14
  65. package/dist/gen-orchestrator/orchestrator.js.map +1 -1
  66. package/dist/resolver-extractor/extract-resolvers.d.ts +28 -1
  67. package/dist/resolver-extractor/extract-resolvers.d.ts.map +1 -1
  68. package/dist/resolver-extractor/extractor/define-api-extractor.d.ts +16 -1
  69. package/dist/resolver-extractor/extractor/define-api-extractor.d.ts.map +1 -1
  70. package/dist/resolver-extractor/extractor/define-api-extractor.js +86 -309
  71. package/dist/resolver-extractor/extractor/define-api-extractor.js.map +1 -1
  72. package/dist/resolver-extractor/index.d.ts +0 -1
  73. package/dist/resolver-extractor/index.d.ts.map +1 -1
  74. package/dist/resolver-extractor/validator/abstract-resolver-validator.d.ts +1 -0
  75. package/dist/resolver-extractor/validator/abstract-resolver-validator.d.ts.map +1 -1
  76. package/dist/resolver-extractor/validator/abstract-resolver-validator.js +9 -5
  77. package/dist/resolver-extractor/validator/abstract-resolver-validator.js.map +1 -1
  78. package/dist/schema-generator/emitter/code-emitter.d.ts +10 -2
  79. package/dist/schema-generator/emitter/code-emitter.d.ts.map +1 -1
  80. package/dist/schema-generator/emitter/code-emitter.js +39 -4
  81. package/dist/schema-generator/emitter/code-emitter.js.map +1 -1
  82. package/dist/schema-generator/generate-schema.d.ts +1 -0
  83. package/dist/schema-generator/generate-schema.d.ts.map +1 -1
  84. package/dist/schema-generator/generate-schema.js +90 -4
  85. package/dist/schema-generator/generate-schema.js.map +1 -1
  86. package/dist/schema-generator/integrator/result-integrator.d.ts +34 -2
  87. package/dist/schema-generator/integrator/result-integrator.d.ts.map +1 -1
  88. package/dist/schema-generator/integrator/result-integrator.js +96 -1
  89. package/dist/schema-generator/integrator/result-integrator.js.map +1 -1
  90. package/dist/schema-generator/resolver-collector/resolver-collector.d.ts +2 -0
  91. package/dist/schema-generator/resolver-collector/resolver-collector.d.ts.map +1 -1
  92. package/dist/schema-generator/resolver-collector/resolver-collector.js +22 -0
  93. package/dist/schema-generator/resolver-collector/resolver-collector.js.map +1 -1
  94. package/dist/shared/constants.d.ts +0 -16
  95. package/dist/shared/constants.d.ts.map +1 -1
  96. package/dist/shared/constants.js +0 -19
  97. package/dist/shared/constants.js.map +1 -1
  98. package/dist/shared/directive-detector.d.ts.map +1 -1
  99. package/dist/shared/directive-detector.js +8 -15
  100. package/dist/shared/directive-detector.js.map +1 -1
  101. package/dist/shared/enum-prefix-detector.d.ts +63 -0
  102. package/dist/shared/enum-prefix-detector.d.ts.map +1 -0
  103. package/dist/shared/enum-prefix-detector.js +80 -0
  104. package/dist/shared/enum-prefix-detector.js.map +1 -0
  105. package/dist/shared/file-scanner.d.ts.map +1 -1
  106. package/dist/shared/file-scanner.js +5 -3
  107. package/dist/shared/file-scanner.js.map +1 -1
  108. package/dist/shared/ignore-fields-detector.d.ts +26 -0
  109. package/dist/shared/ignore-fields-detector.d.ts.map +1 -0
  110. package/dist/shared/ignore-fields-detector.js +83 -0
  111. package/dist/shared/ignore-fields-detector.js.map +1 -0
  112. package/dist/shared/ignore-fields-validator.d.ts +29 -0
  113. package/dist/shared/ignore-fields-validator.d.ts.map +1 -0
  114. package/dist/shared/ignore-fields-validator.js +43 -0
  115. package/dist/shared/ignore-fields-validator.js.map +1 -0
  116. package/dist/shared/index.d.ts +3 -1
  117. package/dist/shared/index.d.ts.map +1 -1
  118. package/dist/shared/index.js +1 -3
  119. package/dist/shared/index.js.map +1 -1
  120. package/dist/shared/interface-detector.d.ts +3 -2
  121. package/dist/shared/interface-detector.d.ts.map +1 -1
  122. package/dist/shared/interface-detector.js +54 -11
  123. package/dist/shared/interface-detector.js.map +1 -1
  124. package/dist/shared/path-utils.d.ts +2 -0
  125. package/dist/shared/path-utils.d.ts.map +1 -0
  126. package/dist/shared/path-utils.js +4 -0
  127. package/dist/shared/path-utils.js.map +1 -0
  128. package/dist/shared/source-location.d.ts +5 -0
  129. package/dist/shared/source-location.d.ts.map +1 -1
  130. package/dist/shared/source-location.js +7 -0
  131. package/dist/shared/source-location.js.map +1 -1
  132. package/dist/shared/type-converter.d.ts.map +1 -1
  133. package/dist/shared/type-converter.js +11 -0
  134. package/dist/shared/type-converter.js.map +1 -1
  135. package/dist/shared/typescript-utils.d.ts +34 -7
  136. package/dist/shared/typescript-utils.d.ts.map +1 -1
  137. package/dist/shared/typescript-utils.js +72 -24
  138. package/dist/shared/typescript-utils.js.map +1 -1
  139. package/dist/type-extractor/collector/scalar-collector.d.ts.map +1 -1
  140. package/dist/type-extractor/collector/scalar-collector.js +4 -14
  141. package/dist/type-extractor/collector/scalar-collector.js.map +1 -1
  142. package/dist/type-extractor/converter/graphql-converter.d.ts.map +1 -1
  143. package/dist/type-extractor/converter/graphql-converter.js +57 -4
  144. package/dist/type-extractor/converter/graphql-converter.js.map +1 -1
  145. package/dist/type-extractor/extractor/field-type-resolver.d.ts +28 -0
  146. package/dist/type-extractor/extractor/field-type-resolver.d.ts.map +1 -0
  147. package/dist/type-extractor/extractor/field-type-resolver.js +433 -0
  148. package/dist/type-extractor/extractor/field-type-resolver.js.map +1 -0
  149. package/dist/type-extractor/extractor/type-extractor.d.ts +12 -3
  150. package/dist/type-extractor/extractor/type-extractor.d.ts.map +1 -1
  151. package/dist/type-extractor/extractor/type-extractor.js +260 -229
  152. package/dist/type-extractor/extractor/type-extractor.js.map +1 -1
  153. package/dist/type-extractor/extractor/type-name-collector.d.ts +24 -0
  154. package/dist/type-extractor/extractor/type-name-collector.d.ts.map +1 -0
  155. package/dist/type-extractor/extractor/type-name-collector.js +102 -0
  156. package/dist/type-extractor/extractor/type-name-collector.js.map +1 -0
  157. package/dist/type-extractor/mapper/scalar-base-type-mapper.d.ts +89 -0
  158. package/dist/type-extractor/mapper/scalar-base-type-mapper.d.ts.map +1 -0
  159. package/dist/type-extractor/mapper/scalar-base-type-mapper.js +158 -0
  160. package/dist/type-extractor/mapper/scalar-base-type-mapper.js.map +1 -0
  161. package/dist/type-extractor/types/diagnostics.d.ts +1 -1
  162. package/dist/type-extractor/types/diagnostics.d.ts.map +1 -1
  163. package/dist/type-extractor/types/graphql.d.ts +2 -0
  164. package/dist/type-extractor/types/graphql.d.ts.map +1 -1
  165. package/dist/type-extractor/types/index.d.ts +2 -1
  166. package/dist/type-extractor/types/index.d.ts.map +1 -1
  167. package/dist/type-extractor/types/index.js +1 -1
  168. package/dist/type-extractor/types/index.js.map +1 -1
  169. package/dist/type-extractor/types/ts-type-reference-factory.d.ts +47 -0
  170. package/dist/type-extractor/types/ts-type-reference-factory.d.ts.map +1 -0
  171. package/dist/type-extractor/types/ts-type-reference-factory.js +75 -0
  172. package/dist/type-extractor/types/ts-type-reference-factory.js.map +1 -0
  173. package/dist/type-extractor/types/typescript.d.ts +25 -1
  174. package/dist/type-extractor/types/typescript.d.ts.map +1 -1
  175. package/dist/type-extractor/validator/type-validator.js +1 -1
  176. package/dist/type-extractor/validator/type-validator.js.map +1 -1
  177. package/docs/coding-agents.md +64 -0
  178. package/docs/configuration.md +6 -20
  179. package/docs/getting-started.md +15 -12
  180. package/docs/index.md +36 -21
  181. package/docs/integration/apollo.md +8 -40
  182. package/docs/integration/drizzle.md +187 -0
  183. package/docs/integration/prisma.md +196 -0
  184. package/docs/integration/yoga.md +8 -40
  185. package/docs/schema/abstract-resolvers.md +117 -0
  186. package/docs/schema/directives.md +5 -0
  187. package/docs/schema/documentation.md +5 -0
  188. package/docs/schema/enums.md +307 -0
  189. package/docs/schema/fields.md +66 -0
  190. package/docs/schema/index.md +21 -0
  191. package/docs/schema/inputs.md +117 -15
  192. package/docs/schema/interfaces.md +31 -1
  193. package/docs/schema/objects.md +42 -0
  194. package/docs/schema/queries-mutations.md +138 -22
  195. package/docs/schema/scalars.md +5 -0
  196. package/docs/schema/unions.md +208 -1
  197. package/docs/what-is-gqlkit.md +13 -8
  198. package/package.json +14 -5
  199. package/src/auto-type-generator/auto-type-generator.ts +1670 -0
  200. package/src/auto-type-generator/index.ts +63 -0
  201. package/src/auto-type-generator/inline-enum-collector.ts +338 -0
  202. package/src/auto-type-generator/inline-object-traverser.ts +49 -0
  203. package/src/auto-type-generator/inline-union-collector.ts +402 -0
  204. package/src/auto-type-generator/inline-union-types.ts +33 -0
  205. package/src/auto-type-generator/inline-union-validator.ts +482 -0
  206. package/src/auto-type-generator/name-collision-validator.ts +119 -0
  207. package/src/auto-type-generator/naming-convention.ts +163 -0
  208. package/src/auto-type-generator/resolve-type-generator.ts +21 -0
  209. package/src/auto-type-generator/resolver-field-iterator.ts +39 -0
  210. package/src/auto-type-generator/typename-extractor.ts +230 -0
  211. package/src/auto-type-generator/typename-resolve-type-generator.ts +281 -0
  212. package/src/auto-type-generator/typename-types.ts +66 -0
  213. package/src/auto-type-generator/typename-validator.ts +326 -0
  214. package/src/cli.ts +13 -0
  215. package/src/commands/docs.ts +211 -0
  216. package/src/commands/gen.ts +141 -0
  217. package/src/commands/main.ts +5 -0
  218. package/src/config/define-config.ts +28 -0
  219. package/src/config/index.ts +7 -0
  220. package/src/config/types.ts +144 -0
  221. package/src/config-loader/index.ts +14 -0
  222. package/src/config-loader/loader.ts +143 -0
  223. package/src/config-loader/validator.ts +672 -0
  224. package/src/gen-orchestrator/hook-executor/hook-executor.ts +117 -0
  225. package/src/gen-orchestrator/orchestrator.ts +798 -0
  226. package/src/gen-orchestrator/reporter/diagnostic-reporter.ts +44 -0
  227. package/src/gen-orchestrator/reporter/progress-reporter.ts +61 -0
  228. package/src/gen-orchestrator/writer/file-writer.ts +38 -0
  229. package/src/index.ts +2 -0
  230. package/src/resolver-extractor/extract-resolvers.ts +82 -0
  231. package/src/resolver-extractor/extractor/define-api-extractor.ts +740 -0
  232. package/src/resolver-extractor/index.ts +13 -0
  233. package/src/resolver-extractor/validator/abstract-resolver-validator.ts +259 -0
  234. package/src/schema-generator/builder/ast-builder.ts +706 -0
  235. package/src/schema-generator/emitter/code-emitter.ts +385 -0
  236. package/src/schema-generator/emitter/sdl-emitter.ts +13 -0
  237. package/src/schema-generator/generate-schema.ts +267 -0
  238. package/src/schema-generator/index.ts +19 -0
  239. package/src/schema-generator/integrator/result-integrator.ts +759 -0
  240. package/src/schema-generator/pruner/schema-pruner.ts +112 -0
  241. package/src/schema-generator/resolver-collector/resolver-collector.ts +157 -0
  242. package/src/shared/constants.ts +122 -0
  243. package/src/shared/default-value-detector.ts +172 -0
  244. package/src/shared/diagnostics.ts +35 -0
  245. package/src/shared/directive-definition-extractor.ts +564 -0
  246. package/src/shared/directive-detector.ts +556 -0
  247. package/src/shared/enum-prefix-detector.ts +99 -0
  248. package/src/shared/file-scanner.ts +170 -0
  249. package/src/shared/ignore-fields-detector.ts +109 -0
  250. package/src/shared/ignore-fields-validator.ts +66 -0
  251. package/src/shared/index.ts +34 -0
  252. package/src/shared/inline-object-extractor.ts +102 -0
  253. package/src/shared/inline-object-utils.ts +23 -0
  254. package/src/shared/interface-detector.ts +176 -0
  255. package/src/shared/interface-validator.ts +211 -0
  256. package/src/shared/metadata-detector.ts +443 -0
  257. package/src/shared/path-utils.ts +3 -0
  258. package/src/shared/program-factory.ts +51 -0
  259. package/src/shared/source-location.ts +38 -0
  260. package/src/shared/tsconfig-loader.ts +126 -0
  261. package/src/shared/tsdoc-parser.ts +155 -0
  262. package/src/shared/type-converter.ts +99 -0
  263. package/src/shared/typescript-utils.ts +246 -0
  264. package/src/type-extractor/collector/result-collector.ts +57 -0
  265. package/src/type-extractor/collector/scalar-collector.ts +254 -0
  266. package/src/type-extractor/converter/field-eligibility.ts +112 -0
  267. package/src/type-extractor/converter/graphql-converter.ts +483 -0
  268. package/src/type-extractor/extract-types.ts +1 -0
  269. package/src/type-extractor/extractor/field-type-resolver.ts +614 -0
  270. package/src/type-extractor/extractor/type-extractor.ts +1644 -0
  271. package/src/type-extractor/extractor/type-name-collector.ts +130 -0
  272. package/src/type-extractor/index.ts +20 -0
  273. package/src/type-extractor/mapper/scalar-base-type-mapper.ts +265 -0
  274. package/src/type-extractor/types/diagnostics.ts +109 -0
  275. package/src/type-extractor/types/graphql.ts +55 -0
  276. package/src/type-extractor/types/index.ts +37 -0
  277. package/src/type-extractor/types/ts-type-reference-factory.ts +150 -0
  278. package/src/type-extractor/types/typescript.ts +137 -0
  279. package/src/type-extractor/validator/type-validator.ts +77 -0
  280. package/dist/auto-type-generator/auto-type-generator.test.d.ts +0 -2
  281. package/dist/auto-type-generator/auto-type-generator.test.d.ts.map +0 -1
  282. package/dist/auto-type-generator/auto-type-generator.test.js +0 -613
  283. package/dist/auto-type-generator/auto-type-generator.test.js.map +0 -1
  284. package/dist/auto-type-generator/name-collision-validator.test.d.ts +0 -2
  285. package/dist/auto-type-generator/name-collision-validator.test.d.ts.map +0 -1
  286. package/dist/auto-type-generator/name-collision-validator.test.js +0 -358
  287. package/dist/auto-type-generator/name-collision-validator.test.js.map +0 -1
  288. package/dist/auto-type-generator/naming-convention.test.d.ts +0 -2
  289. package/dist/auto-type-generator/naming-convention.test.d.ts.map +0 -1
  290. package/dist/auto-type-generator/naming-convention.test.js +0 -132
  291. package/dist/auto-type-generator/naming-convention.test.js.map +0 -1
  292. package/dist/commands/gen.test.d.ts +0 -2
  293. package/dist/commands/gen.test.d.ts.map +0 -1
  294. package/dist/commands/gen.test.js +0 -226
  295. package/dist/commands/gen.test.js.map +0 -1
  296. package/dist/config-loader/loader.test.d.ts +0 -2
  297. package/dist/config-loader/loader.test.d.ts.map +0 -1
  298. package/dist/config-loader/loader.test.js +0 -123
  299. package/dist/config-loader/loader.test.js.map +0 -1
  300. package/dist/config-loader/validator.test.d.ts +0 -2
  301. package/dist/config-loader/validator.test.d.ts.map +0 -1
  302. package/dist/config-loader/validator.test.js +0 -846
  303. package/dist/config-loader/validator.test.js.map +0 -1
  304. package/dist/gen-orchestrator/golden.test.d.ts +0 -2
  305. package/dist/gen-orchestrator/golden.test.d.ts.map +0 -1
  306. package/dist/gen-orchestrator/golden.test.js +0 -102
  307. package/dist/gen-orchestrator/golden.test.js.map +0 -1
  308. package/dist/gen-orchestrator/hook-executor/hook-executor.test.d.ts +0 -2
  309. package/dist/gen-orchestrator/hook-executor/hook-executor.test.d.ts.map +0 -1
  310. package/dist/gen-orchestrator/hook-executor/hook-executor.test.js +0 -167
  311. package/dist/gen-orchestrator/hook-executor/hook-executor.test.js.map +0 -1
  312. package/dist/gen-orchestrator/reporter/progress-reporter.test.d.ts +0 -2
  313. package/dist/gen-orchestrator/reporter/progress-reporter.test.d.ts.map +0 -1
  314. package/dist/gen-orchestrator/reporter/progress-reporter.test.js +0 -74
  315. package/dist/gen-orchestrator/reporter/progress-reporter.test.js.map +0 -1
  316. package/dist/resolver-extractor/validator/only-validator.d.ts +0 -61
  317. package/dist/resolver-extractor/validator/only-validator.d.ts.map +0 -1
  318. package/dist/resolver-extractor/validator/only-validator.js +0 -76
  319. package/dist/resolver-extractor/validator/only-validator.js.map +0 -1
  320. package/dist/resolver-extractor/validator/only-validator.test.d.ts +0 -8
  321. package/dist/resolver-extractor/validator/only-validator.test.d.ts.map +0 -1
  322. package/dist/resolver-extractor/validator/only-validator.test.js +0 -352
  323. package/dist/resolver-extractor/validator/only-validator.test.js.map +0 -1
  324. package/dist/schema-generator/builder/ast-builder.test.d.ts +0 -2
  325. package/dist/schema-generator/builder/ast-builder.test.d.ts.map +0 -1
  326. package/dist/schema-generator/builder/ast-builder.test.js +0 -469
  327. package/dist/schema-generator/builder/ast-builder.test.js.map +0 -1
  328. package/dist/shared/file-scanner.test.d.ts +0 -2
  329. package/dist/shared/file-scanner.test.d.ts.map +0 -1
  330. package/dist/shared/file-scanner.test.js +0 -138
  331. package/dist/shared/file-scanner.test.js.map +0 -1
  332. package/dist/shared/interface-validator.test.d.ts +0 -2
  333. package/dist/shared/interface-validator.test.d.ts.map +0 -1
  334. package/dist/shared/interface-validator.test.js +0 -145
  335. package/dist/shared/interface-validator.test.js.map +0 -1
  336. package/dist/type-extractor/types/typescript.test.d.ts +0 -2
  337. package/dist/type-extractor/types/typescript.test.d.ts.map +0 -1
  338. package/dist/type-extractor/types/typescript.test.js +0 -287
  339. package/dist/type-extractor/types/typescript.test.js.map +0 -1
@@ -0,0 +1,759 @@
1
+ import type {
2
+ AutoGeneratedType,
3
+ ResolveTypeFieldPattern,
4
+ } from "../../auto-type-generator/index.js";
5
+ import type { TypenameAutoResolveTypeInfo } from "../../auto-type-generator/typename-resolve-type-generator.js";
6
+ import { createFieldNameSet } from "../../auto-type-generator/typename-types.js";
7
+ import type {
8
+ AbstractResolverInfo,
9
+ ExtractResolversResult,
10
+ GraphQLFieldDefinition,
11
+ GraphQLInputValue,
12
+ TypeExtension as ResolverTypeExtension,
13
+ } from "../../resolver-extractor/index.js";
14
+ import { validateAbstractResolvers } from "../../resolver-extractor/validator/abstract-resolver-validator.js";
15
+ import type {
16
+ DirectiveDefinitionInfo,
17
+ DirectiveLocation,
18
+ } from "../../shared/directive-definition-extractor.js";
19
+ import type {
20
+ DirectiveArgumentValue,
21
+ DirectiveInfo,
22
+ } from "../../shared/directive-detector.js";
23
+ import {
24
+ detectCircularInterfaceReferences,
25
+ validateInterfaceImplementations,
26
+ } from "../../shared/interface-validator.js";
27
+ import type { DeprecationInfo } from "../../shared/tsdoc-parser.js";
28
+ import type { CollectedScalarType } from "../../type-extractor/collector/scalar-collector.js";
29
+ import { mergeDescriptions } from "../../type-extractor/collector/scalar-collector.js";
30
+ import type { ExtractTypesResult } from "../../type-extractor/index.js";
31
+ import type {
32
+ Diagnostic,
33
+ EnumValueInfo,
34
+ GraphQLFieldType,
35
+ } from "../../type-extractor/types/index.js";
36
+
37
+ export interface BaseField {
38
+ readonly name: string;
39
+ readonly type: GraphQLFieldType;
40
+ readonly description: string | null;
41
+ readonly deprecated: DeprecationInfo | null;
42
+ readonly directives: ReadonlyArray<DirectiveInfo> | null;
43
+ readonly defaultValue: DirectiveArgumentValue | null;
44
+ }
45
+
46
+ export interface BaseType {
47
+ readonly name: string;
48
+ readonly kind: "Object" | "Interface" | "Union" | "Enum";
49
+ readonly fields: ReadonlyArray<BaseField> | null;
50
+ readonly unionMembers: ReadonlyArray<string> | null;
51
+ readonly enumValues: ReadonlyArray<EnumValueInfo> | null;
52
+ /** True if this enum uses numeric values */
53
+ readonly isNumericEnum: boolean;
54
+ /** True if this string enum needs value mapping (at least one value converted) */
55
+ readonly needsStringEnumMapping: boolean;
56
+ readonly implementedInterfaces: ReadonlyArray<string> | null;
57
+ readonly description: string | null;
58
+ readonly deprecated: DeprecationInfo | null;
59
+ readonly sourceFile: string | null;
60
+ readonly directives: ReadonlyArray<DirectiveInfo> | null;
61
+ }
62
+
63
+ export interface InputType {
64
+ readonly name: string;
65
+ readonly fields: ReadonlyArray<BaseField>;
66
+ readonly sourceFile: string;
67
+ readonly description: string | null;
68
+ readonly isOneOf: boolean;
69
+ }
70
+
71
+ export interface ExtensionField {
72
+ readonly name: string;
73
+ readonly type: GraphQLFieldType;
74
+ readonly args: ReadonlyArray<GraphQLInputValue> | null;
75
+ readonly resolverSourceFile: string;
76
+ readonly resolverExportName: string | null;
77
+ readonly description: string | null;
78
+ readonly deprecated: DeprecationInfo | null;
79
+ readonly directives: ReadonlyArray<DirectiveInfo> | null;
80
+ }
81
+
82
+ export interface TypeExtension {
83
+ readonly targetTypeName: string;
84
+ readonly fields: ReadonlyArray<ExtensionField>;
85
+ }
86
+
87
+ /**
88
+ * Custom scalar information for schema generation.
89
+ */
90
+ export interface CustomScalarInfo {
91
+ readonly scalarName: string;
92
+ readonly description: string | null;
93
+ }
94
+
95
+ /**
96
+ * Numeric enum member value mapping.
97
+ */
98
+ export interface NumericEnumMember {
99
+ readonly name: string;
100
+ readonly numericValue: number;
101
+ }
102
+
103
+ /**
104
+ * Numeric enum information for resolver generation.
105
+ */
106
+ export interface NumericEnumInfo {
107
+ readonly enumName: string;
108
+ readonly members: ReadonlyArray<NumericEnumMember>;
109
+ }
110
+
111
+ /**
112
+ * String enum member value mapping.
113
+ */
114
+ export interface StringEnumMember {
115
+ /** GraphQL enum value name (SCREAMING_SNAKE_CASE) */
116
+ readonly graphqlValue: string;
117
+ /** Original TypeScript enum value */
118
+ readonly typescriptValue: string;
119
+ }
120
+
121
+ /**
122
+ * String enum information for resolver generation.
123
+ */
124
+ export interface StringEnumMappingInfo {
125
+ readonly enumName: string;
126
+ readonly members: ReadonlyArray<StringEnumMember>;
127
+ }
128
+
129
+ export interface AutoGeneratedUnionInfo {
130
+ readonly name: string;
131
+ readonly fieldPattern: ResolveTypeFieldPattern;
132
+ readonly hasAutoResolveType: boolean;
133
+ }
134
+
135
+ export interface IntegratedResult {
136
+ readonly baseTypes: ReadonlyArray<BaseType>;
137
+ readonly inputTypes: ReadonlyArray<InputType>;
138
+ readonly typeExtensions: ReadonlyArray<TypeExtension>;
139
+ /** @deprecated Use customScalars instead */
140
+ readonly customScalarNames: ReadonlyArray<string> | null;
141
+ /** Custom scalars with description information */
142
+ readonly customScalars: ReadonlyArray<CustomScalarInfo> | null;
143
+ /** Directive definitions extracted from type aliases */
144
+ readonly directiveDefinitions: ReadonlyArray<DirectiveDefinitionInfo> | null;
145
+ /** Abstract type resolvers (resolveType and isTypeOf) */
146
+ readonly abstractTypeResolvers: ReadonlyArray<AbstractResolverInfo>;
147
+ /** @deprecated Use autoGeneratedUnions instead */
148
+ readonly autoGeneratedUnionNames: ReadonlyArray<string>;
149
+ /** Auto-generated Union types that need __resolveType with field pattern info */
150
+ readonly autoGeneratedUnions: ReadonlyArray<AutoGeneratedUnionInfo>;
151
+ /** Union/Interface types that have typename-based auto resolveType */
152
+ readonly typenameAutoResolveTypes: ReadonlyArray<TypenameAutoResolveTypeInfo>;
153
+ /** Numeric enum information for resolver generation */
154
+ readonly numericEnums: ReadonlyArray<NumericEnumInfo>;
155
+ /** String enum mappings for resolver generation */
156
+ readonly stringEnumMappings: ReadonlyArray<StringEnumMappingInfo>;
157
+ readonly hasQuery: boolean;
158
+ readonly hasMutation: boolean;
159
+ readonly hasErrors: boolean;
160
+ readonly diagnostics: ReadonlyArray<Diagnostic>;
161
+ }
162
+
163
+ function convertToExtensionField(
164
+ field: GraphQLFieldDefinition,
165
+ ): ExtensionField {
166
+ return {
167
+ name: field.name,
168
+ type: field.type,
169
+ args: field.args,
170
+ resolverSourceFile: field.sourceLocation.file,
171
+ resolverExportName: field.resolverExportName,
172
+ description: field.description,
173
+ deprecated: field.deprecated,
174
+ directives: field.directives,
175
+ };
176
+ }
177
+
178
+ function convertResolverTypeExtension(
179
+ ext: ResolverTypeExtension,
180
+ ): TypeExtension {
181
+ return {
182
+ targetTypeName: ext.targetTypeName,
183
+ fields: ext.fields.map(convertToExtensionField),
184
+ };
185
+ }
186
+
187
+ const UNSUPPORTED_LOCATIONS: ReadonlySet<DirectiveLocation> = new Set([
188
+ "SCHEMA",
189
+ "SCALAR",
190
+ "INTERFACE",
191
+ "UNION",
192
+ "ENUM",
193
+ ]);
194
+
195
+ type UsageLocation =
196
+ | "OBJECT"
197
+ | "FIELD_DEFINITION"
198
+ | "INPUT_OBJECT"
199
+ | "INPUT_FIELD_DEFINITION";
200
+
201
+ interface DirectiveUsageContext {
202
+ readonly directiveName: string;
203
+ readonly usageLocation: UsageLocation;
204
+ readonly targetName: string;
205
+ readonly sourceFile: string;
206
+ readonly line: number;
207
+ }
208
+
209
+ function validateDirectiveUsage(
210
+ context: DirectiveUsageContext,
211
+ directiveDefMap: Map<string, DirectiveDefinitionInfo>,
212
+ diagnostics: Diagnostic[],
213
+ ): void {
214
+ const { directiveName, usageLocation, targetName, sourceFile, line } =
215
+ context;
216
+
217
+ const def = directiveDefMap.get(directiveName);
218
+ if (!def) {
219
+ diagnostics.push({
220
+ code: "UNDEFINED_DIRECTIVE",
221
+ message: `${targetName}: Directive '@${directiveName}' is not defined`,
222
+ severity: "error",
223
+ location: { file: sourceFile, line, column: 1 },
224
+ });
225
+ return;
226
+ }
227
+
228
+ for (const loc of def.locations) {
229
+ if (UNSUPPORTED_LOCATIONS.has(loc)) {
230
+ diagnostics.push({
231
+ code: "UNSUPPORTED_DIRECTIVE_LOCATION",
232
+ message: `${targetName}: Directive '@${directiveName}' uses unsupported location ${loc}`,
233
+ severity: "error",
234
+ location: { file: sourceFile, line, column: 1 },
235
+ });
236
+ return;
237
+ }
238
+ }
239
+
240
+ const allowedLocations = getCompatibleLocations(usageLocation);
241
+ const hasValidLocation = def.locations.some((loc) =>
242
+ allowedLocations.includes(loc),
243
+ );
244
+
245
+ if (!hasValidLocation) {
246
+ diagnostics.push({
247
+ code: "INVALID_DIRECTIVE_LOCATION",
248
+ message: `${targetName}: Directive '@${directiveName}' cannot be used on ${usageLocation} (allowed: ${def.locations.join(", ")})`,
249
+ severity: "error",
250
+ location: { file: sourceFile, line, column: 1 },
251
+ });
252
+ }
253
+ }
254
+
255
+ function getCompatibleLocations(
256
+ usageLocation: UsageLocation,
257
+ ): DirectiveLocation[] {
258
+ switch (usageLocation) {
259
+ case "OBJECT":
260
+ return ["OBJECT"];
261
+ case "FIELD_DEFINITION":
262
+ return ["FIELD_DEFINITION"];
263
+ case "INPUT_OBJECT":
264
+ return ["INPUT_OBJECT"];
265
+ case "INPUT_FIELD_DEFINITION":
266
+ return ["INPUT_FIELD_DEFINITION"];
267
+ }
268
+ }
269
+
270
+ export function integrate(
271
+ typesResult: ExtractTypesResult,
272
+ resolversResult: ExtractResolversResult,
273
+ customScalarNames: ReadonlyArray<string> | null,
274
+ collectedScalars?: ReadonlyArray<CollectedScalarType> | null,
275
+ directiveDefinitions?: ReadonlyArray<DirectiveDefinitionInfo> | null,
276
+ autoGeneratedTypes?: ReadonlyArray<AutoGeneratedType> | null,
277
+ typenameAutoResolveTypes?: ReadonlyArray<TypenameAutoResolveTypeInfo>,
278
+ ): IntegratedResult {
279
+ const directiveTypeAliasNames = new Set(
280
+ directiveDefinitions?.map((d) => d.typeAliasName) ?? [],
281
+ );
282
+
283
+ const diagnostics: Diagnostic[] = [];
284
+
285
+ diagnostics.push(...typesResult.diagnostics.errors);
286
+ diagnostics.push(...typesResult.diagnostics.warnings);
287
+ diagnostics.push(...resolversResult.diagnostics.errors);
288
+ diagnostics.push(...resolversResult.diagnostics.warnings);
289
+
290
+ const interfaceValidation = validateInterfaceImplementations(
291
+ typesResult.types,
292
+ );
293
+ diagnostics.push(...interfaceValidation.diagnostics);
294
+
295
+ const circularValidation = detectCircularInterfaceReferences(
296
+ typesResult.types,
297
+ );
298
+ diagnostics.push(...circularValidation.diagnostics);
299
+
300
+ const baseTypes: BaseType[] = [];
301
+ const inputTypes: InputType[] = [];
302
+ const autoGeneratedUnionNames: string[] = [];
303
+ const autoGeneratedUnions: AutoGeneratedUnionInfo[] = [];
304
+
305
+ for (const autoType of autoGeneratedTypes ?? []) {
306
+ if (autoType.kind === "Object") {
307
+ baseTypes.push({
308
+ name: autoType.name,
309
+ kind: "Object",
310
+ fields: autoType.fields!.map((f) => ({
311
+ name: f.name,
312
+ type: f.type,
313
+ description: f.description,
314
+ deprecated: f.deprecated,
315
+ directives: f.directives,
316
+ defaultValue: f.defaultValue,
317
+ })),
318
+ unionMembers: null,
319
+ enumValues: null,
320
+ isNumericEnum: false,
321
+ needsStringEnumMapping: false,
322
+ implementedInterfaces: null,
323
+ description: autoType.description,
324
+ deprecated: null,
325
+ sourceFile: autoType.sourceLocation.file,
326
+ directives: null,
327
+ });
328
+ } else if (autoType.kind === "Enum") {
329
+ baseTypes.push({
330
+ name: autoType.name,
331
+ kind: "Enum",
332
+ fields: null,
333
+ unionMembers: null,
334
+ enumValues:
335
+ autoType.enumValues?.map((v) => ({
336
+ name: v.name,
337
+ originalValue: v.originalValue,
338
+ numericValue: null,
339
+ description: v.description,
340
+ deprecated: v.deprecated,
341
+ })) ?? null,
342
+ isNumericEnum: false,
343
+ needsStringEnumMapping: autoType.needsStringEnumMapping,
344
+ implementedInterfaces: null,
345
+ description: autoType.description,
346
+ deprecated: null,
347
+ sourceFile: autoType.sourceLocation.file,
348
+ directives: null,
349
+ });
350
+ } else if (autoType.kind === "Union") {
351
+ baseTypes.push({
352
+ name: autoType.name,
353
+ kind: "Union",
354
+ fields: null,
355
+ unionMembers: autoType.unionMembers ?? [],
356
+ enumValues: null,
357
+ isNumericEnum: false,
358
+ needsStringEnumMapping: false,
359
+ implementedInterfaces: null,
360
+ description: autoType.description,
361
+ deprecated: null,
362
+ sourceFile: autoType.sourceLocation.file,
363
+ directives: null,
364
+ });
365
+ autoGeneratedUnionNames.push(autoType.name);
366
+ autoGeneratedUnions.push({
367
+ name: autoType.name,
368
+ fieldPattern: autoType.resolveTypeFieldPattern ?? {
369
+ usedFieldNames: createFieldNameSet(["__typename"]),
370
+ },
371
+ hasAutoResolveType: autoType.resolveTypeFieldPattern !== null,
372
+ });
373
+ } else if (autoType.kind === "OneOfInputObject") {
374
+ inputTypes.push({
375
+ name: autoType.name,
376
+ fields: autoType.fields!.map((f) => ({
377
+ name: f.name,
378
+ type: f.type,
379
+ description: f.description,
380
+ deprecated: f.deprecated,
381
+ directives: f.directives,
382
+ defaultValue: f.defaultValue,
383
+ })),
384
+ sourceFile: autoType.sourceLocation.file,
385
+ description: autoType.description,
386
+ isOneOf: true,
387
+ });
388
+ } else {
389
+ inputTypes.push({
390
+ name: autoType.name,
391
+ fields: autoType.fields!.map((f) => ({
392
+ name: f.name,
393
+ type: f.type,
394
+ description: f.description,
395
+ deprecated: f.deprecated,
396
+ directives: f.directives,
397
+ defaultValue: f.defaultValue,
398
+ })),
399
+ sourceFile: autoType.sourceLocation.file,
400
+ description: autoType.description,
401
+ isOneOf: false,
402
+ });
403
+ }
404
+ }
405
+
406
+ for (const type of typesResult.types) {
407
+ if (directiveTypeAliasNames.has(type.name)) {
408
+ continue;
409
+ }
410
+
411
+ if (type.kind === "InputObject" || type.kind === "OneOfInputObject") {
412
+ inputTypes.push({
413
+ name: type.name,
414
+ fields:
415
+ type.fields?.map((field) => ({
416
+ name: field.name,
417
+ type: field.type,
418
+ description: field.description,
419
+ deprecated: field.deprecated,
420
+ directives: field.directives,
421
+ defaultValue: field.defaultValue,
422
+ })) ?? [],
423
+ sourceFile: type.sourceFile,
424
+ description: type.description,
425
+ isOneOf: type.kind === "OneOfInputObject",
426
+ });
427
+ } else if (type.kind === "Enum") {
428
+ baseTypes.push({
429
+ name: type.name,
430
+ kind: type.kind,
431
+ fields: null,
432
+ unionMembers: null,
433
+ enumValues: type.enumValues,
434
+ isNumericEnum: type.isNumericEnum,
435
+ needsStringEnumMapping: type.needsStringEnumMapping,
436
+ implementedInterfaces: null,
437
+ description: type.description,
438
+ deprecated: type.deprecated,
439
+ sourceFile: type.sourceFile,
440
+ directives: type.directives,
441
+ });
442
+ } else if (type.kind === "Interface") {
443
+ baseTypes.push({
444
+ name: type.name,
445
+ kind: type.kind,
446
+ fields:
447
+ type.fields?.map((field) => ({
448
+ name: field.name,
449
+ type: field.type,
450
+ description: field.description,
451
+ deprecated: field.deprecated,
452
+ directives: field.directives,
453
+ defaultValue: field.defaultValue,
454
+ })) ?? null,
455
+ unionMembers: null,
456
+ enumValues: null,
457
+ isNumericEnum: false,
458
+ needsStringEnumMapping: false,
459
+ implementedInterfaces: type.implementedInterfaces ?? null,
460
+ description: type.description,
461
+ deprecated: type.deprecated,
462
+ sourceFile: type.sourceFile,
463
+ directives: type.directives,
464
+ });
465
+ } else if (type.kind === "Object") {
466
+ baseTypes.push({
467
+ name: type.name,
468
+ kind: type.kind,
469
+ fields:
470
+ type.fields?.map((field) => ({
471
+ name: field.name,
472
+ type: field.type,
473
+ description: field.description,
474
+ deprecated: field.deprecated,
475
+ directives: field.directives,
476
+ defaultValue: field.defaultValue,
477
+ })) ?? null,
478
+ unionMembers: null,
479
+ enumValues: null,
480
+ isNumericEnum: false,
481
+ needsStringEnumMapping: false,
482
+ implementedInterfaces: type.implementedInterfaces ?? null,
483
+ description: type.description,
484
+ deprecated: type.deprecated,
485
+ sourceFile: type.sourceFile,
486
+ directives: type.directives,
487
+ });
488
+ } else {
489
+ baseTypes.push({
490
+ name: type.name,
491
+ kind: type.kind,
492
+ fields: null,
493
+ unionMembers: type.unionMembers,
494
+ enumValues: null,
495
+ isNumericEnum: false,
496
+ needsStringEnumMapping: false,
497
+ implementedInterfaces: null,
498
+ description: type.description,
499
+ deprecated: null,
500
+ sourceFile: type.sourceFile,
501
+ directives: type.directives,
502
+ });
503
+ }
504
+ }
505
+
506
+ const hasQuery = resolversResult.queryFields.fields.length > 0;
507
+ const hasMutation = resolversResult.mutationFields.fields.length > 0;
508
+
509
+ if (hasQuery) {
510
+ baseTypes.push({
511
+ name: "Query",
512
+ kind: "Object",
513
+ fields: [],
514
+ unionMembers: null,
515
+ enumValues: null,
516
+ isNumericEnum: false,
517
+ needsStringEnumMapping: false,
518
+ implementedInterfaces: null,
519
+ description: null,
520
+ deprecated: null,
521
+ sourceFile: null,
522
+ directives: null,
523
+ });
524
+ }
525
+ if (hasMutation) {
526
+ baseTypes.push({
527
+ name: "Mutation",
528
+ kind: "Object",
529
+ fields: [],
530
+ unionMembers: null,
531
+ enumValues: null,
532
+ isNumericEnum: false,
533
+ needsStringEnumMapping: false,
534
+ implementedInterfaces: null,
535
+ description: null,
536
+ deprecated: null,
537
+ sourceFile: null,
538
+ directives: null,
539
+ });
540
+ }
541
+
542
+ const typenameAutoResolveTypeNames = new Set([
543
+ ...(typenameAutoResolveTypes?.map((t) => t.abstractTypeName) ?? []),
544
+ ...autoGeneratedUnions
545
+ .filter((u) => u.hasAutoResolveType)
546
+ .map((u) => u.name),
547
+ ]);
548
+
549
+ const abstractResolverValidation = validateAbstractResolvers({
550
+ abstractResolvers: resolversResult.abstractTypeResolvers,
551
+ baseTypes,
552
+ typenameAutoResolveTypeNames,
553
+ });
554
+ diagnostics.push(...abstractResolverValidation.diagnostics);
555
+
556
+ const knownTypeNames = new Set([
557
+ ...baseTypes.map((t) => t.name),
558
+ ...inputTypes.map((t) => t.name),
559
+ ]);
560
+
561
+ const typeExtensions: TypeExtension[] = [];
562
+
563
+ if (hasQuery) {
564
+ typeExtensions.push({
565
+ targetTypeName: "Query",
566
+ fields: resolversResult.queryFields.fields.map(convertToExtensionField),
567
+ });
568
+ }
569
+
570
+ if (hasMutation) {
571
+ typeExtensions.push({
572
+ targetTypeName: "Mutation",
573
+ fields: resolversResult.mutationFields.fields.map(
574
+ convertToExtensionField,
575
+ ),
576
+ });
577
+ }
578
+
579
+ for (const ext of resolversResult.typeExtensions) {
580
+ if (!knownTypeNames.has(ext.targetTypeName)) {
581
+ const firstField = ext.fields[0];
582
+ diagnostics.push({
583
+ code: "UNKNOWN_TARGET_TYPE",
584
+ message: `Type extension references unknown type '${ext.targetTypeName}'`,
585
+ severity: "error",
586
+ location: firstField
587
+ ? {
588
+ file: firstField.sourceLocation.file,
589
+ line: firstField.sourceLocation.line,
590
+ column: firstField.sourceLocation.column,
591
+ }
592
+ : null,
593
+ });
594
+ } else {
595
+ typeExtensions.push(convertResolverTypeExtension(ext));
596
+ }
597
+ }
598
+
599
+ const directiveDefMap = new Map<string, DirectiveDefinitionInfo>();
600
+ for (const def of directiveDefinitions ?? []) {
601
+ directiveDefMap.set(def.name, def);
602
+ }
603
+
604
+ for (const type of typesResult.types) {
605
+ if (directiveTypeAliasNames.has(type.name)) {
606
+ continue;
607
+ }
608
+
609
+ const usageLocation: UsageLocation =
610
+ type.kind === "InputObject" || type.kind === "OneOfInputObject"
611
+ ? "INPUT_OBJECT"
612
+ : "OBJECT";
613
+
614
+ if (type.directives) {
615
+ for (const directive of type.directives) {
616
+ validateDirectiveUsage(
617
+ {
618
+ directiveName: directive.name,
619
+ usageLocation,
620
+ targetName: `Type '${type.name}'`,
621
+ sourceFile: type.sourceFile,
622
+ line: 1,
623
+ },
624
+ directiveDefMap,
625
+ diagnostics,
626
+ );
627
+ }
628
+ }
629
+
630
+ const fieldUsageLocation: UsageLocation =
631
+ type.kind === "InputObject" || type.kind === "OneOfInputObject"
632
+ ? "INPUT_FIELD_DEFINITION"
633
+ : "FIELD_DEFINITION";
634
+
635
+ for (const field of type.fields ?? []) {
636
+ if (field.directives) {
637
+ for (const directive of field.directives) {
638
+ validateDirectiveUsage(
639
+ {
640
+ directiveName: directive.name,
641
+ usageLocation: fieldUsageLocation,
642
+ targetName: `Field '${type.name}.${field.name}'`,
643
+ sourceFile: type.sourceFile,
644
+ line: 1,
645
+ },
646
+ directiveDefMap,
647
+ diagnostics,
648
+ );
649
+ }
650
+ }
651
+ }
652
+ }
653
+
654
+ for (const ext of typeExtensions) {
655
+ for (const field of ext.fields) {
656
+ if (field.directives) {
657
+ for (const directive of field.directives) {
658
+ validateDirectiveUsage(
659
+ {
660
+ directiveName: directive.name,
661
+ usageLocation: "FIELD_DEFINITION",
662
+ targetName: `Field '${ext.targetTypeName}.${field.name}'`,
663
+ sourceFile: field.resolverSourceFile,
664
+ line: 1,
665
+ },
666
+ directiveDefMap,
667
+ diagnostics,
668
+ );
669
+ }
670
+ }
671
+ }
672
+ }
673
+
674
+ const hasErrors = diagnostics.some((d) => d.severity === "error");
675
+
676
+ const scalarDescriptionMap = new Map<string, string | null>();
677
+ if (collectedScalars) {
678
+ for (const scalar of collectedScalars) {
679
+ const description = mergeDescriptions(scalar.descriptions);
680
+ scalarDescriptionMap.set(scalar.scalarName, description);
681
+ }
682
+ }
683
+
684
+ const customScalars: CustomScalarInfo[] | null =
685
+ customScalarNames && customScalarNames.length > 0
686
+ ? customScalarNames.map((name) => ({
687
+ scalarName: name,
688
+ description: scalarDescriptionMap.get(name) ?? null,
689
+ }))
690
+ : null;
691
+
692
+ const numericEnums: NumericEnumInfo[] = baseTypes
693
+ .filter(
694
+ (
695
+ type,
696
+ ): type is BaseType & {
697
+ enumValues: NonNullable<BaseType["enumValues"]>;
698
+ } =>
699
+ type.kind === "Enum" && type.isNumericEnum && type.enumValues !== null,
700
+ )
701
+ .map((type) => ({
702
+ enumName: type.name,
703
+ members: type.enumValues
704
+ .filter(
705
+ (value): value is typeof value & { numericValue: number } =>
706
+ value.numericValue !== null,
707
+ )
708
+ .map((value) => ({
709
+ name: value.name,
710
+ numericValue: value.numericValue,
711
+ })),
712
+ }))
713
+ .filter((info) => info.members.length > 0);
714
+
715
+ const stringEnumMappings: StringEnumMappingInfo[] = baseTypes
716
+ .filter(
717
+ (
718
+ type,
719
+ ): type is BaseType & {
720
+ enumValues: NonNullable<BaseType["enumValues"]>;
721
+ } =>
722
+ type.kind === "Enum" &&
723
+ type.needsStringEnumMapping &&
724
+ type.enumValues !== null,
725
+ )
726
+ .map((type) => ({
727
+ enumName: type.name,
728
+ members: type.enumValues.map((value) => ({
729
+ graphqlValue: value.name,
730
+ typescriptValue: value.originalValue,
731
+ })),
732
+ }))
733
+ .filter((info) => info.members.length > 0);
734
+
735
+ return {
736
+ baseTypes,
737
+ inputTypes,
738
+ typeExtensions,
739
+ customScalarNames:
740
+ customScalarNames && customScalarNames.length > 0
741
+ ? customScalarNames
742
+ : null,
743
+ customScalars,
744
+ directiveDefinitions:
745
+ directiveDefinitions && directiveDefinitions.length > 0
746
+ ? directiveDefinitions
747
+ : null,
748
+ abstractTypeResolvers: resolversResult.abstractTypeResolvers,
749
+ autoGeneratedUnionNames,
750
+ autoGeneratedUnions,
751
+ typenameAutoResolveTypes: typenameAutoResolveTypes ?? [],
752
+ numericEnums,
753
+ stringEnumMappings,
754
+ hasQuery,
755
+ hasMutation,
756
+ hasErrors,
757
+ diagnostics,
758
+ };
759
+ }