@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,798 @@
1
+ import { dirname, relative, resolve } from "node:path";
2
+ import type ts from "typescript";
3
+ import type {
4
+ ResolvedOutputConfig,
5
+ ResolvedScalarMapping,
6
+ } from "../config-loader/index.js";
7
+ import {
8
+ type AbstractResolverInfo,
9
+ type ArgumentDefinition,
10
+ type DefineApiResolverInfo,
11
+ extractDefineApiResolvers,
12
+ } from "../resolver-extractor/extractor/define-api-extractor.js";
13
+ import type {
14
+ GraphQLFieldDefinition,
15
+ GraphQLInputValue,
16
+ TypeExtension,
17
+ } from "../resolver-extractor/index.js";
18
+ import { generateSchema } from "../schema-generator/index.js";
19
+
20
+ import {
21
+ collectDiagnostics,
22
+ convertTsTypeToGraphQLType,
23
+ type DirectiveDefinitionInfo,
24
+ deduplicateDiagnostics,
25
+ extractDirectiveDefinitions,
26
+ scanDirectory,
27
+ toPosixPath,
28
+ } from "../shared/index.js";
29
+ import { createSharedProgram } from "../shared/program-factory.js";
30
+ import { collectResults } from "../type-extractor/collector/result-collector.js";
31
+ import {
32
+ type CollectedScalarType,
33
+ type ConfigScalarMapping,
34
+ collectScalars,
35
+ type ScalarMetadataInfo,
36
+ } from "../type-extractor/collector/scalar-collector.js";
37
+ import { convertToGraphQL } from "../type-extractor/converter/graphql-converter.js";
38
+ import {
39
+ extractTypesFromProgram,
40
+ type GlobalTypeMapping,
41
+ } from "../type-extractor/extractor/type-extractor.js";
42
+ import { collectDeclaredTypeNames } from "../type-extractor/extractor/type-name-collector.js";
43
+ import type {
44
+ Diagnostic,
45
+ Diagnostics,
46
+ ExtractedTypeInfo,
47
+ } from "../type-extractor/index.js";
48
+ import {
49
+ buildScalarMappingTable,
50
+ type ScalarBaseTypeMappingTable,
51
+ } from "../type-extractor/mapper/scalar-base-type-mapper.js";
52
+ import { validateTypes } from "../type-extractor/validator/type-validator.js";
53
+ import { writeFiles } from "./writer/file-writer.js";
54
+
55
+ export interface GenerationConfig {
56
+ readonly cwd: string;
57
+ readonly sourceDir: string;
58
+ readonly sourceIgnoreGlobs: ReadonlyArray<string>;
59
+ readonly output: ResolvedOutputConfig;
60
+ readonly configDir: string | null;
61
+ readonly customScalars: ReadonlyArray<ResolvedScalarMapping> | null;
62
+ readonly tsconfigPath: string | null;
63
+ }
64
+
65
+ export interface GeneratedFile {
66
+ readonly filePath: string;
67
+ readonly content: string;
68
+ }
69
+
70
+ export interface GenerationResult {
71
+ readonly success: boolean;
72
+ readonly files: ReadonlyArray<GeneratedFile>;
73
+ readonly diagnostics: ReadonlyArray<Diagnostic>;
74
+ }
75
+
76
+ interface TypesResult {
77
+ types: ReturnType<typeof collectResults>["types"];
78
+ extractedTypes: ReadonlyArray<ExtractedTypeInfo>;
79
+ diagnostics: Diagnostics;
80
+ detectedScalarNames: ReadonlyArray<string>;
81
+ detectedScalars: ReadonlyArray<ScalarMetadataInfo>;
82
+ collectedScalars: ReadonlyArray<CollectedScalarType>;
83
+ scalarMappingTable: ScalarBaseTypeMappingTable | null;
84
+ }
85
+
86
+ interface ResolversResult {
87
+ queryFields: { fields: ReadonlyArray<GraphQLFieldDefinition> };
88
+ mutationFields: { fields: ReadonlyArray<GraphQLFieldDefinition> };
89
+ typeExtensions: ReadonlyArray<TypeExtension>;
90
+ abstractTypeResolvers: ReadonlyArray<AbstractResolverInfo>;
91
+ diagnostics: Diagnostics;
92
+ }
93
+
94
+ interface PipelineContext {
95
+ readonly config: GenerationConfig;
96
+ readonly sourceFiles: ReadonlyArray<string>;
97
+ readonly program: ts.Program | null;
98
+ readonly knownTypeNames: ReadonlySet<string> | null;
99
+ readonly knownTypeSymbols: ReadonlyMap<string, ts.Symbol> | null;
100
+ readonly underlyingSymbolToTypeName: ReadonlyMap<ts.Symbol, string> | null;
101
+ readonly typesResult: TypesResult | null;
102
+ readonly resolversResult: ResolversResult | null;
103
+ readonly directiveDefinitions: DirectiveDefinitionInfo[] | null;
104
+ readonly diagnostics: Diagnostic[];
105
+ readonly aborted: boolean;
106
+ }
107
+
108
+ function collectAllDiagnostics(
109
+ typesResult: { diagnostics: Diagnostics },
110
+ resolversResult: { diagnostics: Diagnostics },
111
+ ): Diagnostic[] {
112
+ const diagnostics: Diagnostic[] = [];
113
+ diagnostics.push(...typesResult.diagnostics.errors);
114
+ diagnostics.push(...typesResult.diagnostics.warnings);
115
+ diagnostics.push(...resolversResult.diagnostics.errors);
116
+ diagnostics.push(...resolversResult.diagnostics.warnings);
117
+ return diagnostics;
118
+ }
119
+
120
+ function hasErrors(
121
+ typesResult: { diagnostics: { errors: ReadonlyArray<Diagnostic> } },
122
+ resolversResult: { diagnostics: { errors: ReadonlyArray<Diagnostic> } },
123
+ ): boolean {
124
+ return (
125
+ typesResult.diagnostics.errors.length > 0 ||
126
+ resolversResult.diagnostics.errors.length > 0
127
+ );
128
+ }
129
+
130
+ interface ExtractTypesCoreParams {
131
+ readonly program: ts.Program;
132
+ readonly sourceFiles: ReadonlyArray<string>;
133
+ readonly customScalarNames: ReadonlyArray<string>;
134
+ readonly globalTypeMappings: ReadonlyArray<GlobalTypeMapping>;
135
+ readonly configScalars: ReadonlyArray<ConfigScalarMapping>;
136
+ readonly sourceRoot: string | null;
137
+ readonly knownTypeNames: ReadonlySet<string>;
138
+ readonly knownTypeSymbols: ReadonlyMap<string, ts.Symbol>;
139
+ readonly underlyingSymbolToTypeName: ReadonlyMap<ts.Symbol, string>;
140
+ }
141
+
142
+ function extractTypesCore(params: ExtractTypesCoreParams): TypesResult {
143
+ const {
144
+ program,
145
+ sourceFiles,
146
+ customScalarNames,
147
+ globalTypeMappings,
148
+ configScalars,
149
+ sourceRoot,
150
+ knownTypeNames,
151
+ knownTypeSymbols,
152
+ underlyingSymbolToTypeName,
153
+ } = params;
154
+ const allDiagnostics: Diagnostic[] = [];
155
+
156
+ // Pass 1: Extract types and detect scalars (without scalar mapping table)
157
+ const pass1Result = extractTypesFromProgram(program, sourceFiles, {
158
+ globalTypeMappings,
159
+ knownTypeNames,
160
+ knownTypeSymbols,
161
+ underlyingSymbolToTypeName,
162
+ scalarMappingTable: null,
163
+ });
164
+
165
+ // Build scalar mapping table from detected scalars
166
+ const scalarMappingTable =
167
+ pass1Result.detectedScalars.length > 0
168
+ ? buildScalarMappingTable({
169
+ detectedScalars: pass1Result.detectedScalars,
170
+ checker: program.getTypeChecker(),
171
+ program,
172
+ })
173
+ : null;
174
+
175
+ // Report scalar mapping conflicts as diagnostics
176
+ if (scalarMappingTable) {
177
+ for (const [, conflict] of scalarMappingTable.conflicts) {
178
+ const baseTypeName = conflict.baseTypeSymbol.getName();
179
+ const scalarNames = conflict.conflictingScalars
180
+ .map((s) => s.scalarName)
181
+ .join(", ");
182
+ allDiagnostics.push({
183
+ code: conflict.code,
184
+ message: `Base type '${baseTypeName}' maps to multiple scalars: ${scalarNames}. Use explicit scalar type instead of the base type.`,
185
+ severity: "error",
186
+ location: null,
187
+ });
188
+ }
189
+ }
190
+
191
+ // Pass 2: Re-extract types with scalar mapping table (if we have detected scalars)
192
+ const extractionResult = scalarMappingTable
193
+ ? extractTypesFromProgram(program, sourceFiles, {
194
+ globalTypeMappings,
195
+ knownTypeNames,
196
+ knownTypeSymbols,
197
+ underlyingSymbolToTypeName,
198
+ scalarMappingTable,
199
+ })
200
+ : pass1Result;
201
+
202
+ allDiagnostics.push(...extractionResult.diagnostics);
203
+
204
+ const allCustomScalarNames = [
205
+ ...customScalarNames,
206
+ ...extractionResult.detectedScalarNames,
207
+ ];
208
+
209
+ const scalarValidationResult = collectScalars(
210
+ extractionResult.detectedScalars,
211
+ configScalars,
212
+ { sourceRoot },
213
+ );
214
+ const collectedScalars: CollectedScalarType[] = scalarValidationResult.success
215
+ ? [...scalarValidationResult.data]
216
+ : [];
217
+ if (!scalarValidationResult.success) {
218
+ for (const error of scalarValidationResult.errors) {
219
+ allDiagnostics.push({
220
+ code: error.code,
221
+ message: error.message,
222
+ severity: error.severity,
223
+ location: null,
224
+ });
225
+ }
226
+ }
227
+
228
+ const conversionResult = convertToGraphQL(extractionResult.types);
229
+ allDiagnostics.push(...conversionResult.diagnostics);
230
+
231
+ const validationResult = validateTypes({
232
+ types: conversionResult.types,
233
+ customScalarNames: allCustomScalarNames,
234
+ });
235
+ allDiagnostics.push(...validationResult.diagnostics);
236
+
237
+ const result = collectResults(conversionResult.types, allDiagnostics);
238
+ return {
239
+ ...result,
240
+ extractedTypes: extractionResult.types,
241
+ detectedScalarNames: extractionResult.detectedScalarNames,
242
+ detectedScalars: extractionResult.detectedScalars,
243
+ collectedScalars,
244
+ scalarMappingTable,
245
+ };
246
+ }
247
+
248
+ function convertArgsToInputValues(
249
+ args: ReadonlyArray<ArgumentDefinition>,
250
+ ): GraphQLInputValue[] {
251
+ return args.map((arg) => ({
252
+ name: arg.name,
253
+ type: {
254
+ ...convertTsTypeToGraphQLType(arg.tsType),
255
+ nullable: arg.tsType.nullable || arg.optional,
256
+ },
257
+ description: arg.description,
258
+ deprecated: arg.deprecated,
259
+ defaultValue: arg.defaultValue,
260
+ inlineObjectProperties: arg.tsType.inlineObjectProperties ?? null,
261
+ inlineEnumMembers: arg.tsType.inlineEnumMembers ?? null,
262
+ externalEnumSymbol: arg.tsType.externalEnumSymbol ?? null,
263
+ externalEnumDescription: arg.tsType.externalEnumDescription ?? null,
264
+ externalEnumDeprecated: arg.tsType.externalEnumDeprecated ?? null,
265
+ inlineUnionMembers:
266
+ arg.tsType.kind === "union" ? (arg.tsType.members ?? null) : null,
267
+ }));
268
+ }
269
+
270
+ function convertDefineApiToFields(
271
+ resolvers: ReadonlyArray<DefineApiResolverInfo>,
272
+ ): {
273
+ queryFields: { fields: ReadonlyArray<GraphQLFieldDefinition> };
274
+ mutationFields: { fields: ReadonlyArray<GraphQLFieldDefinition> };
275
+ typeExtensions: ReadonlyArray<TypeExtension>;
276
+ } {
277
+ const queryFields: GraphQLFieldDefinition[] = [];
278
+ const mutationFields: GraphQLFieldDefinition[] = [];
279
+ const typeExtensionMap = new Map<string, GraphQLFieldDefinition[]>();
280
+
281
+ for (const resolver of resolvers) {
282
+ const returnType = resolver.returnType;
283
+ const fieldDef: GraphQLFieldDefinition = {
284
+ name: resolver.fieldName,
285
+ type: convertTsTypeToGraphQLType(returnType),
286
+ args: resolver.args ? convertArgsToInputValues(resolver.args) : null,
287
+ sourceLocation: resolver.sourceLocation,
288
+ resolverExportName: resolver.fieldName,
289
+ description: resolver.description,
290
+ deprecated: resolver.deprecated,
291
+ directives: resolver.directives,
292
+ returnTypeInlineObjectProperties:
293
+ returnType.inlineObjectProperties ?? null,
294
+ returnTypeInlineObjectDescription:
295
+ returnType.inlineObjectDescription ?? null,
296
+ returnTypeInlineObjectDeprecated:
297
+ returnType.inlineObjectDeprecated ?? null,
298
+ returnTypeInlineEnumMembers: returnType.inlineEnumMembers ?? null,
299
+ returnTypeInlineUnionMembers:
300
+ returnType.kind === "union" ? (returnType.members ?? null) : null,
301
+ returnTypeExternalEnumSymbol: returnType.externalEnumSymbol ?? null,
302
+ returnTypeExternalEnumDescription:
303
+ returnType.externalEnumDescription ?? null,
304
+ returnTypeExternalEnumDeprecated:
305
+ returnType.externalEnumDeprecated ?? null,
306
+ };
307
+
308
+ if (resolver.resolverType === "query") {
309
+ queryFields.push(fieldDef);
310
+ } else if (resolver.resolverType === "mutation") {
311
+ mutationFields.push(fieldDef);
312
+ } else if (resolver.resolverType === "field" && resolver.parentTypeName) {
313
+ const existing = typeExtensionMap.get(resolver.parentTypeName) ?? [];
314
+ existing.push(fieldDef);
315
+ typeExtensionMap.set(resolver.parentTypeName, existing);
316
+ }
317
+ }
318
+
319
+ const typeExtensions: TypeExtension[] = [];
320
+ for (const [targetTypeName, fields] of typeExtensionMap) {
321
+ typeExtensions.push({ targetTypeName, fields });
322
+ }
323
+
324
+ return {
325
+ queryFields: { fields: queryFields },
326
+ mutationFields: { fields: mutationFields },
327
+ typeExtensions,
328
+ };
329
+ }
330
+
331
+ function normalizePathInMessage(message: string, sourceRoot: string): string {
332
+ const normalizedSourceRoot = toPosixPath(sourceRoot);
333
+ const normalizedMessage = message.replaceAll("\\", "/");
334
+ const escapedSourceRoot = normalizedSourceRoot.replace(
335
+ /[.*+?^${}()|[\]\\]/g,
336
+ "\\$&",
337
+ );
338
+ const pattern = new RegExp(`${escapedSourceRoot}/`, "g");
339
+ return normalizedMessage.replace(pattern, "");
340
+ }
341
+
342
+ function normalizeDiagnosticPaths(
343
+ diagnostics: ReadonlyArray<Diagnostic>,
344
+ sourceRoot: string,
345
+ ): Diagnostic[] {
346
+ const normalized = diagnostics.map((d) => {
347
+ const normalizedMessage = normalizePathInMessage(d.message, sourceRoot);
348
+
349
+ if (d.location === null) {
350
+ return {
351
+ ...d,
352
+ message: normalizedMessage,
353
+ };
354
+ }
355
+ return {
356
+ ...d,
357
+ message: normalizedMessage,
358
+ location: {
359
+ ...d.location,
360
+ file: toPosixPath(relative(sourceRoot, d.location.file)),
361
+ },
362
+ };
363
+ });
364
+ return deduplicateDiagnostics(normalized);
365
+ }
366
+
367
+ interface ExtractResolversCoreParams {
368
+ readonly program: ts.Program;
369
+ readonly sourceFiles: ReadonlyArray<string>;
370
+ readonly knownTypeNames: ReadonlySet<string>;
371
+ readonly knownTypeSymbols: ReadonlyMap<string, ts.Symbol>;
372
+ readonly underlyingSymbolToTypeName: ReadonlyMap<ts.Symbol, string>;
373
+ readonly globalTypeMappings: ReadonlyArray<GlobalTypeMapping>;
374
+ readonly scalarMappingTable: ScalarBaseTypeMappingTable | null;
375
+ }
376
+
377
+ function extractResolversCore(
378
+ params: ExtractResolversCoreParams,
379
+ ): ResolversResult {
380
+ const {
381
+ program,
382
+ sourceFiles,
383
+ knownTypeNames,
384
+ knownTypeSymbols,
385
+ underlyingSymbolToTypeName,
386
+ globalTypeMappings,
387
+ scalarMappingTable,
388
+ } = params;
389
+ const allDiagnostics: Diagnostic[] = [];
390
+
391
+ const sourceFilesSet = new Set(sourceFiles);
392
+ const defineApiExtractionResult = extractDefineApiResolvers(
393
+ program,
394
+ sourceFiles,
395
+ {
396
+ knownTypeNames,
397
+ knownTypeSymbols,
398
+ underlyingSymbolToTypeName,
399
+ globalTypeMappings,
400
+ sourceFiles: sourceFilesSet,
401
+ scalarMappingTable,
402
+ },
403
+ );
404
+ allDiagnostics.push(...defineApiExtractionResult.diagnostics);
405
+
406
+ const result = convertDefineApiToFields(defineApiExtractionResult.resolvers);
407
+ return {
408
+ queryFields: result.queryFields,
409
+ mutationFields: result.mutationFields,
410
+ typeExtensions: result.typeExtensions,
411
+ abstractTypeResolvers: defineApiExtractionResult.abstractTypeResolvers,
412
+ diagnostics: collectDiagnostics(allDiagnostics),
413
+ };
414
+ }
415
+
416
+ function buildExcludePaths(
417
+ cwd: string,
418
+ output: ResolvedOutputConfig,
419
+ ): string[] {
420
+ const paths: string[] = [];
421
+ if (output.resolversPath !== null) {
422
+ paths.push(resolve(cwd, output.resolversPath));
423
+ }
424
+ if (output.typeDefsPath !== null) {
425
+ paths.push(resolve(cwd, output.typeDefsPath));
426
+ }
427
+ if (output.schemaPath !== null) {
428
+ paths.push(resolve(cwd, output.schemaPath));
429
+ }
430
+ return paths;
431
+ }
432
+
433
+ function getOutputDir(output: ResolvedOutputConfig): string {
434
+ const path = output.resolversPath ?? output.typeDefsPath ?? output.schemaPath;
435
+ if (path !== null) {
436
+ return dirname(path);
437
+ }
438
+ return "src/gqlkit/__generated__";
439
+ }
440
+
441
+ function createInitialContext(config: GenerationConfig): PipelineContext {
442
+ return {
443
+ config,
444
+ sourceFiles: [],
445
+ program: null,
446
+ knownTypeNames: null,
447
+ knownTypeSymbols: null,
448
+ underlyingSymbolToTypeName: null,
449
+ typesResult: null,
450
+ resolversResult: null,
451
+ directiveDefinitions: null,
452
+ diagnostics: [],
453
+ aborted: false,
454
+ };
455
+ }
456
+
457
+ async function scanSourceFilesStep(
458
+ ctx: PipelineContext,
459
+ ): Promise<PipelineContext> {
460
+ const absoluteSourceDir = resolve(ctx.config.cwd, ctx.config.sourceDir);
461
+ const excludePaths = buildExcludePaths(ctx.config.cwd, ctx.config.output);
462
+
463
+ const scanResult = await scanDirectory(absoluteSourceDir, {
464
+ excludeGlobs: [
465
+ ...ctx.config.sourceIgnoreGlobs,
466
+ "**/*.test.ts",
467
+ "**/*.spec.ts",
468
+ ],
469
+ excludePaths,
470
+ });
471
+
472
+ if (scanResult.errors.length > 0) {
473
+ return {
474
+ ...ctx,
475
+ diagnostics: [...ctx.diagnostics, ...scanResult.errors],
476
+ aborted: true,
477
+ };
478
+ }
479
+
480
+ return { ...ctx, sourceFiles: scanResult.files };
481
+ }
482
+
483
+ function createProgramStep(ctx: PipelineContext): PipelineContext {
484
+ if (ctx.aborted) return ctx;
485
+
486
+ const programResult = createSharedProgram({
487
+ cwd: ctx.config.cwd,
488
+ tsconfigPath: ctx.config.tsconfigPath ?? null,
489
+ typeFiles: ctx.sourceFiles,
490
+ resolverFiles: ctx.sourceFiles,
491
+ });
492
+
493
+ if (programResult.diagnostics.length > 0 || !programResult.program) {
494
+ return {
495
+ ...ctx,
496
+ diagnostics: [...ctx.diagnostics, ...programResult.diagnostics],
497
+ aborted: true,
498
+ };
499
+ }
500
+
501
+ return { ...ctx, program: programResult.program };
502
+ }
503
+
504
+ function collectTypeNamesStep(ctx: PipelineContext): PipelineContext {
505
+ if (ctx.aborted || !ctx.program) return ctx;
506
+
507
+ const result = collectDeclaredTypeNames(ctx.program, ctx.sourceFiles);
508
+
509
+ return {
510
+ ...ctx,
511
+ knownTypeNames: result.typeNames,
512
+ knownTypeSymbols: result.typeSymbols,
513
+ underlyingSymbolToTypeName: result.underlyingSymbolToTypeName,
514
+ };
515
+ }
516
+
517
+ function prepareScalarConfig(config: GenerationConfig): {
518
+ customScalarNames: string[];
519
+ globalTypeMappings: GlobalTypeMapping[];
520
+ configScalars: ConfigScalarMapping[];
521
+ } {
522
+ const customScalarNames =
523
+ config.customScalars?.map((s) => s.graphqlName) ?? [];
524
+
525
+ const globalTypeMappings: GlobalTypeMapping[] =
526
+ config.customScalars
527
+ ?.filter((s) => s.importPath === null)
528
+ .map((s) => ({
529
+ typeName: s.typeName,
530
+ scalarName: s.graphqlName,
531
+ only: s.only,
532
+ })) ?? [];
533
+
534
+ const configScalars: ConfigScalarMapping[] =
535
+ config.customScalars?.map((s) => {
536
+ let sourceFile = "";
537
+ if (s.importPath !== null) {
538
+ if (s.importPath.startsWith(".")) {
539
+ const baseDir = config.configDir ?? config.cwd;
540
+ sourceFile = `${resolve(baseDir, s.importPath)}.ts`;
541
+ } else {
542
+ sourceFile = s.importPath;
543
+ }
544
+ }
545
+ return {
546
+ scalarName: s.graphqlName,
547
+ typeName: s.typeName,
548
+ only: s.only,
549
+ sourceFile,
550
+ line: 1,
551
+ description: s.description,
552
+ fromConfig: true,
553
+ };
554
+ }) ?? [];
555
+
556
+ return { customScalarNames, globalTypeMappings, configScalars };
557
+ }
558
+
559
+ function extractTypesStep(ctx: PipelineContext): PipelineContext {
560
+ if (
561
+ ctx.aborted ||
562
+ !ctx.program ||
563
+ !ctx.knownTypeNames ||
564
+ !ctx.knownTypeSymbols ||
565
+ !ctx.underlyingSymbolToTypeName
566
+ )
567
+ return ctx;
568
+
569
+ const { customScalarNames, globalTypeMappings, configScalars } =
570
+ prepareScalarConfig(ctx.config);
571
+
572
+ const typesResult = extractTypesCore({
573
+ program: ctx.program,
574
+ sourceFiles: ctx.sourceFiles,
575
+ customScalarNames,
576
+ globalTypeMappings,
577
+ configScalars,
578
+ sourceRoot: ctx.config.cwd,
579
+ knownTypeNames: ctx.knownTypeNames,
580
+ knownTypeSymbols: ctx.knownTypeSymbols,
581
+ underlyingSymbolToTypeName: ctx.underlyingSymbolToTypeName,
582
+ });
583
+
584
+ return { ...ctx, typesResult };
585
+ }
586
+
587
+ function extractResolversStep(ctx: PipelineContext): PipelineContext {
588
+ if (
589
+ ctx.aborted ||
590
+ !ctx.program ||
591
+ !ctx.knownTypeNames ||
592
+ !ctx.knownTypeSymbols ||
593
+ !ctx.underlyingSymbolToTypeName ||
594
+ !ctx.typesResult
595
+ )
596
+ return ctx;
597
+
598
+ const { globalTypeMappings } = prepareScalarConfig(ctx.config);
599
+
600
+ const resolversResult = extractResolversCore({
601
+ program: ctx.program,
602
+ sourceFiles: ctx.sourceFiles,
603
+ knownTypeNames: ctx.knownTypeNames,
604
+ knownTypeSymbols: ctx.knownTypeSymbols,
605
+ underlyingSymbolToTypeName: ctx.underlyingSymbolToTypeName,
606
+ globalTypeMappings,
607
+ scalarMappingTable: ctx.typesResult.scalarMappingTable,
608
+ });
609
+
610
+ return { ...ctx, resolversResult };
611
+ }
612
+
613
+ function extractDirectivesStep(ctx: PipelineContext): PipelineContext {
614
+ if (ctx.aborted || !ctx.program) return ctx;
615
+
616
+ const directiveDefinitionResult = extractDirectiveDefinitions(
617
+ ctx.program,
618
+ ctx.sourceFiles,
619
+ );
620
+
621
+ const directiveDefinitions: DirectiveDefinitionInfo[] =
622
+ directiveDefinitionResult.definitions.length > 0
623
+ ? [...directiveDefinitionResult.definitions]
624
+ : [];
625
+
626
+ const newDiagnostics = [...ctx.diagnostics];
627
+ for (const error of directiveDefinitionResult.errors) {
628
+ newDiagnostics.push({
629
+ code: error.code,
630
+ message: error.message,
631
+ severity: "error",
632
+ location: {
633
+ file: error.sourceFile,
634
+ line: error.line,
635
+ column: 1,
636
+ },
637
+ });
638
+ }
639
+
640
+ return { ...ctx, directiveDefinitions, diagnostics: newDiagnostics };
641
+ }
642
+
643
+ function validateExtractionStep(ctx: PipelineContext): PipelineContext {
644
+ if (ctx.aborted || !ctx.typesResult || !ctx.resolversResult) return ctx;
645
+
646
+ const allDiagnostics = [
647
+ ...ctx.diagnostics,
648
+ ...collectAllDiagnostics(ctx.typesResult, ctx.resolversResult),
649
+ ];
650
+
651
+ if (hasErrors(ctx.typesResult, ctx.resolversResult)) {
652
+ return {
653
+ ...ctx,
654
+ diagnostics: allDiagnostics,
655
+ aborted: true,
656
+ };
657
+ }
658
+
659
+ return { ...ctx, diagnostics: allDiagnostics };
660
+ }
661
+
662
+ function generateSchemaStep(ctx: PipelineContext): {
663
+ ctx: PipelineContext;
664
+ schemaResult: ReturnType<typeof generateSchema> | null;
665
+ } {
666
+ if (ctx.aborted || !ctx.typesResult || !ctx.resolversResult) {
667
+ return { ctx, schemaResult: null };
668
+ }
669
+
670
+ const { customScalarNames } = prepareScalarConfig(ctx.config);
671
+ const allCustomScalarNames = [
672
+ ...customScalarNames,
673
+ ...ctx.typesResult.detectedScalarNames,
674
+ ];
675
+
676
+ const schemaResult = generateSchema({
677
+ typesResult: ctx.typesResult,
678
+ extractedTypes: ctx.typesResult.extractedTypes,
679
+ resolversResult: ctx.resolversResult,
680
+ outputDir: resolve(ctx.config.cwd, getOutputDir(ctx.config.output)),
681
+ customScalarNames: allCustomScalarNames,
682
+ customScalars: ctx.typesResult.collectedScalars,
683
+ directiveDefinitions:
684
+ ctx.directiveDefinitions && ctx.directiveDefinitions.length > 0
685
+ ? ctx.directiveDefinitions
686
+ : null,
687
+ enablePruning: null,
688
+ sourceRoot: ctx.config.cwd,
689
+ knownTypeNames: ctx.knownTypeNames,
690
+ });
691
+
692
+ const newDiagnostics = [...ctx.diagnostics, ...schemaResult.diagnostics];
693
+
694
+ if (schemaResult.hasErrors) {
695
+ return {
696
+ ctx: { ...ctx, diagnostics: newDiagnostics, aborted: true },
697
+ schemaResult: null,
698
+ };
699
+ }
700
+
701
+ return { ctx: { ...ctx, diagnostics: newDiagnostics }, schemaResult };
702
+ }
703
+
704
+ function generateOutputFiles(
705
+ config: GenerationConfig,
706
+ schemaResult: ReturnType<typeof generateSchema>,
707
+ ): GeneratedFile[] {
708
+ const files: GeneratedFile[] = [];
709
+
710
+ if (config.output.typeDefsPath !== null) {
711
+ files.push({
712
+ filePath: resolve(config.cwd, config.output.typeDefsPath),
713
+ content: schemaResult.typeDefsCode,
714
+ });
715
+ }
716
+
717
+ if (config.output.schemaPath !== null) {
718
+ files.push({
719
+ filePath: resolve(config.cwd, config.output.schemaPath),
720
+ content: schemaResult.sdlContent,
721
+ });
722
+ }
723
+
724
+ if (config.output.resolversPath !== null) {
725
+ files.push({
726
+ filePath: resolve(config.cwd, config.output.resolversPath),
727
+ content: schemaResult.resolversCode,
728
+ });
729
+ }
730
+
731
+ return files;
732
+ }
733
+
734
+ export async function executeGeneration(
735
+ config: GenerationConfig,
736
+ ): Promise<GenerationResult> {
737
+ let ctx = createInitialContext(config);
738
+
739
+ ctx = await scanSourceFilesStep(ctx);
740
+ ctx = createProgramStep(ctx);
741
+ ctx = collectTypeNamesStep(ctx);
742
+ ctx = extractTypesStep(ctx);
743
+ ctx = extractResolversStep(ctx);
744
+ ctx = extractDirectivesStep(ctx);
745
+ ctx = validateExtractionStep(ctx);
746
+
747
+ if (ctx.aborted) {
748
+ return {
749
+ success: false,
750
+ files: [],
751
+ diagnostics: normalizeDiagnosticPaths(ctx.diagnostics, config.cwd),
752
+ };
753
+ }
754
+
755
+ const { ctx: schemaCtx, schemaResult } = generateSchemaStep(ctx);
756
+ ctx = schemaCtx;
757
+
758
+ if (ctx.aborted || !schemaResult) {
759
+ return {
760
+ success: false,
761
+ files: [],
762
+ diagnostics: normalizeDiagnosticPaths(ctx.diagnostics, config.cwd),
763
+ };
764
+ }
765
+
766
+ const files = generateOutputFiles(config, schemaResult);
767
+
768
+ return {
769
+ success: true,
770
+ files,
771
+ diagnostics: normalizeDiagnosticPaths(ctx.diagnostics, config.cwd),
772
+ };
773
+ }
774
+
775
+ export interface WriteFilesConfig {
776
+ readonly files: ReadonlyArray<GeneratedFile>;
777
+ }
778
+
779
+ export interface WriteFilesResult {
780
+ readonly success: boolean;
781
+ readonly filesWritten: ReadonlyArray<string>;
782
+ }
783
+
784
+ export async function writeGeneratedFiles(
785
+ config: WriteFilesConfig,
786
+ ): Promise<WriteFilesResult> {
787
+ const result = await writeFiles({
788
+ files: config.files.map((f) => ({
789
+ filePath: f.filePath,
790
+ content: f.content,
791
+ })),
792
+ });
793
+
794
+ return {
795
+ success: result.success,
796
+ filesWritten: result.writtenPaths,
797
+ };
798
+ }