@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,281 @@
1
+ import type {
2
+ ExtractedTypeInfo,
3
+ InlineObjectMember,
4
+ InlineObjectProperty,
5
+ } from "../type-extractor/types/index.js";
6
+ import type {
7
+ AutoGeneratedField,
8
+ AutoGeneratedType,
9
+ } from "./auto-type-generator.js";
10
+ import type { ResolveTypeFieldPattern } from "./resolve-type-generator.js";
11
+ import {
12
+ collectTypenameExtractions,
13
+ type TypenameExtractionResult,
14
+ } from "./typename-extractor.js";
15
+ import type { TypenameFieldName } from "./typename-types.js";
16
+
17
+ /**
18
+ * Pattern for resolveType generation from typename fields.
19
+ * Uses the common ResolveTypeFieldPattern for usedFieldNames,
20
+ * with an optional memberFieldMap for mixed patterns.
21
+ */
22
+ export interface ResolveTypePattern extends ResolveTypeFieldPattern {
23
+ readonly memberFieldMap: ReadonlyMap<string, TypenameFieldName> | null;
24
+ }
25
+
26
+ export interface TypenameAutoResolveTypeInfo {
27
+ readonly abstractTypeName: string;
28
+ readonly abstractTypeKind: "union" | "interface";
29
+ readonly resolveTypePattern: ResolveTypePattern;
30
+ }
31
+
32
+ export interface GeneratedInlineObjectType {
33
+ readonly typeName: string;
34
+ readonly abstractTypeName: string;
35
+ readonly memberIndex: number;
36
+ }
37
+
38
+ export interface CollectTypenameResolveTypesParams {
39
+ readonly extractedTypes: ReadonlyArray<ExtractedTypeInfo>;
40
+ readonly typeMap: ReadonlyMap<string, ExtractedTypeInfo>;
41
+ readonly manualResolveTypeNames: ReadonlySet<string>;
42
+ }
43
+
44
+ export interface CollectTypenameResolveTypesResult {
45
+ readonly autoResolveTypes: ReadonlyArray<TypenameAutoResolveTypeInfo>;
46
+ readonly autoResolveTypeNames: ReadonlySet<string>;
47
+ readonly generatedObjectTypes: ReadonlyArray<AutoGeneratedType>;
48
+ readonly generatedInlineObjectTypes: ReadonlyArray<GeneratedInlineObjectType>;
49
+ }
50
+
51
+ function determineResolveTypePattern(
52
+ extraction: TypenameExtractionResult,
53
+ ): ResolveTypePattern | null {
54
+ if (!extraction.allMembersHaveTypename) {
55
+ return null;
56
+ }
57
+
58
+ const members = extraction.members;
59
+ if (members.length === 0) {
60
+ return null;
61
+ }
62
+
63
+ const usedFieldNames = new Set<TypenameFieldName>();
64
+
65
+ for (const member of members) {
66
+ if (member.typenameInfo === null) {
67
+ return null;
68
+ }
69
+ usedFieldNames.add(member.typenameInfo.fieldName);
70
+ }
71
+
72
+ if (usedFieldNames.size === 1) {
73
+ return { usedFieldNames, memberFieldMap: null };
74
+ }
75
+
76
+ const memberFieldMap = new Map<string, TypenameFieldName>();
77
+ for (const member of members) {
78
+ if (member.typenameInfo && member.memberTypeName) {
79
+ memberFieldMap.set(member.memberTypeName, member.typenameInfo.fieldName);
80
+ }
81
+ }
82
+
83
+ return { usedFieldNames, memberFieldMap };
84
+ }
85
+
86
+ function primitiveToGraphQLScalar(primitive: string): string {
87
+ switch (primitive) {
88
+ case "string":
89
+ return "String";
90
+ case "number":
91
+ return "Float";
92
+ case "boolean":
93
+ return "Boolean";
94
+ default:
95
+ return "String";
96
+ }
97
+ }
98
+
99
+ function convertInlineObjectPropertyToField(
100
+ property: InlineObjectProperty,
101
+ ): AutoGeneratedField | null {
102
+ if (
103
+ property.propertyName === "__typename" ||
104
+ property.propertyName === "$typeName"
105
+ ) {
106
+ return null;
107
+ }
108
+
109
+ const tsType = property.propertyType;
110
+ let typeName: string;
111
+ const nullable = tsType.nullable;
112
+ let list = false;
113
+ let listItemNullable: boolean | null = null;
114
+
115
+ if (tsType.kind === "array" && tsType.elementType) {
116
+ list = true;
117
+ listItemNullable = tsType.elementType.nullable;
118
+ const elementName = tsType.elementType.name ?? "String";
119
+ typeName =
120
+ tsType.elementType.kind === "primitive"
121
+ ? primitiveToGraphQLScalar(elementName)
122
+ : elementName;
123
+ } else if (tsType.kind === "reference" && tsType.name) {
124
+ typeName = tsType.name;
125
+ } else if (tsType.kind === "primitive" && tsType.name) {
126
+ typeName = primitiveToGraphQLScalar(tsType.name);
127
+ } else if (tsType.kind === "scalar" && tsType.scalarInfo) {
128
+ typeName = tsType.scalarInfo.scalarName;
129
+ } else {
130
+ typeName = "String";
131
+ }
132
+
133
+ return {
134
+ name: property.propertyName,
135
+ type: {
136
+ typeName,
137
+ nullable,
138
+ list,
139
+ listItemNullable,
140
+ },
141
+ description: property.description,
142
+ deprecated: property.deprecated,
143
+ directives: null,
144
+ defaultValue: null,
145
+ };
146
+ }
147
+
148
+ function generateObjectTypeFromInlineObject(
149
+ inlineObjectMember: InlineObjectMember,
150
+ typeName: string,
151
+ abstractTypeName: string,
152
+ sourceFile: string,
153
+ ): AutoGeneratedType {
154
+ const fields: AutoGeneratedField[] = [];
155
+
156
+ for (const property of inlineObjectMember.properties) {
157
+ const field = convertInlineObjectPropertyToField(property);
158
+ if (field !== null) {
159
+ fields.push(field);
160
+ }
161
+ }
162
+
163
+ return {
164
+ name: typeName,
165
+ kind: "Object",
166
+ fields,
167
+ enumValues: null,
168
+ unionMembers: null,
169
+ needsStringEnumMapping: false,
170
+ sourceLocation: { file: sourceFile, line: 1, column: 1 },
171
+ generatedFrom: {
172
+ parentTypeName: abstractTypeName,
173
+ fieldPath: [],
174
+ context: "typeField",
175
+ },
176
+ description: null,
177
+ resolveTypeFieldPattern: null,
178
+ };
179
+ }
180
+
181
+ function collectGeneratedObjectTypes(
182
+ extraction: TypenameExtractionResult,
183
+ extractedType: ExtractedTypeInfo,
184
+ ): {
185
+ generatedObjectTypes: AutoGeneratedType[];
186
+ generatedInlineObjectTypes: GeneratedInlineObjectType[];
187
+ } {
188
+ const generatedObjectTypes: AutoGeneratedType[] = [];
189
+ const generatedInlineObjectTypes: GeneratedInlineObjectType[] = [];
190
+
191
+ if (!extraction.hasInlineObjects) {
192
+ return { generatedObjectTypes, generatedInlineObjectTypes };
193
+ }
194
+
195
+ const inlineObjectMembers = extractedType.inlineObjectMembers ?? [];
196
+ const namedMemberCount = extractedType.unionMembers?.length ?? 0;
197
+
198
+ for (const member of extraction.members) {
199
+ if (!member.isInlineObject || member.typenameInfo === null) {
200
+ continue;
201
+ }
202
+
203
+ const inlineIndex = member.memberIndex - namedMemberCount;
204
+ const inlineObjectMember = inlineObjectMembers[inlineIndex];
205
+
206
+ if (!inlineObjectMember) {
207
+ continue;
208
+ }
209
+
210
+ const typeName = member.typenameInfo.typeName;
211
+
212
+ const objectType = generateObjectTypeFromInlineObject(
213
+ inlineObjectMember,
214
+ typeName,
215
+ extraction.abstractTypeName,
216
+ extractedType.metadata.sourceFile,
217
+ );
218
+
219
+ generatedObjectTypes.push(objectType);
220
+ generatedInlineObjectTypes.push({
221
+ typeName,
222
+ abstractTypeName: extraction.abstractTypeName,
223
+ memberIndex: member.memberIndex,
224
+ });
225
+ }
226
+
227
+ return { generatedObjectTypes, generatedInlineObjectTypes };
228
+ }
229
+
230
+ export function collectTypenameResolveTypes(
231
+ params: CollectTypenameResolveTypesParams,
232
+ ): CollectTypenameResolveTypesResult {
233
+ const { extractedTypes, typeMap, manualResolveTypeNames } = params;
234
+
235
+ const extractions = collectTypenameExtractions({
236
+ extractedTypes,
237
+ typeMap,
238
+ });
239
+
240
+ const autoResolveTypes: TypenameAutoResolveTypeInfo[] = [];
241
+ const autoResolveTypeNames = new Set<string>();
242
+ const allGeneratedObjectTypes: AutoGeneratedType[] = [];
243
+ const allGeneratedInlineObjectTypes: GeneratedInlineObjectType[] = [];
244
+
245
+ const typeInfoMap = new Map(extractedTypes.map((t) => [t.metadata.name, t]));
246
+
247
+ for (const extraction of extractions) {
248
+ if (manualResolveTypeNames.has(extraction.abstractTypeName)) {
249
+ continue;
250
+ }
251
+
252
+ const extractedType = typeInfoMap.get(extraction.abstractTypeName);
253
+ if (extractedType && extraction.hasInlineObjects) {
254
+ const { generatedObjectTypes, generatedInlineObjectTypes } =
255
+ collectGeneratedObjectTypes(extraction, extractedType);
256
+ allGeneratedObjectTypes.push(...generatedObjectTypes);
257
+ allGeneratedInlineObjectTypes.push(...generatedInlineObjectTypes);
258
+ }
259
+
260
+ const pattern = determineResolveTypePattern(extraction);
261
+ if (pattern === null) {
262
+ continue;
263
+ }
264
+
265
+ autoResolveTypes.push({
266
+ abstractTypeName: extraction.abstractTypeName,
267
+ abstractTypeKind: extraction.abstractTypeKind,
268
+ resolveTypePattern: pattern,
269
+ });
270
+ autoResolveTypeNames.add(extraction.abstractTypeName);
271
+ }
272
+
273
+ return {
274
+ autoResolveTypes: autoResolveTypes.sort((a, b) =>
275
+ a.abstractTypeName.localeCompare(b.abstractTypeName),
276
+ ),
277
+ autoResolveTypeNames,
278
+ generatedObjectTypes: allGeneratedObjectTypes,
279
+ generatedInlineObjectTypes: allGeneratedInlineObjectTypes,
280
+ };
281
+ }
@@ -0,0 +1,66 @@
1
+ /**
2
+ * Common types for typename-related functionality.
3
+ * These types are shared across typename-extractor, typename-validator,
4
+ * typename-resolve-type-generator, and inline-union-validator.
5
+ */
6
+
7
+ /**
8
+ * All recognized field names for type discrimination.
9
+ * - "__typename" is the standard GraphQL introspection field
10
+ * - "$typeName" is a gqlkit-specific alternative that won't appear in the schema
11
+ *
12
+ * To add a new typename field:
13
+ * 1. Add the field name to this array
14
+ * 2. Update findTypenameProperty priority if needed
15
+ */
16
+ export const TYPENAME_FIELD_NAMES = ["__typename", "$typeName"] as const;
17
+
18
+ /**
19
+ * The field name used for type discrimination.
20
+ */
21
+ export type TypenameFieldName = (typeof TYPENAME_FIELD_NAMES)[number];
22
+
23
+ /**
24
+ * A set of typename field names used in a resolve type pattern.
25
+ */
26
+ export type TypenameFieldNameSet = ReadonlySet<TypenameFieldName>;
27
+
28
+ /**
29
+ * Create a TypenameFieldNameSet from field names.
30
+ */
31
+ export function createFieldNameSet(
32
+ fieldNames: ReadonlyArray<TypenameFieldName>,
33
+ ): TypenameFieldNameSet {
34
+ return new Set(fieldNames);
35
+ }
36
+
37
+ /**
38
+ * Information about a typename field extracted from a type definition.
39
+ */
40
+ export interface TypenameFieldInfo {
41
+ readonly typeName: string;
42
+ readonly fieldName: TypenameFieldName;
43
+ }
44
+
45
+ /**
46
+ * Find __typename or $typeName property from a list of properties.
47
+ * __typename takes priority over $typeName.
48
+ */
49
+ export function findTypenameProperty<T>(
50
+ properties: ReadonlyArray<T>,
51
+ getName: (p: T) => string,
52
+ ): { property: T; fieldName: TypenameFieldName } | null {
53
+ const typenameProperty = properties.find((p) => getName(p) === "__typename");
54
+ if (typenameProperty) {
55
+ return { property: typenameProperty, fieldName: "__typename" };
56
+ }
57
+
58
+ const dollarTypenameProperty = properties.find(
59
+ (p) => getName(p) === "$typeName",
60
+ );
61
+ if (dollarTypenameProperty) {
62
+ return { property: dollarTypenameProperty, fieldName: "$typeName" };
63
+ }
64
+
65
+ return null;
66
+ }
@@ -0,0 +1,326 @@
1
+ import type {
2
+ Diagnostic,
3
+ ExtractedTypeInfo,
4
+ InlineObjectMember,
5
+ SourceLocation,
6
+ } from "../type-extractor/types/index.js";
7
+ import type { TypenameExtractionResult } from "./typename-extractor.js";
8
+ import {
9
+ findTypenameProperty,
10
+ type TypenameFieldName,
11
+ } from "./typename-types.js";
12
+
13
+ export interface ValidateTypenamesParams {
14
+ readonly extractionResult: TypenameExtractionResult;
15
+ readonly sourceLocation: SourceLocation;
16
+ readonly inlineObjectMembers: ReadonlyArray<InlineObjectMember> | null;
17
+ }
18
+
19
+ export interface ValidateTypenamesResult {
20
+ readonly valid: boolean;
21
+ readonly diagnostics: ReadonlyArray<Diagnostic>;
22
+ }
23
+
24
+ export interface ValidateSchemaTypenamesParams {
25
+ readonly objectTypes: ReadonlyArray<ExtractedTypeInfo>;
26
+ readonly typeMap: ReadonlyMap<string, ExtractedTypeInfo>;
27
+ }
28
+
29
+ export interface ValidateSchemaTypenamesResult {
30
+ readonly valid: boolean;
31
+ readonly diagnostics: ReadonlyArray<Diagnostic>;
32
+ }
33
+
34
+ interface TypenameValueInfo {
35
+ readonly memberTypeName: string;
36
+ readonly fieldName: TypenameFieldName;
37
+ }
38
+
39
+ function getAbstractTypeLabel(kind: "union" | "interface"): string {
40
+ return kind === "union" ? "Union" : "Interface";
41
+ }
42
+
43
+ function getMemberLabel(kind: "union" | "interface"): string {
44
+ return kind === "union" ? "members" : "implementers";
45
+ }
46
+
47
+ interface InlineObjectTypenameAnalysis {
48
+ readonly exists: boolean;
49
+ readonly fieldName: TypenameFieldName | null;
50
+ readonly isStringLiteral: boolean;
51
+ readonly isNullable: boolean;
52
+ }
53
+
54
+ function analyzeInlineObjectTypename(
55
+ inlineObjectMember: InlineObjectMember,
56
+ ): InlineObjectTypenameAnalysis {
57
+ const found = findTypenameProperty(
58
+ inlineObjectMember.properties,
59
+ (p) => p.propertyName,
60
+ );
61
+
62
+ if (!found) {
63
+ return {
64
+ exists: false,
65
+ fieldName: null,
66
+ isStringLiteral: false,
67
+ isNullable: false,
68
+ };
69
+ }
70
+
71
+ const { property, fieldName } = found;
72
+ const { propertyType: tsType } = property;
73
+
74
+ return {
75
+ exists: true,
76
+ fieldName,
77
+ isStringLiteral: tsType.kind === "literal" && tsType.name !== null,
78
+ isNullable: tsType.nullable,
79
+ };
80
+ }
81
+
82
+ function validateInlineObjectsTypenames(
83
+ extractionResult: TypenameExtractionResult,
84
+ inlineObjectMembers: ReadonlyArray<InlineObjectMember>,
85
+ sourceLocation: SourceLocation,
86
+ ): Diagnostic[] {
87
+ if (!extractionResult.hasInlineObjects) {
88
+ return [];
89
+ }
90
+
91
+ if (extractionResult.abstractTypeName.endsWith("Input")) {
92
+ return [];
93
+ }
94
+
95
+ const diagnostics: Diagnostic[] = [];
96
+ const abstractTypeName = extractionResult.abstractTypeName;
97
+ const abstractTypeLabel = getAbstractTypeLabel(
98
+ extractionResult.abstractTypeKind,
99
+ );
100
+
101
+ const namedMemberCount = extractionResult.members.filter(
102
+ (m) => !m.isInlineObject,
103
+ ).length;
104
+
105
+ for (const member of extractionResult.members) {
106
+ if (member.isInlineObject) {
107
+ const inlineIndex = member.memberIndex - namedMemberCount;
108
+ const inlineObjectMember = inlineObjectMembers[inlineIndex];
109
+
110
+ if (inlineObjectMember) {
111
+ const analysis = analyzeInlineObjectTypename(inlineObjectMember);
112
+
113
+ if (!analysis.exists) {
114
+ diagnostics.push({
115
+ code: "MISSING_TYPENAME_PROPERTY",
116
+ message: `${abstractTypeLabel} '${abstractTypeName}' member at index ${member.memberIndex} is missing '__typename' or '$typeName' property. When a union contains inline objects, all members must have a typename property.`,
117
+ severity: "error",
118
+ location: sourceLocation,
119
+ });
120
+ } else if (!analysis.isStringLiteral) {
121
+ diagnostics.push({
122
+ code: "INVALID_TYPENAME_TYPE",
123
+ message: `${abstractTypeLabel} '${abstractTypeName}' member at index ${member.memberIndex} has '${analysis.fieldName}' that is not a string literal type. Expected a string literal like '__typename: "TypeName"'.`,
124
+ severity: "error",
125
+ location: sourceLocation,
126
+ });
127
+ } else if (analysis.isNullable) {
128
+ diagnostics.push({
129
+ code: "NULLABLE_TYPENAME_PROPERTY",
130
+ message: `${abstractTypeLabel} '${abstractTypeName}' member at index ${member.memberIndex} has nullable '${analysis.fieldName}' property. The typename property must not be nullable.`,
131
+ severity: "error",
132
+ location: sourceLocation,
133
+ });
134
+ }
135
+ }
136
+ }
137
+ }
138
+
139
+ return diagnostics;
140
+ }
141
+
142
+ /**
143
+ * Validates typename fields within an abstract type.
144
+ * Reports errors for:
145
+ * - DUPLICATE_TYPENAME_VALUE: Multiple members have the same typename value
146
+ * - MISSING_TYPENAME_PROPERTY: Inline objects without typename (when union has inline objects)
147
+ * - INVALID_TYPENAME_TYPE: Typename is not a string literal type
148
+ * - NULLABLE_TYPENAME_PROPERTY: Typename is nullable
149
+ */
150
+ export function validateTypenames(
151
+ params: ValidateTypenamesParams,
152
+ ): ValidateTypenamesResult {
153
+ const { extractionResult, sourceLocation, inlineObjectMembers } = params;
154
+ const diagnostics: Diagnostic[] = [];
155
+
156
+ if (inlineObjectMembers) {
157
+ const inlineValidationDiagnostics = validateInlineObjectsTypenames(
158
+ extractionResult,
159
+ inlineObjectMembers,
160
+ sourceLocation,
161
+ );
162
+ diagnostics.push(...inlineValidationDiagnostics);
163
+ }
164
+
165
+ const typenameValueToMembers = new Map<string, TypenameValueInfo[]>();
166
+
167
+ for (const member of extractionResult.members) {
168
+ if (member.typenameInfo === null) {
169
+ continue;
170
+ }
171
+
172
+ const { typeName, fieldName } = member.typenameInfo;
173
+ const memberTypeName =
174
+ member.memberTypeName ?? `member${member.memberIndex}`;
175
+
176
+ const existing = typenameValueToMembers.get(typeName) ?? [];
177
+ existing.push({ memberTypeName, fieldName });
178
+ typenameValueToMembers.set(typeName, existing);
179
+ }
180
+
181
+ const abstractTypeLabel = getAbstractTypeLabel(
182
+ extractionResult.abstractTypeKind,
183
+ );
184
+ const memberLabel = getMemberLabel(extractionResult.abstractTypeKind);
185
+
186
+ for (const [typenameValue, members] of typenameValueToMembers) {
187
+ if (members.length > 1) {
188
+ const allSameFieldName = members.every(
189
+ (m) => m.fieldName === members[0]!.fieldName,
190
+ );
191
+
192
+ let message: string;
193
+ if (allSameFieldName) {
194
+ const memberNames = members
195
+ .map((m) => `'${m.memberTypeName}'`)
196
+ .join(" and ");
197
+ message = `Duplicate typename value '${typenameValue}' in ${abstractTypeLabel} '${extractionResult.abstractTypeName}': used by ${memberLabel} ${memberNames}.`;
198
+ } else {
199
+ const memberDescriptions = members
200
+ .map((m) => `member '${m.memberTypeName}' (${m.fieldName})`)
201
+ .join(" and ");
202
+ message = `Duplicate typename value '${typenameValue}' in ${abstractTypeLabel} '${extractionResult.abstractTypeName}': ${memberDescriptions} have the same value.`;
203
+ }
204
+
205
+ diagnostics.push({
206
+ code: "DUPLICATE_TYPENAME_VALUE",
207
+ message,
208
+ severity: "error",
209
+ location: sourceLocation,
210
+ });
211
+ }
212
+ }
213
+
214
+ return {
215
+ valid: diagnostics.length === 0,
216
+ diagnostics,
217
+ };
218
+ }
219
+
220
+ interface ObjectTypeTypenameInfo {
221
+ readonly typeName: string;
222
+ readonly typenameValue: string;
223
+ readonly fieldName: TypenameFieldName;
224
+ readonly sourceLocation: SourceLocation;
225
+ }
226
+
227
+ function extractTypenameFromObjectType(
228
+ typeInfo: ExtractedTypeInfo,
229
+ ): ObjectTypeTypenameInfo | null {
230
+ const found = findTypenameProperty(typeInfo.fields, (f) => f.name);
231
+ if (!found) {
232
+ return null;
233
+ }
234
+
235
+ const { property: field, fieldName } = found;
236
+ const { tsType } = field;
237
+
238
+ if (
239
+ field.optional ||
240
+ tsType.nullable ||
241
+ tsType.kind !== "literal" ||
242
+ tsType.name === null
243
+ ) {
244
+ return null;
245
+ }
246
+
247
+ return {
248
+ typeName: typeInfo.metadata.name,
249
+ typenameValue: tsType.name,
250
+ fieldName,
251
+ sourceLocation: typeInfo.metadata.sourceLocation,
252
+ };
253
+ }
254
+
255
+ /**
256
+ * Validates that there are no duplicate typename values across the entire schema.
257
+ * Reports DUPLICATE_TYPENAME_VALUE error when:
258
+ * - Different object types have the same __typename value (Requirement 4.7)
259
+ * - Different object types have the same $typeName value (Requirement 4.8)
260
+ * - An object's __typename equals another object's $typeName (Requirement 4.9)
261
+ */
262
+ export function validateSchemaTypenames(
263
+ params: ValidateSchemaTypenamesParams,
264
+ ): ValidateSchemaTypenamesResult {
265
+ const { objectTypes } = params;
266
+ const diagnostics: Diagnostic[] = [];
267
+
268
+ const typenameValueToTypes = new Map<string, ObjectTypeTypenameInfo[]>();
269
+
270
+ for (const typeInfo of objectTypes) {
271
+ if (
272
+ typeInfo.metadata.kind !== "object" &&
273
+ typeInfo.metadata.kind !== "interface" &&
274
+ typeInfo.metadata.kind !== "graphqlInterface"
275
+ ) {
276
+ continue;
277
+ }
278
+
279
+ const typenameInfo = extractTypenameFromObjectType(typeInfo);
280
+ if (typenameInfo === null) {
281
+ continue;
282
+ }
283
+
284
+ const existing = typenameValueToTypes.get(typenameInfo.typenameValue) ?? [];
285
+ existing.push(typenameInfo);
286
+ typenameValueToTypes.set(typenameInfo.typenameValue, existing);
287
+ }
288
+
289
+ for (const [typenameValue, types] of typenameValueToTypes) {
290
+ if (types.length > 1) {
291
+ const allSameFieldName = types.every(
292
+ (t) => t.fieldName === types[0]!.fieldName,
293
+ );
294
+
295
+ const sortedTypes = [...types].sort((a, b) =>
296
+ a.typeName.localeCompare(b.typeName),
297
+ );
298
+
299
+ let message: string;
300
+ if (allSameFieldName) {
301
+ const typeNames = sortedTypes
302
+ .map((t) => `'${t.typeName}'`)
303
+ .join(" and ");
304
+ message = `Duplicate typename value '${typenameValue}' in schema: types ${typeNames} have the same ${sortedTypes[0]!.fieldName} value.`;
305
+ } else {
306
+ const typeDescriptions = sortedTypes
307
+ .map((t) => `'${t.typeName}' (${t.fieldName})`)
308
+ .join(" and ");
309
+ message = `Duplicate typename value '${typenameValue}' in schema: types ${typeDescriptions} have the same value.`;
310
+ }
311
+
312
+ const firstType = sortedTypes[1]!;
313
+ diagnostics.push({
314
+ code: "DUPLICATE_TYPENAME_VALUE",
315
+ message,
316
+ severity: "error",
317
+ location: firstType.sourceLocation,
318
+ });
319
+ }
320
+ }
321
+
322
+ return {
323
+ valid: diagnostics.length === 0,
324
+ diagnostics,
325
+ };
326
+ }
package/src/cli.ts ADDED
@@ -0,0 +1,13 @@
1
+ import { cli } from "gunshi";
2
+ import { docsCommand } from "./commands/docs.js";
3
+ import { genCommand } from "./commands/gen.js";
4
+ import { mainCommand } from "./commands/main.js";
5
+
6
+ await cli(process.argv.slice(2), mainCommand, {
7
+ name: "gqlkit",
8
+ version: "0.0.0",
9
+ subCommands: {
10
+ docs: docsCommand,
11
+ gen: genCommand,
12
+ },
13
+ });