@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,482 @@
1
+ import type {
2
+ Diagnostic,
3
+ ExtractedTypeInfo,
4
+ SourceLocation,
5
+ TSTypeReference,
6
+ } from "../type-extractor/types/index.js";
7
+ import type { InlineUnionMemberInfo } from "./inline-union-types.js";
8
+ import { isInputTypeName } from "./naming-convention.js";
9
+ import {
10
+ findTypenameProperty,
11
+ type TypenameFieldName,
12
+ } from "./typename-types.js";
13
+
14
+ export interface ValidateUnionResult {
15
+ readonly valid: boolean;
16
+ readonly diagnostics: ReadonlyArray<Diagnostic>;
17
+ }
18
+
19
+ export interface ValidateUnionMembersParams {
20
+ readonly members: ReadonlyArray<InlineUnionMemberInfo>;
21
+ readonly typeName: string;
22
+ readonly sourceLocation: SourceLocation;
23
+ readonly typeMap: ReadonlyMap<string, ExtractedTypeInfo>;
24
+ }
25
+
26
+ /**
27
+ * Validates that all union members are object types.
28
+ * GraphQL unions cannot contain primitives, enums, or scalars.
29
+ *
30
+ * Reports:
31
+ * - INLINE_UNION_PRIMITIVE_MEMBER for primitive types
32
+ * - INLINE_UNION_ENUM_MEMBER for enum types
33
+ * - INLINE_UNION_UNRESOLVABLE_MEMBER for unresolvable types
34
+ */
35
+ export function validateUnionMembers(
36
+ params: ValidateUnionMembersParams,
37
+ ): ValidateUnionResult {
38
+ const { members, typeName, sourceLocation, typeMap } = params;
39
+ const diagnostics: Diagnostic[] = [];
40
+
41
+ for (const member of members) {
42
+ const memberType = member.memberType;
43
+ const diagnostic = validateUnionMemberType({
44
+ memberType,
45
+ needsAutoGeneration: member.needsAutoGeneration,
46
+ typeName,
47
+ sourceLocation,
48
+ typeMap,
49
+ });
50
+ if (diagnostic) {
51
+ diagnostics.push(diagnostic);
52
+ }
53
+ }
54
+
55
+ return {
56
+ valid: diagnostics.length === 0,
57
+ diagnostics,
58
+ };
59
+ }
60
+
61
+ interface ValidateMemberTypeParams {
62
+ readonly memberType: TSTypeReference;
63
+ readonly needsAutoGeneration: boolean;
64
+ readonly typeName: string;
65
+ readonly sourceLocation: SourceLocation;
66
+ readonly typeMap: ReadonlyMap<string, ExtractedTypeInfo>;
67
+ }
68
+
69
+ function validateUnionMemberType(
70
+ params: ValidateMemberTypeParams,
71
+ ): Diagnostic | null {
72
+ const { memberType, needsAutoGeneration, typeName, sourceLocation, typeMap } =
73
+ params;
74
+
75
+ if (memberType.kind === "primitive") {
76
+ return {
77
+ code: "INLINE_UNION_PRIMITIVE_MEMBER",
78
+ message: `Inline union '${typeName}' contains primitive type '${memberType.name}'. GraphQL unions can only contain object types.`,
79
+ severity: "error",
80
+ location: sourceLocation,
81
+ };
82
+ }
83
+
84
+ if (memberType.kind === "inlineEnum") {
85
+ return {
86
+ code: "INLINE_UNION_ENUM_MEMBER",
87
+ message: `Inline union '${typeName}' contains an enum type. GraphQL unions can only contain object types.`,
88
+ severity: "error",
89
+ location: sourceLocation,
90
+ };
91
+ }
92
+
93
+ if (memberType.kind === "literal") {
94
+ return {
95
+ code: "INLINE_UNION_ENUM_MEMBER",
96
+ message: `Inline union '${typeName}' contains a literal type '${memberType.name}'. GraphQL unions can only contain object types.`,
97
+ severity: "error",
98
+ location: sourceLocation,
99
+ };
100
+ }
101
+
102
+ if (memberType.kind === "scalar") {
103
+ return {
104
+ code: "INLINE_UNION_UNRESOLVABLE_MEMBER",
105
+ message: `Inline union '${typeName}' contains scalar type '${memberType.scalarInfo?.scalarName ?? memberType.name}'. GraphQL unions can only contain object types.`,
106
+ severity: "error",
107
+ location: sourceLocation,
108
+ };
109
+ }
110
+
111
+ if (memberType.kind === "reference" && memberType.name !== null) {
112
+ const referencedType = typeMap.get(memberType.name);
113
+
114
+ if (referencedType?.metadata.kind === "enum") {
115
+ return {
116
+ code: "INLINE_UNION_ENUM_MEMBER",
117
+ message: `Inline union '${typeName}' contains enum type '${memberType.name}'. GraphQL unions can only contain object types.`,
118
+ severity: "error",
119
+ location: sourceLocation,
120
+ };
121
+ }
122
+
123
+ if (!referencedType && needsAutoGeneration) {
124
+ return {
125
+ code: "INLINE_UNION_UNRESOLVABLE_MEMBER",
126
+ message: `Inline union '${typeName}' contains unresolvable type '${memberType.name}'. The type cannot be expanded as an object type.`,
127
+ severity: "error",
128
+ location: sourceLocation,
129
+ };
130
+ }
131
+ }
132
+
133
+ if (
134
+ memberType.kind === "inlineObject" ||
135
+ memberType.kind === "reference" ||
136
+ memberType.kind === "union"
137
+ ) {
138
+ return null;
139
+ }
140
+
141
+ return {
142
+ code: "INLINE_UNION_UNRESOLVABLE_MEMBER",
143
+ message: `Inline union '${typeName}' contains a type that cannot be resolved as an object type.`,
144
+ severity: "error",
145
+ location: sourceLocation,
146
+ };
147
+ }
148
+
149
+ export interface ValidateOneOfMembersParams {
150
+ readonly members: ReadonlyArray<InlineUnionMemberInfo>;
151
+ readonly typeName: string;
152
+ readonly sourceLocation: SourceLocation;
153
+ readonly typeMap: ReadonlyMap<string, ExtractedTypeInfo>;
154
+ }
155
+
156
+ /**
157
+ * Validates @oneOf input object constraints:
158
+ * - Each member must have exactly one property
159
+ * - Property names must be unique across all members
160
+ * - Field types must be scalar, enum, or input object
161
+ *
162
+ * Reports:
163
+ * - ONEOF_EMPTY_OBJECT for empty object members
164
+ * - ONEOF_MULTIPLE_PROPERTIES for members with multiple properties
165
+ * - ONEOF_DUPLICATE_PROPERTY for duplicate property names
166
+ * - ONEOF_INVALID_FIELD_TYPE for invalid field types
167
+ */
168
+ export function validateOneOfMembers(
169
+ params: ValidateOneOfMembersParams,
170
+ ): ValidateUnionResult {
171
+ const { members, typeName, sourceLocation, typeMap } = params;
172
+ const diagnostics: Diagnostic[] = [];
173
+ const seenPropertyNames = new Set<string>();
174
+
175
+ for (let i = 0; i < members.length; i++) {
176
+ const member = members[i]!;
177
+ const memberType = member.memberType;
178
+
179
+ if (memberType.kind === "reference") {
180
+ continue;
181
+ }
182
+
183
+ if (
184
+ memberType.kind !== "inlineObject" ||
185
+ !memberType.inlineObjectProperties
186
+ ) {
187
+ continue;
188
+ }
189
+
190
+ const properties = memberType.inlineObjectProperties;
191
+
192
+ if (properties.length === 0) {
193
+ diagnostics.push({
194
+ code: "ONEOF_EMPTY_OBJECT",
195
+ message: `OneOf input '${typeName}' member at index ${i} is an empty object. Each member must have exactly one property.`,
196
+ severity: "error",
197
+ location: sourceLocation,
198
+ });
199
+ continue;
200
+ }
201
+
202
+ if (properties.length > 1) {
203
+ diagnostics.push({
204
+ code: "ONEOF_MULTIPLE_PROPERTIES",
205
+ message: `OneOf input '${typeName}' member at index ${i} has ${properties.length} properties. Each member must have exactly one property.`,
206
+ severity: "error",
207
+ location: sourceLocation,
208
+ });
209
+ continue;
210
+ }
211
+
212
+ const prop = properties[0]!;
213
+
214
+ if (seenPropertyNames.has(prop.name)) {
215
+ diagnostics.push({
216
+ code: "ONEOF_DUPLICATE_PROPERTY",
217
+ message: `OneOf input '${typeName}' has duplicate property name '${prop.name}'.`,
218
+ severity: "error",
219
+ location: sourceLocation,
220
+ });
221
+ continue;
222
+ }
223
+ seenPropertyNames.add(prop.name);
224
+
225
+ const fieldTypeError = validateOneOfFieldType({
226
+ propertyName: prop.name,
227
+ propertyType: prop.tsType,
228
+ typeName,
229
+ sourceLocation,
230
+ typeMap,
231
+ });
232
+ if (fieldTypeError) {
233
+ diagnostics.push(fieldTypeError);
234
+ }
235
+ }
236
+
237
+ return {
238
+ valid: diagnostics.length === 0,
239
+ diagnostics,
240
+ };
241
+ }
242
+
243
+ interface ValidateOneOfFieldTypeParams {
244
+ readonly propertyName: string;
245
+ readonly propertyType: TSTypeReference;
246
+ readonly typeName: string;
247
+ readonly sourceLocation: SourceLocation;
248
+ readonly typeMap: ReadonlyMap<string, ExtractedTypeInfo>;
249
+ }
250
+
251
+ function validateOneOfFieldType(
252
+ params: ValidateOneOfFieldTypeParams,
253
+ ): Diagnostic | null {
254
+ const { propertyName, propertyType, typeName, sourceLocation, typeMap } =
255
+ params;
256
+
257
+ if (
258
+ propertyType.kind === "primitive" ||
259
+ propertyType.kind === "scalar" ||
260
+ propertyType.kind === "inlineEnum"
261
+ ) {
262
+ return null;
263
+ }
264
+
265
+ if (propertyType.kind === "inlineObject") {
266
+ return null;
267
+ }
268
+
269
+ if (propertyType.kind === "reference" && propertyType.name !== null) {
270
+ const referencedType = typeMap.get(propertyType.name);
271
+
272
+ if (!referencedType) {
273
+ return null;
274
+ }
275
+
276
+ const isValidType =
277
+ referencedType.metadata.kind === "enum" ||
278
+ isInputTypeName(referencedType.metadata.name);
279
+
280
+ if (isValidType) {
281
+ return null;
282
+ }
283
+
284
+ return {
285
+ code: "ONEOF_INVALID_FIELD_TYPE",
286
+ message: `OneOf input '${typeName}' field '${propertyName}' has invalid type '${propertyType.name}'. Only scalar types, enum types, and Input Object types are allowed.`,
287
+ severity: "error",
288
+ location: sourceLocation,
289
+ };
290
+ }
291
+
292
+ return null;
293
+ }
294
+
295
+ export interface ValidateUnionMemberTypenamesParams {
296
+ readonly members: ReadonlyArray<InlineUnionMemberInfo>;
297
+ readonly unionTypeName: string;
298
+ readonly sourceLocation: SourceLocation;
299
+ readonly typeMap: ReadonlyMap<string, ExtractedTypeInfo>;
300
+ }
301
+
302
+ export interface ValidatedTypenameInfo {
303
+ readonly typeName: string;
304
+ readonly fieldName: TypenameFieldName;
305
+ }
306
+
307
+ interface ExtractTypenameFromNamedTypeParams {
308
+ readonly memberType: TSTypeReference;
309
+ readonly typeMap: ReadonlyMap<string, ExtractedTypeInfo>;
310
+ }
311
+
312
+ /**
313
+ * Extract typename info from a named type by looking up its fields in the typeMap.
314
+ * Returns null if the type doesn't have a valid __typename or $typeName field.
315
+ */
316
+ function extractTypenameFromNamedType(
317
+ params: ExtractTypenameFromNamedTypeParams,
318
+ ): ValidatedTypenameInfo | null {
319
+ const { memberType, typeMap } = params;
320
+
321
+ if (memberType.kind !== "reference" || memberType.name === null) {
322
+ return null;
323
+ }
324
+
325
+ const referencedType = typeMap.get(memberType.name);
326
+ if (!referencedType) {
327
+ return null;
328
+ }
329
+
330
+ const found = findTypenameProperty(referencedType.fields, (f) => f.name);
331
+ if (!found) {
332
+ return null;
333
+ }
334
+
335
+ const { property: field, fieldName } = found;
336
+ const { tsType } = field;
337
+
338
+ if (
339
+ field.optional ||
340
+ tsType.nullable ||
341
+ tsType.kind !== "literal" ||
342
+ tsType.name === null
343
+ ) {
344
+ return null;
345
+ }
346
+
347
+ return { typeName: tsType.name, fieldName };
348
+ }
349
+
350
+ export interface ValidateUnionMemberTypenamesResult {
351
+ readonly valid: boolean;
352
+ readonly diagnostics: ReadonlyArray<Diagnostic>;
353
+ readonly memberTypenames: ReadonlyMap<number, ValidatedTypenameInfo>;
354
+ readonly allMembersHaveTypename: boolean;
355
+ }
356
+
357
+ /**
358
+ * Validates __typename or $typeName property on inline union members.
359
+ * Returns extracted typename values for valid members.
360
+ *
361
+ * Behavior:
362
+ * - For named types (needsAutoGeneration: false), extracts typename from typeMap
363
+ * - For inline types (needsAutoGeneration: true), validates and extracts typename
364
+ * - Only called for payload unions (context.kind === "resolverPayload")
365
+ * - __typename takes priority over $typeName if both are present
366
+ *
367
+ * Reports:
368
+ * - MISSING_TYPENAME_PROPERTY when neither __typename nor $typeName is present
369
+ * - INVALID_TYPENAME_TYPE when the property is not a string literal
370
+ * - OPTIONAL_TYPENAME_PROPERTY when the property is declared as optional
371
+ * - NULLABLE_TYPENAME_PROPERTY when the property is nullable
372
+ */
373
+ export function validateUnionMemberTypenames(
374
+ params: ValidateUnionMemberTypenamesParams,
375
+ ): ValidateUnionMemberTypenamesResult {
376
+ const { members, unionTypeName, sourceLocation, typeMap } = params;
377
+ const diagnostics: Diagnostic[] = [];
378
+ const memberTypenames = new Map<number, ValidatedTypenameInfo>();
379
+
380
+ // Counters for determining allMembersHaveTypename
381
+ let inlineTypeCount = 0;
382
+ let inlineTypesWithTypename = 0;
383
+ let namedTypeCount = 0;
384
+ let namedTypesWithTypename = 0;
385
+
386
+ for (let i = 0; i < members.length; i++) {
387
+ const member = members[i]!;
388
+ const memberType = member.memberType;
389
+
390
+ if (!member.needsAutoGeneration) {
391
+ namedTypeCount++;
392
+ const typenameInfo = extractTypenameFromNamedType({
393
+ memberType,
394
+ typeMap,
395
+ });
396
+ if (typenameInfo) {
397
+ memberTypenames.set(i, typenameInfo);
398
+ namedTypesWithTypename++;
399
+ }
400
+ continue;
401
+ }
402
+
403
+ if (
404
+ memberType.kind !== "inlineObject" ||
405
+ !memberType.inlineObjectProperties
406
+ ) {
407
+ continue;
408
+ }
409
+
410
+ inlineTypeCount++;
411
+
412
+ const found = findTypenameProperty(
413
+ memberType.inlineObjectProperties,
414
+ (prop) => prop.name,
415
+ );
416
+
417
+ if (!found) {
418
+ diagnostics.push({
419
+ code: "MISSING_TYPENAME_PROPERTY",
420
+ message: `Union '${unionTypeName}' member at index ${i} is missing '__typename' or '$typeName' property. Inline union members must have a '__typename' or '$typeName' property with a string literal type.`,
421
+ severity: "error",
422
+ location: sourceLocation,
423
+ });
424
+ continue;
425
+ }
426
+
427
+ const { property: selectedProperty, fieldName: selectedFieldName } = found;
428
+ const typenameType = selectedProperty.tsType;
429
+
430
+ if (selectedProperty.optional) {
431
+ diagnostics.push({
432
+ code: "OPTIONAL_TYPENAME_PROPERTY",
433
+ message: `Union '${unionTypeName}' member at index ${i} has optional '${selectedFieldName}' property. The '${selectedFieldName}' property must be required for union type resolution.`,
434
+ severity: "error",
435
+ location: sourceLocation,
436
+ });
437
+ }
438
+
439
+ if (typenameType.nullable) {
440
+ diagnostics.push({
441
+ code: "NULLABLE_TYPENAME_PROPERTY",
442
+ message: `Union '${unionTypeName}' member at index ${i} has nullable '${selectedFieldName}' property. The '${selectedFieldName}' property must not be nullable for union type resolution.`,
443
+ severity: "error",
444
+ location: sourceLocation,
445
+ });
446
+ }
447
+
448
+ if (typenameType.kind !== "literal" || typenameType.name === null) {
449
+ diagnostics.push({
450
+ code: "INVALID_TYPENAME_TYPE",
451
+ message: `Union '${unionTypeName}' member at index ${i} has '${selectedFieldName}' that is not a string literal type. Expected a string literal like '${selectedFieldName}: "TypeName"'.`,
452
+ severity: "error",
453
+ location: sourceLocation,
454
+ });
455
+ continue;
456
+ }
457
+
458
+ if (!selectedProperty.optional && !typenameType.nullable) {
459
+ memberTypenames.set(i, {
460
+ typeName: typenameType.name,
461
+ fieldName: selectedFieldName,
462
+ });
463
+ inlineTypesWithTypename++;
464
+ }
465
+ }
466
+
467
+ // Determine allMembersHaveTypename: all members (both inline and named) must have typename
468
+ // for resolveType to be auto-generated. This ensures the generated resolveType function
469
+ // can resolve all union members correctly at runtime.
470
+ const totalMemberCount = inlineTypeCount + namedTypeCount;
471
+ const totalMembersWithTypename =
472
+ inlineTypesWithTypename + namedTypesWithTypename;
473
+ const allMembersHaveTypename =
474
+ totalMemberCount > 0 && totalMembersWithTypename === totalMemberCount;
475
+
476
+ return {
477
+ valid: diagnostics.length === 0,
478
+ diagnostics,
479
+ memberTypenames,
480
+ allMembersHaveTypename,
481
+ };
482
+ }
@@ -0,0 +1,119 @@
1
+ import { relative } from "node:path";
2
+ import type {
3
+ Diagnostic,
4
+ SourceLocation,
5
+ } from "../type-extractor/types/index.js";
6
+ import type { AutoGeneratedType } from "./auto-type-generator.js";
7
+
8
+ export interface UserDefinedTypeInfo {
9
+ readonly name: string;
10
+ readonly sourceLocation: SourceLocation;
11
+ }
12
+
13
+ export interface NameCollisionValidatorInput {
14
+ readonly userDefinedTypes: ReadonlyArray<UserDefinedTypeInfo>;
15
+ readonly autoGeneratedTypes: ReadonlyArray<AutoGeneratedType>;
16
+ readonly sourceRoot: string | null;
17
+ }
18
+
19
+ export interface NameCollisionValidatorResult {
20
+ readonly hasCollisions: boolean;
21
+ readonly diagnostics: ReadonlyArray<Diagnostic>;
22
+ }
23
+
24
+ function formatLocation(
25
+ loc: SourceLocation,
26
+ sourceRoot: string | null,
27
+ ): string {
28
+ let filePath = loc.file;
29
+ if (sourceRoot !== null) {
30
+ filePath = relative(sourceRoot, filePath);
31
+ }
32
+ const normalizedPath = filePath.replaceAll("\\", "/");
33
+ return `${normalizedPath}:${loc.line}`;
34
+ }
35
+
36
+ function findUserDefinedCollisions(
37
+ userDefinedTypes: ReadonlyArray<UserDefinedTypeInfo>,
38
+ autoGeneratedTypes: ReadonlyArray<AutoGeneratedType>,
39
+ sourceRoot: string | null,
40
+ ): Diagnostic[] {
41
+ const diagnostics: Diagnostic[] = [];
42
+
43
+ const userTypeMap = new Map<string, UserDefinedTypeInfo>();
44
+ for (const userType of userDefinedTypes) {
45
+ userTypeMap.set(userType.name, userType);
46
+ }
47
+
48
+ for (const autoType of autoGeneratedTypes) {
49
+ const userType = userTypeMap.get(autoType.name);
50
+ if (userType) {
51
+ diagnostics.push({
52
+ code: "AUTO_TYPE_NAME_COLLISION_USER",
53
+ message: `Auto-generated type '${autoType.name}' conflicts with user-defined type at ${formatLocation(userType.sourceLocation, sourceRoot)}. Consider renaming the field or using an explicit type definition.`,
54
+ severity: "error",
55
+ location: autoType.sourceLocation,
56
+ });
57
+ }
58
+ }
59
+
60
+ return diagnostics;
61
+ }
62
+
63
+ function findAutoGeneratedCollisions(
64
+ autoGeneratedTypes: ReadonlyArray<AutoGeneratedType>,
65
+ sourceRoot: string | null,
66
+ ): Diagnostic[] {
67
+ const diagnostics: Diagnostic[] = [];
68
+
69
+ const typesByName = new Map<string, AutoGeneratedType[]>();
70
+ for (const autoType of autoGeneratedTypes) {
71
+ const existing = typesByName.get(autoType.name);
72
+ if (existing) {
73
+ existing.push(autoType);
74
+ } else {
75
+ typesByName.set(autoType.name, [autoType]);
76
+ }
77
+ }
78
+
79
+ for (const [name, types] of typesByName) {
80
+ if (types.length > 1) {
81
+ const locations = types
82
+ .map((t) => formatLocation(t.sourceLocation, sourceRoot))
83
+ .join(", ");
84
+ const firstType = types[0];
85
+ if (firstType) {
86
+ diagnostics.push({
87
+ code: "AUTO_TYPE_NAME_COLLISION_AUTO",
88
+ message: `Auto-generated type name '${name}' is generated from multiple sources: ${locations}. Use explicit type definitions to resolve the conflict.`,
89
+ severity: "error",
90
+ location: firstType.sourceLocation,
91
+ });
92
+ }
93
+ }
94
+ }
95
+
96
+ return diagnostics;
97
+ }
98
+
99
+ export function validateNameCollisions(
100
+ input: NameCollisionValidatorInput,
101
+ ): NameCollisionValidatorResult {
102
+ const userCollisions = findUserDefinedCollisions(
103
+ input.userDefinedTypes,
104
+ input.autoGeneratedTypes,
105
+ input.sourceRoot,
106
+ );
107
+
108
+ const autoCollisions = findAutoGeneratedCollisions(
109
+ input.autoGeneratedTypes,
110
+ input.sourceRoot,
111
+ );
112
+
113
+ const diagnostics = [...userCollisions, ...autoCollisions];
114
+
115
+ return {
116
+ hasCollisions: diagnostics.length > 0,
117
+ diagnostics,
118
+ };
119
+ }