@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,672 @@
1
+ import type { Diagnostic } from "../type-extractor/types/index.js";
2
+ import {
3
+ DEFAULT_RESOLVERS_PATH,
4
+ DEFAULT_SCHEMA_PATH,
5
+ DEFAULT_SOURCE_DIR,
6
+ DEFAULT_TYPEDEFS_PATH,
7
+ type ResolvedConfig,
8
+ type ResolvedHooksConfig,
9
+ type ResolvedOutputConfig,
10
+ type ResolvedScalarMapping,
11
+ } from "./loader.js";
12
+
13
+ export interface ValidateConfigOptions {
14
+ readonly config: unknown;
15
+ readonly configPath: string;
16
+ }
17
+
18
+ export interface ValidateConfigResult {
19
+ readonly valid: boolean;
20
+ readonly resolvedConfig: ResolvedConfig | undefined;
21
+ readonly diagnostics: ReadonlyArray<Diagnostic>;
22
+ }
23
+
24
+ const BUILTIN_SCALAR_NAMES = [
25
+ "ID",
26
+ "String",
27
+ "Int",
28
+ "Float",
29
+ "Boolean",
30
+ ] as const;
31
+
32
+ function isRecord(value: unknown): value is Record<string, unknown> {
33
+ return typeof value === "object" && value !== null && !Array.isArray(value);
34
+ }
35
+
36
+ function getDefaultPathForField(fieldName: string): string {
37
+ switch (fieldName) {
38
+ case "output.resolversPath":
39
+ return DEFAULT_RESOLVERS_PATH;
40
+ case "output.typeDefsPath":
41
+ return DEFAULT_TYPEDEFS_PATH;
42
+ case "output.schemaPath":
43
+ return DEFAULT_SCHEMA_PATH;
44
+ default:
45
+ return "";
46
+ }
47
+ }
48
+
49
+ function validateOutputPath(
50
+ value: unknown,
51
+ fieldName: string,
52
+ configPath: string,
53
+ ): { resolved: string | null; diagnostics: Diagnostic[] } {
54
+ const diagnostics: Diagnostic[] = [];
55
+
56
+ if (value === undefined) {
57
+ const defaultPath = getDefaultPathForField(fieldName);
58
+ return { resolved: defaultPath, diagnostics: [] };
59
+ }
60
+
61
+ if (value === null) {
62
+ return { resolved: null, diagnostics: [] };
63
+ }
64
+
65
+ if (typeof value !== "string") {
66
+ diagnostics.push({
67
+ code: "CONFIG_INVALID_OUTPUT_TYPE",
68
+ message: `${fieldName} must be a string, null, or undefined`,
69
+ severity: "error",
70
+ location: { file: configPath, line: 1, column: 1 },
71
+ });
72
+ return { resolved: null, diagnostics };
73
+ }
74
+
75
+ if (value === "") {
76
+ diagnostics.push({
77
+ code: "CONFIG_INVALID_OUTPUT_PATH",
78
+ message: `${fieldName} path cannot be empty`,
79
+ severity: "error",
80
+ location: { file: configPath, line: 1, column: 1 },
81
+ });
82
+ return { resolved: null, diagnostics };
83
+ }
84
+
85
+ return { resolved: value, diagnostics: [] };
86
+ }
87
+
88
+ function validateSourceDir(
89
+ value: unknown,
90
+ configPath: string,
91
+ ): { resolved: string | undefined; diagnostics: Diagnostic[] } {
92
+ const diagnostics: Diagnostic[] = [];
93
+
94
+ if (value === undefined) {
95
+ return { resolved: DEFAULT_SOURCE_DIR, diagnostics: [] };
96
+ }
97
+
98
+ if (typeof value !== "string") {
99
+ diagnostics.push({
100
+ code: "CONFIG_INVALID_TYPE",
101
+ message: "sourceDir must be a string",
102
+ severity: "error",
103
+ location: { file: configPath, line: 1, column: 1 },
104
+ });
105
+ return { resolved: undefined, diagnostics };
106
+ }
107
+
108
+ if (value === "") {
109
+ diagnostics.push({
110
+ code: "CONFIG_INVALID_SOURCE_DIR",
111
+ message: "sourceDir cannot be empty",
112
+ severity: "error",
113
+ location: { file: configPath, line: 1, column: 1 },
114
+ });
115
+ return { resolved: undefined, diagnostics };
116
+ }
117
+
118
+ return { resolved: value, diagnostics: [] };
119
+ }
120
+
121
+ function validateSourceIgnoreGlobs(
122
+ value: unknown,
123
+ configPath: string,
124
+ ): { resolved: ReadonlyArray<string> | undefined; diagnostics: Diagnostic[] } {
125
+ const diagnostics: Diagnostic[] = [];
126
+
127
+ if (value === undefined) {
128
+ return { resolved: [], diagnostics: [] };
129
+ }
130
+
131
+ if (!Array.isArray(value)) {
132
+ diagnostics.push({
133
+ code: "CONFIG_INVALID_IGNORE_GLOBS",
134
+ message: "sourceIgnoreGlobs must be an array of strings",
135
+ severity: "error",
136
+ location: { file: configPath, line: 1, column: 1 },
137
+ });
138
+ return { resolved: undefined, diagnostics };
139
+ }
140
+
141
+ for (const item of value) {
142
+ if (typeof item !== "string") {
143
+ diagnostics.push({
144
+ code: "CONFIG_INVALID_IGNORE_GLOBS",
145
+ message: "sourceIgnoreGlobs must be an array of strings",
146
+ severity: "error",
147
+ location: { file: configPath, line: 1, column: 1 },
148
+ });
149
+ return { resolved: undefined, diagnostics };
150
+ }
151
+ }
152
+
153
+ return { resolved: value as ReadonlyArray<string>, diagnostics: [] };
154
+ }
155
+
156
+ function validateTsconfigPath(
157
+ value: unknown,
158
+ configPath: string,
159
+ ): { resolved: string | null; diagnostics: Diagnostic[] } {
160
+ const diagnostics: Diagnostic[] = [];
161
+
162
+ if (value === undefined) {
163
+ return { resolved: null, diagnostics: [] };
164
+ }
165
+
166
+ if (typeof value !== "string") {
167
+ diagnostics.push({
168
+ code: "CONFIG_INVALID_TYPE",
169
+ message: "tsconfigPath must be a string",
170
+ severity: "error",
171
+ location: { file: configPath, line: 1, column: 1 },
172
+ });
173
+ return { resolved: null, diagnostics };
174
+ }
175
+
176
+ if (value === "") {
177
+ diagnostics.push({
178
+ code: "CONFIG_INVALID_PATH",
179
+ message: "tsconfigPath path cannot be empty",
180
+ severity: "error",
181
+ location: { file: configPath, line: 1, column: 1 },
182
+ });
183
+ return { resolved: null, diagnostics };
184
+ }
185
+
186
+ return { resolved: value, diagnostics: [] };
187
+ }
188
+
189
+ function validateOutputConfig(
190
+ output: unknown,
191
+ configPath: string,
192
+ ): { resolved: ResolvedOutputConfig | undefined; diagnostics: Diagnostic[] } {
193
+ const diagnostics: Diagnostic[] = [];
194
+
195
+ if (output === undefined) {
196
+ return {
197
+ resolved: {
198
+ resolversPath: DEFAULT_RESOLVERS_PATH,
199
+ typeDefsPath: DEFAULT_TYPEDEFS_PATH,
200
+ schemaPath: DEFAULT_SCHEMA_PATH,
201
+ },
202
+ diagnostics: [],
203
+ };
204
+ }
205
+
206
+ if (!isRecord(output)) {
207
+ diagnostics.push({
208
+ code: "CONFIG_INVALID_TYPE",
209
+ message: "output must be an object",
210
+ severity: "error",
211
+ location: { file: configPath, line: 1, column: 1 },
212
+ });
213
+ return { resolved: undefined, diagnostics };
214
+ }
215
+
216
+ const resolversPathResult = validateOutputPath(
217
+ output["resolversPath"],
218
+ "output.resolversPath",
219
+ configPath,
220
+ );
221
+ const typeDefsPathResult = validateOutputPath(
222
+ output["typeDefsPath"],
223
+ "output.typeDefsPath",
224
+ configPath,
225
+ );
226
+ const schemaPathResult = validateOutputPath(
227
+ output["schemaPath"],
228
+ "output.schemaPath",
229
+ configPath,
230
+ );
231
+
232
+ diagnostics.push(...resolversPathResult.diagnostics);
233
+ diagnostics.push(...typeDefsPathResult.diagnostics);
234
+ diagnostics.push(...schemaPathResult.diagnostics);
235
+
236
+ if (diagnostics.length > 0) {
237
+ return { resolved: undefined, diagnostics };
238
+ }
239
+
240
+ return {
241
+ resolved: {
242
+ resolversPath: resolversPathResult.resolved,
243
+ typeDefsPath: typeDefsPathResult.resolved,
244
+ schemaPath: schemaPathResult.resolved,
245
+ },
246
+ diagnostics: [],
247
+ };
248
+ }
249
+
250
+ function isNewFormat(
251
+ scalar: Record<string, unknown>,
252
+ ): scalar is Record<string, unknown> & { name: unknown; tsType: unknown } {
253
+ return "name" in scalar && "tsType" in scalar;
254
+ }
255
+
256
+ function isLegacyFormat(scalar: Record<string, unknown>): scalar is Record<
257
+ string,
258
+ unknown
259
+ > & {
260
+ graphqlName: unknown;
261
+ type: unknown;
262
+ } {
263
+ return "graphqlName" in scalar && "type" in scalar;
264
+ }
265
+
266
+ function validateNewScalarMapping(
267
+ scalar: Record<string, unknown>,
268
+ index: number,
269
+ configPath: string,
270
+ ): { resolved: ResolvedScalarMapping | undefined; diagnostics: Diagnostic[] } {
271
+ const diagnostics: Diagnostic[] = [];
272
+
273
+ if (typeof scalar["name"] !== "string") {
274
+ diagnostics.push({
275
+ code: "CONFIG_MISSING_PROPERTY",
276
+ message: `scalars[${index}].name is required and must be a string`,
277
+ severity: "error",
278
+ location: { file: configPath, line: 1, column: 1 },
279
+ });
280
+ }
281
+
282
+ if (!isRecord(scalar["tsType"])) {
283
+ diagnostics.push({
284
+ code: "CONFIG_MISSING_PROPERTY",
285
+ message: `scalars[${index}].tsType is required and must be an object`,
286
+ severity: "error",
287
+ location: { file: configPath, line: 1, column: 1 },
288
+ });
289
+ return { resolved: undefined, diagnostics };
290
+ }
291
+
292
+ const tsType = scalar["tsType"];
293
+
294
+ if (typeof tsType["name"] !== "string") {
295
+ diagnostics.push({
296
+ code: "CONFIG_MISSING_PROPERTY",
297
+ message: `scalars[${index}].tsType.name is required and must be a string`,
298
+ severity: "error",
299
+ location: { file: configPath, line: 1, column: 1 },
300
+ });
301
+ }
302
+
303
+ const only = scalar["only"];
304
+ if (only !== undefined && only !== "input" && only !== "output") {
305
+ diagnostics.push({
306
+ code: "CONFIG_INVALID_ONLY_VALUE",
307
+ message: `scalars[${index}].only must be "input" or "output"`,
308
+ severity: "error",
309
+ location: { file: configPath, line: 1, column: 1 },
310
+ });
311
+ }
312
+
313
+ const description = scalar["description"];
314
+ if (description !== undefined && typeof description !== "string") {
315
+ diagnostics.push({
316
+ code: "CONFIG_INVALID_TYPE",
317
+ message: `scalars[${index}].description must be a string`,
318
+ severity: "error",
319
+ location: { file: configPath, line: 1, column: 1 },
320
+ });
321
+ }
322
+
323
+ if (diagnostics.length > 0) {
324
+ return { resolved: undefined, diagnostics };
325
+ }
326
+
327
+ const graphqlName = scalar["name"] as string;
328
+
329
+ if (
330
+ BUILTIN_SCALAR_NAMES.includes(
331
+ graphqlName as (typeof BUILTIN_SCALAR_NAMES)[number],
332
+ )
333
+ ) {
334
+ diagnostics.push({
335
+ code: "CONFIG_BUILTIN_OVERRIDE",
336
+ message: `Cannot override built-in scalar '${graphqlName}'. Built-in scalars: ID, String, Int, Float, Boolean`,
337
+ severity: "error",
338
+ location: { file: configPath, line: 1, column: 1 },
339
+ });
340
+ return { resolved: undefined, diagnostics };
341
+ }
342
+
343
+ const importPath = typeof tsType["from"] === "string" ? tsType["from"] : null;
344
+
345
+ return {
346
+ resolved: {
347
+ graphqlName,
348
+ typeName: tsType["name"] as string,
349
+ importPath,
350
+ only: (only as "input" | "output" | undefined) ?? null,
351
+ description: (description as string | undefined) ?? null,
352
+ },
353
+ diagnostics,
354
+ };
355
+ }
356
+
357
+ function validateLegacyScalarMapping(
358
+ scalar: Record<string, unknown>,
359
+ index: number,
360
+ configPath: string,
361
+ ): { resolved: ResolvedScalarMapping | undefined; diagnostics: Diagnostic[] } {
362
+ const diagnostics: Diagnostic[] = [];
363
+
364
+ if (typeof scalar["graphqlName"] !== "string") {
365
+ diagnostics.push({
366
+ code: "CONFIG_MISSING_PROPERTY",
367
+ message: `scalars[${index}].graphqlName is required and must be a string`,
368
+ severity: "error",
369
+ location: { file: configPath, line: 1, column: 1 },
370
+ });
371
+ }
372
+
373
+ if (!isRecord(scalar["type"])) {
374
+ diagnostics.push({
375
+ code: "CONFIG_MISSING_PROPERTY",
376
+ message: `scalars[${index}].type is required and must be an object`,
377
+ severity: "error",
378
+ location: { file: configPath, line: 1, column: 1 },
379
+ });
380
+ return { resolved: undefined, diagnostics };
381
+ }
382
+
383
+ const type = scalar["type"];
384
+
385
+ if (typeof type["from"] !== "string") {
386
+ diagnostics.push({
387
+ code: "CONFIG_MISSING_PROPERTY",
388
+ message: `scalars[${index}].type.from is required and must be a string`,
389
+ severity: "error",
390
+ location: { file: configPath, line: 1, column: 1 },
391
+ });
392
+ }
393
+
394
+ if (typeof type["name"] !== "string") {
395
+ diagnostics.push({
396
+ code: "CONFIG_MISSING_PROPERTY",
397
+ message: `scalars[${index}].type.name is required and must be a string`,
398
+ severity: "error",
399
+ location: { file: configPath, line: 1, column: 1 },
400
+ });
401
+ }
402
+
403
+ if (diagnostics.length > 0) {
404
+ return { resolved: undefined, diagnostics };
405
+ }
406
+
407
+ const graphqlName = scalar["graphqlName"] as string;
408
+
409
+ if (
410
+ BUILTIN_SCALAR_NAMES.includes(
411
+ graphqlName as (typeof BUILTIN_SCALAR_NAMES)[number],
412
+ )
413
+ ) {
414
+ diagnostics.push({
415
+ code: "CONFIG_BUILTIN_OVERRIDE",
416
+ message: `Cannot override built-in scalar '${graphqlName}'. Built-in scalars: ID, String, Int, Float, Boolean`,
417
+ severity: "error",
418
+ location: { file: configPath, line: 1, column: 1 },
419
+ });
420
+ return { resolved: undefined, diagnostics };
421
+ }
422
+
423
+ return {
424
+ resolved: {
425
+ graphqlName,
426
+ typeName: type["name"] as string,
427
+ importPath: type["from"] as string,
428
+ only: null,
429
+ description: null,
430
+ },
431
+ diagnostics,
432
+ };
433
+ }
434
+
435
+ function validateScalarMapping(
436
+ scalar: unknown,
437
+ index: number,
438
+ configPath: string,
439
+ ): { resolved: ResolvedScalarMapping | undefined; diagnostics: Diagnostic[] } {
440
+ const diagnostics: Diagnostic[] = [];
441
+
442
+ if (!isRecord(scalar)) {
443
+ diagnostics.push({
444
+ code: "CONFIG_INVALID_TYPE",
445
+ message: `scalars[${index}] must be an object`,
446
+ severity: "error",
447
+ location: { file: configPath, line: 1, column: 1 },
448
+ });
449
+ return { resolved: undefined, diagnostics };
450
+ }
451
+
452
+ if (isNewFormat(scalar)) {
453
+ return validateNewScalarMapping(scalar, index, configPath);
454
+ }
455
+
456
+ if (isLegacyFormat(scalar)) {
457
+ return validateLegacyScalarMapping(scalar, index, configPath);
458
+ }
459
+
460
+ diagnostics.push({
461
+ code: "CONFIG_MISSING_PROPERTY",
462
+ message: `scalars[${index}] must have either (name, tsType) or (graphqlName, type)`,
463
+ severity: "error",
464
+ location: { file: configPath, line: 1, column: 1 },
465
+ });
466
+ return { resolved: undefined, diagnostics };
467
+ }
468
+
469
+ function validateHooksConfig(
470
+ hooks: unknown,
471
+ configPath: string,
472
+ ): { resolved: ResolvedHooksConfig | undefined; diagnostics: Diagnostic[] } {
473
+ const diagnostics: Diagnostic[] = [];
474
+
475
+ if (hooks === undefined) {
476
+ return {
477
+ resolved: { afterAllFileWrite: [] },
478
+ diagnostics: [],
479
+ };
480
+ }
481
+
482
+ if (!isRecord(hooks)) {
483
+ diagnostics.push({
484
+ code: "CONFIG_INVALID_TYPE",
485
+ message: "hooks must be an object",
486
+ severity: "error",
487
+ location: { file: configPath, line: 1, column: 1 },
488
+ });
489
+ return { resolved: undefined, diagnostics };
490
+ }
491
+
492
+ const afterAllFileWrite = hooks["afterAllFileWrite"];
493
+
494
+ if (afterAllFileWrite === undefined) {
495
+ return {
496
+ resolved: { afterAllFileWrite: [] },
497
+ diagnostics: [],
498
+ };
499
+ }
500
+
501
+ if (typeof afterAllFileWrite === "string") {
502
+ if (afterAllFileWrite === "") {
503
+ diagnostics.push({
504
+ code: "CONFIG_INVALID_HOOK_COMMAND",
505
+ message: "hooks.afterAllFileWrite contains empty command",
506
+ severity: "error",
507
+ location: { file: configPath, line: 1, column: 1 },
508
+ });
509
+ return { resolved: undefined, diagnostics };
510
+ }
511
+ return {
512
+ resolved: { afterAllFileWrite: [afterAllFileWrite] },
513
+ diagnostics: [],
514
+ };
515
+ }
516
+
517
+ if (Array.isArray(afterAllFileWrite)) {
518
+ for (const item of afterAllFileWrite) {
519
+ if (typeof item !== "string") {
520
+ diagnostics.push({
521
+ code: "CONFIG_INVALID_HOOK_TYPE",
522
+ message:
523
+ "hooks.afterAllFileWrite must be a string or array of strings",
524
+ severity: "error",
525
+ location: { file: configPath, line: 1, column: 1 },
526
+ });
527
+ return { resolved: undefined, diagnostics };
528
+ }
529
+ if (item === "") {
530
+ diagnostics.push({
531
+ code: "CONFIG_INVALID_HOOK_COMMAND",
532
+ message: "hooks.afterAllFileWrite contains empty command",
533
+ severity: "error",
534
+ location: { file: configPath, line: 1, column: 1 },
535
+ });
536
+ return { resolved: undefined, diagnostics };
537
+ }
538
+ }
539
+ return {
540
+ resolved: { afterAllFileWrite: afterAllFileWrite as string[] },
541
+ diagnostics: [],
542
+ };
543
+ }
544
+
545
+ diagnostics.push({
546
+ code: "CONFIG_INVALID_HOOK_TYPE",
547
+ message: "hooks.afterAllFileWrite must be a string or array of strings",
548
+ severity: "error",
549
+ location: { file: configPath, line: 1, column: 1 },
550
+ });
551
+ return { resolved: undefined, diagnostics };
552
+ }
553
+
554
+ export function validateConfig(
555
+ options: ValidateConfigOptions,
556
+ ): ValidateConfigResult {
557
+ const { config, configPath } = options;
558
+ const diagnostics: Diagnostic[] = [];
559
+
560
+ if (!isRecord(config)) {
561
+ diagnostics.push({
562
+ code: "CONFIG_INVALID_TYPE",
563
+ message: "Config must be an object",
564
+ severity: "error",
565
+ location: { file: configPath, line: 1, column: 1 },
566
+ });
567
+ return { valid: false, resolvedConfig: undefined, diagnostics };
568
+ }
569
+
570
+ const sourceDirResult = validateSourceDir(config["sourceDir"], configPath);
571
+ diagnostics.push(...sourceDirResult.diagnostics);
572
+
573
+ const sourceIgnoreGlobsResult = validateSourceIgnoreGlobs(
574
+ config["sourceIgnoreGlobs"],
575
+ configPath,
576
+ );
577
+ diagnostics.push(...sourceIgnoreGlobsResult.diagnostics);
578
+
579
+ const outputResult = validateOutputConfig(config["output"], configPath);
580
+ diagnostics.push(...outputResult.diagnostics);
581
+
582
+ const tsconfigPathResult = validateTsconfigPath(
583
+ config["tsconfigPath"],
584
+ configPath,
585
+ );
586
+ diagnostics.push(...tsconfigPathResult.diagnostics);
587
+
588
+ const hooksResult = validateHooksConfig(config["hooks"], configPath);
589
+ diagnostics.push(...hooksResult.diagnostics);
590
+
591
+ if (config["scalars"] !== undefined && !Array.isArray(config["scalars"])) {
592
+ diagnostics.push({
593
+ code: "CONFIG_INVALID_TYPE",
594
+ message: "scalars must be an array",
595
+ severity: "error",
596
+ location: { file: configPath, line: 1, column: 1 },
597
+ });
598
+ return { valid: false, resolvedConfig: undefined, diagnostics };
599
+ }
600
+
601
+ const scalarsArray = config["scalars"] ?? [];
602
+ const resolvedScalars: ResolvedScalarMapping[] = [];
603
+ const seenGraphqlNamesWithOnly = new Map<
604
+ string,
605
+ { index: number; only: "input" | "output" | null }
606
+ >();
607
+ const seenTypes = new Map<string, { index: number; names: string[] }>();
608
+
609
+ for (let i = 0; i < scalarsArray.length; i++) {
610
+ const scalar = scalarsArray[i];
611
+ const result = validateScalarMapping(scalar, i, configPath);
612
+ diagnostics.push(...result.diagnostics);
613
+
614
+ if (result.resolved) {
615
+ const { graphqlName, typeName, importPath, only } = result.resolved;
616
+
617
+ const scalarOnlyKey = `${graphqlName}::${only ?? "both"}`;
618
+ const existing = seenGraphqlNamesWithOnly.get(scalarOnlyKey);
619
+ if (existing) {
620
+ diagnostics.push({
621
+ code: "CONFIG_DUPLICATE_MAPPING",
622
+ message: `Duplicate scalar mapping: '${graphqlName}' with ${only ? `only: "${only}"` : "no only constraint"} is defined multiple times`,
623
+ severity: "error",
624
+ location: { file: configPath, line: 1, column: 1 },
625
+ });
626
+ } else {
627
+ seenGraphqlNamesWithOnly.set(scalarOnlyKey, { index: i, only });
628
+ }
629
+
630
+ const typeKey = `${importPath}::${typeName}`;
631
+ const existingType = seenTypes.get(typeKey);
632
+ if (existingType && existingType.names[0] !== graphqlName) {
633
+ existingType.names.push(graphqlName);
634
+ diagnostics.push({
635
+ code: "CONFIG_DUPLICATE_TYPE",
636
+ message: `Type '${typeName}' from '${importPath}' is mapped to multiple scalars: ${existingType.names.join(", ")}`,
637
+ severity: "error",
638
+ location: { file: configPath, line: 1, column: 1 },
639
+ });
640
+ } else if (!existingType) {
641
+ seenTypes.set(typeKey, { index: i, names: [graphqlName] });
642
+ }
643
+
644
+ if (diagnostics.length === 0) {
645
+ resolvedScalars.push(result.resolved);
646
+ }
647
+ }
648
+ }
649
+
650
+ if (
651
+ diagnostics.length > 0 ||
652
+ !sourceDirResult.resolved ||
653
+ !sourceIgnoreGlobsResult.resolved ||
654
+ !outputResult.resolved ||
655
+ !hooksResult.resolved
656
+ ) {
657
+ return { valid: false, resolvedConfig: undefined, diagnostics };
658
+ }
659
+
660
+ return {
661
+ valid: true,
662
+ resolvedConfig: {
663
+ sourceDir: sourceDirResult.resolved,
664
+ sourceIgnoreGlobs: sourceIgnoreGlobsResult.resolved,
665
+ output: outputResult.resolved,
666
+ scalars: resolvedScalars,
667
+ tsconfigPath: tsconfigPathResult.resolved,
668
+ hooks: hooksResult.resolved,
669
+ },
670
+ diagnostics: [],
671
+ };
672
+ }