@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,483 @@
1
+ import {
2
+ BUILT_IN_SCALARS,
3
+ isBuiltInScalar,
4
+ PRIMITIVE_TYPE_MAP,
5
+ } from "../../shared/constants.js";
6
+ import {
7
+ detectEnumPrefix,
8
+ stripEnumPrefix,
9
+ } from "../../shared/enum-prefix-detector.js";
10
+ import { convertTsTypeToGraphQLType } from "../../shared/type-converter.js";
11
+ import type {
12
+ Diagnostic,
13
+ EnumMemberInfo,
14
+ EnumValueInfo,
15
+ ExtractedTypeInfo,
16
+ FieldInfo,
17
+ GraphQLTypeInfo,
18
+ InlineObjectMember,
19
+ InlineObjectProperty,
20
+ SourceLocation,
21
+ } from "../types/index.js";
22
+ import {
23
+ isEligibleAsEnumValue,
24
+ isEligibleAsInputObjectField,
25
+ isEligibleAsObjectField,
26
+ } from "./field-eligibility.js";
27
+
28
+ export interface ConversionResult {
29
+ readonly types: ReadonlyArray<GraphQLTypeInfo>;
30
+ readonly diagnostics: ReadonlyArray<Diagnostic>;
31
+ }
32
+
33
+ const RESERVED_TYPE_NAMES = new Set([
34
+ ...BUILT_IN_SCALARS,
35
+ "Query",
36
+ "Mutation",
37
+ "Subscription",
38
+ ]);
39
+
40
+ function isInputTypeName(name: string): boolean {
41
+ return name.endsWith("Input");
42
+ }
43
+
44
+ function toScreamingSnakeCase(value: string): string {
45
+ return value
46
+ .replace(/[-\s]+/g, "_")
47
+ .replace(/([a-z])([A-Z])/g, "$1_$2")
48
+ .replace(/([A-Z]+)([A-Z][a-z])/g, "$1_$2")
49
+ .toUpperCase();
50
+ }
51
+
52
+ interface ConvertEnumMembersParams {
53
+ readonly members: ReadonlyArray<EnumMemberInfo>;
54
+ readonly enumName: string;
55
+ readonly sourceFile: string;
56
+ readonly enumLocation: SourceLocation;
57
+ }
58
+
59
+ interface ConvertEnumMembersResult {
60
+ readonly values: ReadonlyArray<EnumValueInfo>;
61
+ readonly diagnostics: ReadonlyArray<Diagnostic>;
62
+ readonly isNumeric: boolean;
63
+ readonly needsMapping: boolean;
64
+ readonly hasError: boolean;
65
+ }
66
+
67
+ interface ConvertedMemberInfo {
68
+ readonly convertedName: string;
69
+ readonly member: EnumMemberInfo;
70
+ }
71
+
72
+ function convertEnumMembers(
73
+ params: ConvertEnumMembersParams,
74
+ ): ConvertEnumMembersResult {
75
+ const { members, enumName, sourceFile, enumLocation } = params;
76
+ const values: EnumValueInfo[] = [];
77
+ const diagnostics: Diagnostic[] = [];
78
+ let isNumeric = false;
79
+ let needsMapping = false;
80
+
81
+ const eligibleMembers: ConvertedMemberInfo[] = [];
82
+
83
+ for (const member of members) {
84
+ const convertedName = toScreamingSnakeCase(member.name);
85
+
86
+ const eligibility = isEligibleAsEnumValue(convertedName, member.name);
87
+ if (!eligibility.eligible) {
88
+ diagnostics.push({
89
+ code: "SKIPPED_ENUM_VALUE",
90
+ message: eligibility.skipReason!.message,
91
+ severity: "warning",
92
+ location: member.sourceLocation ?? {
93
+ file: sourceFile,
94
+ line: 1,
95
+ column: 1,
96
+ },
97
+ });
98
+ continue;
99
+ }
100
+
101
+ if (member.numericValue !== null) {
102
+ isNumeric = true;
103
+ }
104
+
105
+ eligibleMembers.push({ convertedName, member });
106
+ }
107
+
108
+ const prefixDetectionResult = detectEnumPrefix({
109
+ enumName,
110
+ memberValues: eligibleMembers.map((m) => m.convertedName),
111
+ });
112
+
113
+ const finalNameToOriginals = new Map<string, string[]>();
114
+
115
+ for (const { convertedName, member } of eligibleMembers) {
116
+ let finalName = convertedName;
117
+ if (prefixDetectionResult.shouldStrip && prefixDetectionResult.prefix) {
118
+ finalName = stripEnumPrefix(convertedName, prefixDetectionResult.prefix);
119
+ needsMapping = true;
120
+ } else if (convertedName !== member.value) {
121
+ needsMapping = true;
122
+ }
123
+
124
+ const existingOriginals = finalNameToOriginals.get(finalName) ?? [];
125
+ existingOriginals.push(member.value);
126
+ finalNameToOriginals.set(finalName, existingOriginals);
127
+
128
+ values.push({
129
+ name: finalName,
130
+ originalValue: member.value,
131
+ numericValue: member.numericValue,
132
+ description: member.description,
133
+ deprecated: member.deprecated,
134
+ });
135
+ }
136
+
137
+ let hasError = false;
138
+ for (const [finalName, originals] of finalNameToOriginals) {
139
+ if (originals.length > 1) {
140
+ diagnostics.push({
141
+ code: "DUPLICATE_ENUM_VALUE_AFTER_CONVERSION",
142
+ message: `Enum '${enumName}' has duplicate value '${finalName}' after conversion (from '${originals.join("' and '")}')`,
143
+ severity: "error",
144
+ location: enumLocation,
145
+ });
146
+ hasError = true;
147
+ }
148
+ }
149
+
150
+ return { values, diagnostics, isNumeric, needsMapping, hasError };
151
+ }
152
+
153
+ interface ConvertFieldsResult {
154
+ readonly fields: FieldInfo[];
155
+ readonly diagnostics: Diagnostic[];
156
+ }
157
+
158
+ function convertFields(
159
+ extracted: ExtractedTypeInfo,
160
+ isInput: boolean,
161
+ ): ConvertFieldsResult {
162
+ const fields: FieldInfo[] = [];
163
+ const diagnostics: Diagnostic[] = [];
164
+
165
+ for (const field of extracted.fields) {
166
+ const eligibility = isInput
167
+ ? isEligibleAsInputObjectField(field.name)
168
+ : isEligibleAsObjectField(field.name);
169
+
170
+ if (!eligibility.eligible) {
171
+ diagnostics.push({
172
+ code: "SKIPPED_FIELD",
173
+ message: eligibility.skipReason!.message,
174
+ severity: "warning",
175
+ location: field.sourceLocation ?? {
176
+ file: extracted.metadata.sourceFile,
177
+ line: 1,
178
+ column: 1,
179
+ },
180
+ });
181
+ continue;
182
+ }
183
+
184
+ fields.push({
185
+ name: field.name,
186
+ type: convertTsTypeToGraphQLType(field.tsType, field.optional),
187
+ description: field.description,
188
+ deprecated: field.deprecated,
189
+ directives: field.directives,
190
+ defaultValue: field.defaultValue,
191
+ });
192
+ }
193
+
194
+ return { fields, diagnostics };
195
+ }
196
+
197
+ function isValidOneOfFieldType(
198
+ typeName: string,
199
+ typeMap: Map<string, ExtractedTypeInfo>,
200
+ ): boolean {
201
+ if (isBuiltInScalar(typeName)) {
202
+ return true;
203
+ }
204
+ if (PRIMITIVE_TYPE_MAP[typeName]) {
205
+ return true;
206
+ }
207
+ const referencedType = typeMap.get(typeName);
208
+ if (referencedType) {
209
+ if (referencedType.metadata.kind === "enum") {
210
+ return true;
211
+ }
212
+ if (isInputTypeName(referencedType.metadata.name)) {
213
+ return true;
214
+ }
215
+ }
216
+ return false;
217
+ }
218
+
219
+ interface OneOfValidationResult {
220
+ readonly valid: boolean;
221
+ readonly diagnostics: Diagnostic[];
222
+ readonly fields: FieldInfo[];
223
+ }
224
+
225
+ function validateAndConvertInlineObjectMembers(
226
+ members: ReadonlyArray<InlineObjectMember>,
227
+ typeName: string,
228
+ location: SourceLocation,
229
+ typeMap: Map<string, ExtractedTypeInfo>,
230
+ ): OneOfValidationResult {
231
+ const diagnostics: Diagnostic[] = [];
232
+ const fields: FieldInfo[] = [];
233
+ const propertyNames = new Set<string>();
234
+ const allProperties: InlineObjectProperty[] = [];
235
+
236
+ for (let i = 0; i < members.length; i++) {
237
+ const member = members[i]!;
238
+ const props = member.properties;
239
+
240
+ if (props.length === 0) {
241
+ diagnostics.push({
242
+ code: "ONEOF_EMPTY_OBJECT",
243
+ message: `OneOf input '${typeName}' member at index ${i} is an empty object. Each member must have exactly one property.`,
244
+ severity: "error",
245
+ location,
246
+ });
247
+ continue;
248
+ }
249
+
250
+ if (props.length > 1) {
251
+ diagnostics.push({
252
+ code: "ONEOF_MULTIPLE_PROPERTIES",
253
+ message: `OneOf input '${typeName}' member at index ${i} has ${props.length} properties. Each member must have exactly one property.`,
254
+ severity: "error",
255
+ location,
256
+ });
257
+ continue;
258
+ }
259
+
260
+ allProperties.push(props[0]!);
261
+ }
262
+
263
+ for (const prop of allProperties) {
264
+ if (propertyNames.has(prop.propertyName)) {
265
+ diagnostics.push({
266
+ code: "ONEOF_DUPLICATE_PROPERTY",
267
+ message: `OneOf input '${typeName}' has duplicate property name '${prop.propertyName}'.`,
268
+ severity: "error",
269
+ location,
270
+ });
271
+ continue;
272
+ }
273
+ propertyNames.add(prop.propertyName);
274
+
275
+ const graphqlType = convertTsTypeToGraphQLType(prop.propertyType, false);
276
+ const referencedTypeName = graphqlType.typeName;
277
+
278
+ if (!isValidOneOfFieldType(referencedTypeName, typeMap)) {
279
+ diagnostics.push({
280
+ code: "ONEOF_INVALID_FIELD_TYPE",
281
+ message: `OneOf input '${typeName}' field '${prop.propertyName}' has invalid type '${referencedTypeName}'. Only scalar types and Input Object types are allowed.`,
282
+ severity: "error",
283
+ location,
284
+ });
285
+ continue;
286
+ }
287
+
288
+ fields.push({
289
+ name: prop.propertyName,
290
+ type: {
291
+ typeName: graphqlType.typeName,
292
+ nullable: true,
293
+ list: graphqlType.list,
294
+ listItemNullable: graphqlType.listItemNullable,
295
+ },
296
+ description: prop.description,
297
+ deprecated: prop.deprecated,
298
+ directives: null,
299
+ defaultValue: null,
300
+ });
301
+ }
302
+
303
+ return {
304
+ valid: diagnostics.length === 0,
305
+ diagnostics,
306
+ fields: fields.sort((a, b) => a.name.localeCompare(b.name)),
307
+ };
308
+ }
309
+
310
+ export function convertToGraphQL(
311
+ extractedTypes: ReadonlyArray<ExtractedTypeInfo>,
312
+ ): ConversionResult {
313
+ const types: GraphQLTypeInfo[] = [];
314
+ const diagnostics: Diagnostic[] = [];
315
+
316
+ const typeMap = new Map<string, ExtractedTypeInfo>();
317
+ for (const extracted of extractedTypes) {
318
+ typeMap.set(extracted.metadata.name, extracted);
319
+ }
320
+
321
+ for (const extracted of extractedTypes) {
322
+ const { metadata } = extracted;
323
+
324
+ if (RESERVED_TYPE_NAMES.has(metadata.name)) {
325
+ diagnostics.push({
326
+ code: "RESERVED_TYPE_NAME",
327
+ message: `Type name '${metadata.name}' conflicts with a GraphQL built-in type`,
328
+ severity: "error",
329
+ location: { file: metadata.sourceFile, line: 1, column: 1 },
330
+ });
331
+ }
332
+
333
+ if (metadata.kind === "enum") {
334
+ if (isInputTypeName(metadata.name)) {
335
+ diagnostics.push({
336
+ code: "INVALID_INPUT_TYPE",
337
+ message: `Type '${metadata.name}' ends with 'Input' but is an enum type. Input types must be object types.`,
338
+ severity: "error",
339
+ location: { file: metadata.sourceFile, line: 1, column: 1 },
340
+ });
341
+ }
342
+
343
+ const enumLocation: SourceLocation = metadata.sourceLocation ?? {
344
+ file: metadata.sourceFile,
345
+ line: 1,
346
+ column: 1,
347
+ };
348
+ const {
349
+ values: enumValues,
350
+ diagnostics: enumDiagnostics,
351
+ isNumeric,
352
+ needsMapping,
353
+ hasError,
354
+ } = convertEnumMembers({
355
+ members: extracted.enumMembers ?? [],
356
+ enumName: metadata.name,
357
+ sourceFile: metadata.sourceFile,
358
+ enumLocation,
359
+ });
360
+ diagnostics.push(...enumDiagnostics);
361
+
362
+ if (hasError) {
363
+ continue;
364
+ }
365
+
366
+ types.push({
367
+ name: metadata.name,
368
+ kind: "Enum",
369
+ fields: null,
370
+ unionMembers: null,
371
+ enumValues,
372
+ isNumericEnum: isNumeric,
373
+ needsStringEnumMapping: !isNumeric && needsMapping,
374
+ implementedInterfaces: null,
375
+ sourceFile: metadata.sourceFile,
376
+ description: metadata.description,
377
+ deprecated: metadata.deprecated,
378
+ directives: metadata.directives,
379
+ });
380
+ } else if (metadata.kind === "graphqlInterface") {
381
+ const { fields, diagnostics: fieldDiagnostics } = convertFields(
382
+ extracted,
383
+ false,
384
+ );
385
+ diagnostics.push(...fieldDiagnostics);
386
+
387
+ types.push({
388
+ name: metadata.name,
389
+ kind: "Interface",
390
+ fields,
391
+ unionMembers: null,
392
+ enumValues: null,
393
+ isNumericEnum: false,
394
+ needsStringEnumMapping: false,
395
+ implementedInterfaces: extracted.implementedInterfaces
396
+ ? [...extracted.implementedInterfaces]
397
+ : null,
398
+ sourceFile: metadata.sourceFile,
399
+ description: metadata.description,
400
+ deprecated: metadata.deprecated,
401
+ directives: metadata.directives,
402
+ });
403
+ } else if (metadata.kind === "union") {
404
+ if (isInputTypeName(metadata.name)) {
405
+ const inlineObjectMembers = extracted.inlineObjectMembers ?? [];
406
+
407
+ if (inlineObjectMembers.length > 0) {
408
+ const location = { file: metadata.sourceFile, line: 1, column: 1 };
409
+ const validationResult = validateAndConvertInlineObjectMembers(
410
+ inlineObjectMembers,
411
+ metadata.name,
412
+ location,
413
+ typeMap,
414
+ );
415
+
416
+ diagnostics.push(...validationResult.diagnostics);
417
+
418
+ if (validationResult.valid) {
419
+ types.push({
420
+ name: metadata.name,
421
+ kind: "OneOfInputObject",
422
+ fields: validationResult.fields,
423
+ unionMembers: null,
424
+ enumValues: null,
425
+ isNumericEnum: false,
426
+ needsStringEnumMapping: false,
427
+ implementedInterfaces: null,
428
+ sourceFile: metadata.sourceFile,
429
+ description: metadata.description,
430
+ deprecated: metadata.deprecated,
431
+ directives: metadata.directives,
432
+ });
433
+ }
434
+ }
435
+ } else {
436
+ const unionMembers = extracted.unionMembers
437
+ ? [...extracted.unionMembers].sort()
438
+ : [];
439
+
440
+ types.push({
441
+ name: metadata.name,
442
+ kind: "Union",
443
+ fields: null,
444
+ unionMembers,
445
+ enumValues: null,
446
+ isNumericEnum: false,
447
+ needsStringEnumMapping: false,
448
+ implementedInterfaces: null,
449
+ sourceFile: metadata.sourceFile,
450
+ description: metadata.description,
451
+ deprecated: null,
452
+ directives: metadata.directives,
453
+ });
454
+ }
455
+ } else {
456
+ const isInput = isInputTypeName(metadata.name);
457
+ const { fields, diagnostics: fieldDiagnostics } = convertFields(
458
+ extracted,
459
+ isInput,
460
+ );
461
+ diagnostics.push(...fieldDiagnostics);
462
+
463
+ types.push({
464
+ name: metadata.name,
465
+ kind: isInput ? "InputObject" : "Object",
466
+ fields,
467
+ unionMembers: null,
468
+ enumValues: null,
469
+ isNumericEnum: false,
470
+ needsStringEnumMapping: false,
471
+ implementedInterfaces: extracted.implementedInterfaces
472
+ ? [...extracted.implementedInterfaces]
473
+ : null,
474
+ sourceFile: metadata.sourceFile,
475
+ description: metadata.description,
476
+ deprecated: metadata.deprecated,
477
+ directives: metadata.directives,
478
+ });
479
+ }
480
+ }
481
+
482
+ return { types, diagnostics };
483
+ }
@@ -0,0 +1 @@
1
+ export type { ExtractTypesResult } from "./collector/result-collector.js";