@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,38 @@
1
+ import type ts from "typescript";
2
+
3
+ export interface SourceLocation {
4
+ readonly file: string;
5
+ readonly line: number;
6
+ readonly column: number;
7
+ }
8
+
9
+ /**
10
+ * Extracts source location from a TypeScript AST node.
11
+ */
12
+ export function getSourceLocationFromNode(
13
+ node: ts.Node | undefined,
14
+ ): SourceLocation | null {
15
+ if (!node) return null;
16
+
17
+ const sourceFile = node.getSourceFile();
18
+ const { line, character } = sourceFile.getLineAndCharacterOfPosition(
19
+ node.getStart(sourceFile),
20
+ );
21
+
22
+ return {
23
+ file: sourceFile.fileName,
24
+ line: line + 1,
25
+ column: character + 1,
26
+ };
27
+ }
28
+
29
+ /**
30
+ * Returns the source location if present, otherwise creates a default location
31
+ * with the given source file and line/column 1.
32
+ */
33
+ export function getSourceLocationOrDefault(
34
+ location: SourceLocation | null,
35
+ sourceFile: string,
36
+ ): SourceLocation {
37
+ return location ?? { file: sourceFile, line: 1, column: 1 };
38
+ }
@@ -0,0 +1,126 @@
1
+ import { existsSync } from "node:fs";
2
+ import path from "node:path";
3
+ import ts from "typescript";
4
+ import type { Diagnostic } from "../type-extractor/types/index.js";
5
+
6
+ export interface LoadTsconfigOptions {
7
+ readonly cwd: string;
8
+ readonly tsconfigPath: string | null;
9
+ }
10
+
11
+ export interface LoadTsconfigResult {
12
+ readonly compilerOptions: ts.CompilerOptions | null;
13
+ readonly configFilePath: string | null;
14
+ readonly diagnostics: ReadonlyArray<Diagnostic>;
15
+ }
16
+
17
+ export function loadTsconfig(options: LoadTsconfigOptions): LoadTsconfigResult {
18
+ const { cwd, tsconfigPath } = options;
19
+
20
+ if (tsconfigPath !== null) {
21
+ return loadFromSpecifiedPath(cwd, tsconfigPath);
22
+ }
23
+
24
+ return autoDetectTsconfig(cwd);
25
+ }
26
+
27
+ function loadFromSpecifiedPath(
28
+ cwd: string,
29
+ tsconfigPath: string,
30
+ ): LoadTsconfigResult {
31
+ const absolutePath = path.isAbsolute(tsconfigPath)
32
+ ? tsconfigPath
33
+ : path.resolve(cwd, tsconfigPath);
34
+
35
+ if (!existsSync(absolutePath)) {
36
+ return {
37
+ compilerOptions: null,
38
+ configFilePath: null,
39
+ diagnostics: [
40
+ {
41
+ code: "TSCONFIG_NOT_FOUND",
42
+ message: `tsconfig.json not found at: ${absolutePath}`,
43
+ severity: "error",
44
+ location: null,
45
+ },
46
+ ],
47
+ };
48
+ }
49
+
50
+ return parseConfigFile(absolutePath);
51
+ }
52
+
53
+ function autoDetectTsconfig(cwd: string): LoadTsconfigResult {
54
+ const configPath = ts.findConfigFile(cwd, ts.sys.fileExists, "tsconfig.json");
55
+
56
+ if (!configPath) {
57
+ return {
58
+ compilerOptions: null,
59
+ configFilePath: null,
60
+ diagnostics: [],
61
+ };
62
+ }
63
+
64
+ return parseConfigFile(configPath);
65
+ }
66
+
67
+ function parseConfigFile(configFilePath: string): LoadTsconfigResult {
68
+ const diagnostics: Diagnostic[] = [];
69
+
70
+ const readResult = ts.readConfigFile(configFilePath, ts.sys.readFile);
71
+
72
+ if (readResult.error) {
73
+ diagnostics.push({
74
+ code: "TSCONFIG_PARSE_ERROR",
75
+ message: `Failed to parse tsconfig.json: ${ts.flattenDiagnosticMessageText(readResult.error.messageText, "\n")}`,
76
+ severity: "error",
77
+ location: {
78
+ file: configFilePath,
79
+ line: 1,
80
+ column: 1,
81
+ },
82
+ });
83
+ return {
84
+ compilerOptions: null,
85
+ configFilePath: null,
86
+ diagnostics,
87
+ };
88
+ }
89
+
90
+ const configDir = path.dirname(configFilePath);
91
+ const parseResult = ts.parseJsonConfigFileContent(
92
+ readResult.config,
93
+ ts.sys,
94
+ configDir,
95
+ );
96
+
97
+ const significantErrors = parseResult.errors.filter(
98
+ (error) => error.code !== 18003,
99
+ );
100
+
101
+ if (significantErrors.length > 0) {
102
+ for (const error of significantErrors) {
103
+ diagnostics.push({
104
+ code: "TSCONFIG_INVALID",
105
+ message: `Invalid compiler options: ${ts.flattenDiagnosticMessageText(error.messageText, "\n")}`,
106
+ severity: "error",
107
+ location: {
108
+ file: configFilePath,
109
+ line: 1,
110
+ column: 1,
111
+ },
112
+ });
113
+ }
114
+ return {
115
+ compilerOptions: null,
116
+ configFilePath,
117
+ diagnostics,
118
+ };
119
+ }
120
+
121
+ return {
122
+ compilerOptions: parseResult.options,
123
+ configFilePath,
124
+ diagnostics: [],
125
+ };
126
+ }
@@ -0,0 +1,155 @@
1
+ import ts from "typescript";
2
+
3
+ export interface DeprecationInfo {
4
+ readonly isDeprecated: true;
5
+ readonly reason: string | null;
6
+ }
7
+
8
+ export interface TSDocInfo {
9
+ readonly description: string | null;
10
+ readonly deprecated: DeprecationInfo | null;
11
+ }
12
+
13
+ function getSymbolFromNode(
14
+ node: ts.Node,
15
+ checker: ts.TypeChecker,
16
+ ): ts.Symbol | undefined {
17
+ if (ts.isInterfaceDeclaration(node) || ts.isTypeAliasDeclaration(node)) {
18
+ return checker.getSymbolAtLocation(node.name);
19
+ }
20
+ if (ts.isEnumDeclaration(node)) {
21
+ return checker.getSymbolAtLocation(node.name);
22
+ }
23
+ if (ts.isVariableStatement(node)) {
24
+ const declaration = node.declarationList.declarations[0];
25
+ if (declaration && ts.isIdentifier(declaration.name)) {
26
+ return checker.getSymbolAtLocation(declaration.name);
27
+ }
28
+ }
29
+ return undefined;
30
+ }
31
+
32
+ function getTagCommentText(
33
+ comment: string | ts.NodeArray<ts.JSDocComment> | undefined,
34
+ ): string | undefined {
35
+ if (typeof comment === "string") {
36
+ const trimmed = comment.replace(/\r\n/g, "\n").trim();
37
+ return trimmed === "" ? undefined : trimmed;
38
+ }
39
+ if (Array.isArray(comment)) {
40
+ const text = comment
41
+ .map((part) => part.text)
42
+ .join("")
43
+ .replace(/\r\n/g, "\n")
44
+ .trim();
45
+ return text === "" ? undefined : text;
46
+ }
47
+ return undefined;
48
+ }
49
+
50
+ function extractDescriptionTagContent(
51
+ declarations: ReadonlyArray<ts.Declaration> | undefined,
52
+ ): string | undefined {
53
+ if (!declarations) {
54
+ return undefined;
55
+ }
56
+
57
+ for (const declaration of declarations) {
58
+ const jsdocTags = ts.getJSDocTags(declaration);
59
+ for (const tag of jsdocTags) {
60
+ if (tag.tagName.text === "description") {
61
+ return getTagCommentText(tag.comment);
62
+ }
63
+ }
64
+ }
65
+
66
+ return undefined;
67
+ }
68
+
69
+ function extractDeprecatedFromDeclarations(
70
+ declarations: ReadonlyArray<ts.Declaration> | undefined,
71
+ ): DeprecationInfo | undefined {
72
+ if (!declarations) {
73
+ return undefined;
74
+ }
75
+
76
+ for (const declaration of declarations) {
77
+ const jsdocTags = ts.getJSDocTags(declaration);
78
+ for (const tag of jsdocTags) {
79
+ if (tag.tagName.text === "deprecated") {
80
+ const reason = getTagCommentText(tag.comment);
81
+ return {
82
+ isDeprecated: true,
83
+ reason: reason ?? null,
84
+ };
85
+ }
86
+ }
87
+ }
88
+
89
+ return undefined;
90
+ }
91
+
92
+ function normalizeLineEndings(text: string): string {
93
+ return text.replace(/\r\n/g, "\n");
94
+ }
95
+
96
+ function extractDescriptionFromSymbol(
97
+ symbol: ts.Symbol,
98
+ checker: ts.TypeChecker,
99
+ ): string | undefined {
100
+ const documentationComment = symbol.getDocumentationComment(checker);
101
+
102
+ if (documentationComment.length > 0) {
103
+ const description = normalizeLineEndings(
104
+ ts.displayPartsToString(documentationComment).trim(),
105
+ );
106
+ if (description !== "") {
107
+ return description;
108
+ }
109
+ }
110
+
111
+ const descriptionTagContent = extractDescriptionTagContent(
112
+ symbol.getDeclarations(),
113
+ );
114
+ if (descriptionTagContent) {
115
+ return normalizeLineEndings(descriptionTagContent);
116
+ }
117
+
118
+ return undefined;
119
+ }
120
+
121
+ export function extractTsDocInfo(
122
+ node: ts.Node,
123
+ checker: ts.TypeChecker,
124
+ ): TSDocInfo {
125
+ const symbol = getSymbolFromNode(node, checker);
126
+
127
+ if (!symbol) {
128
+ return { description: null, deprecated: null };
129
+ }
130
+
131
+ const description = extractDescriptionFromSymbol(symbol, checker);
132
+ const deprecated = extractDeprecatedFromDeclarations(
133
+ symbol.getDeclarations(),
134
+ );
135
+
136
+ return {
137
+ description: description ?? null,
138
+ deprecated: deprecated ?? null,
139
+ };
140
+ }
141
+
142
+ export function extractTsDocFromSymbol(
143
+ symbol: ts.Symbol,
144
+ checker: ts.TypeChecker,
145
+ ): TSDocInfo {
146
+ const description = extractDescriptionFromSymbol(symbol, checker);
147
+ const deprecated = extractDeprecatedFromDeclarations(
148
+ symbol.getDeclarations(),
149
+ );
150
+
151
+ return {
152
+ description: description ?? null,
153
+ deprecated: deprecated ?? null,
154
+ };
155
+ }
@@ -0,0 +1,99 @@
1
+ import type {
2
+ GraphQLFieldType,
3
+ TSTypeReference,
4
+ } from "../type-extractor/types/index.js";
5
+ import { PRIMITIVE_TYPE_MAP } from "./constants.js";
6
+
7
+ function convertElementTypeName(elementType: TSTypeReference): string {
8
+ if (elementType.kind === "scalar") {
9
+ return elementType.scalarInfo?.scalarName ?? elementType.name ?? "String";
10
+ }
11
+ if (elementType.kind === "primitive") {
12
+ return PRIMITIVE_TYPE_MAP[elementType.name ?? ""] ?? "String";
13
+ }
14
+ if (elementType.kind === "reference") {
15
+ return elementType.name ?? "Unknown";
16
+ }
17
+ if (elementType.kind === "inlineObject") {
18
+ return "__INLINE_OBJECT__";
19
+ }
20
+ if (elementType.kind === "inlineEnum") {
21
+ return "__INLINE_ENUM__";
22
+ }
23
+ return elementType.name ?? "String";
24
+ }
25
+
26
+ export function convertTsTypeToGraphQLType(
27
+ tsType: TSTypeReference,
28
+ optional = false,
29
+ ): GraphQLFieldType {
30
+ const nullable = tsType.nullable || optional;
31
+
32
+ if (tsType.kind === "array") {
33
+ const elementType = tsType.elementType;
34
+ const elementTypeName = elementType
35
+ ? convertElementTypeName(elementType)
36
+ : "String";
37
+ const listItemNullable = elementType?.nullable ?? false;
38
+
39
+ return {
40
+ typeName: elementTypeName,
41
+ nullable,
42
+ list: true,
43
+ listItemNullable,
44
+ };
45
+ }
46
+
47
+ if (tsType.kind === "scalar") {
48
+ return {
49
+ typeName: tsType.scalarInfo?.scalarName ?? tsType.name ?? "String",
50
+ nullable,
51
+ list: false,
52
+ listItemNullable: null,
53
+ };
54
+ }
55
+
56
+ if (tsType.kind === "primitive") {
57
+ const graphqlType = PRIMITIVE_TYPE_MAP[tsType.name ?? ""] ?? "String";
58
+ return {
59
+ typeName: graphqlType,
60
+ nullable,
61
+ list: false,
62
+ listItemNullable: null,
63
+ };
64
+ }
65
+
66
+ if (tsType.kind === "reference") {
67
+ return {
68
+ typeName: tsType.name ?? "Unknown",
69
+ nullable,
70
+ list: false,
71
+ listItemNullable: null,
72
+ };
73
+ }
74
+
75
+ if (tsType.kind === "inlineObject") {
76
+ return {
77
+ typeName: "__INLINE_OBJECT__",
78
+ nullable,
79
+ list: false,
80
+ listItemNullable: null,
81
+ };
82
+ }
83
+
84
+ if (tsType.kind === "inlineEnum") {
85
+ return {
86
+ typeName: "__INLINE_ENUM__",
87
+ nullable,
88
+ list: false,
89
+ listItemNullable: null,
90
+ };
91
+ }
92
+
93
+ return {
94
+ typeName: tsType.name ?? "String",
95
+ nullable,
96
+ list: false,
97
+ listItemNullable: null,
98
+ };
99
+ }
@@ -0,0 +1,246 @@
1
+ import ts from "typescript";
2
+ import { isInlineObjectType } from "./inline-object-utils.js";
3
+
4
+ /**
5
+ * Extracts type name from a TypeNode.
6
+ * Handles both simple identifiers and qualified names.
7
+ */
8
+ export function getTypeNameFromNode(typeNode: ts.TypeNode): string | null {
9
+ if (ts.isTypeReferenceNode(typeNode)) {
10
+ if (ts.isIdentifier(typeNode.typeName)) {
11
+ return typeNode.typeName.text;
12
+ }
13
+ if (ts.isQualifiedName(typeNode.typeName)) {
14
+ return typeNode.typeName.right.text;
15
+ }
16
+ }
17
+ return null;
18
+ }
19
+
20
+ /**
21
+ * Checks if a type represents null or undefined.
22
+ */
23
+ export function isNullOrUndefined(type: ts.Type): boolean {
24
+ return (
25
+ (type.flags & ts.TypeFlags.Null) !== 0 ||
26
+ (type.flags & ts.TypeFlags.Undefined) !== 0
27
+ );
28
+ }
29
+
30
+ /**
31
+ * Checks if a TypeNode represents null (literal null type).
32
+ */
33
+ function isNullTypeNode(typeNode: ts.TypeNode): boolean {
34
+ return (
35
+ ts.isLiteralTypeNode(typeNode) &&
36
+ typeNode.literal.kind === ts.SyntaxKind.NullKeyword
37
+ );
38
+ }
39
+
40
+ /**
41
+ * Filters non-null type nodes from a union type node.
42
+ */
43
+ export function filterNonNullTypeNodes(
44
+ typeNode: ts.UnionTypeNode,
45
+ ): ts.TypeNode[] {
46
+ return typeNode.types.filter((t) => !isNullTypeNode(t));
47
+ }
48
+
49
+ /**
50
+ * Finds the first non-null type node from a union type node.
51
+ */
52
+ export function findNonNullTypeNode(
53
+ typeNode: ts.UnionTypeNode,
54
+ ): ts.TypeNode | undefined {
55
+ return filterNonNullTypeNodes(typeNode)[0];
56
+ }
57
+
58
+ /**
59
+ * Checks if a union type contains null or undefined.
60
+ */
61
+ export function isNullableUnion(type: ts.Type): boolean {
62
+ if (!type.isUnion()) return false;
63
+ return type.types.some((t) => isNullOrUndefined(t));
64
+ }
65
+
66
+ /**
67
+ * Gets non-nullable types from a union type.
68
+ */
69
+ export function getNonNullableTypes(type: ts.Type): ts.Type[] {
70
+ if (!type.isUnion()) return [type];
71
+ return type.types.filter((t) => !isNullOrUndefined(t));
72
+ }
73
+
74
+ /**
75
+ * Checks if a type contains undefined.
76
+ * This is used to determine property optionality from resolved types,
77
+ * which correctly handles utility types like Required<T> and Partial<T>.
78
+ *
79
+ * In TypeScript:
80
+ * - Optional properties (?) add undefined to the type
81
+ * - Partial<T> adds undefined to all property types
82
+ * - Required<T> removes undefined from all property types
83
+ */
84
+ export function hasUndefinedInType(type: ts.Type): boolean {
85
+ if ((type.flags & ts.TypeFlags.Undefined) !== 0) return true;
86
+ if (type.isUnion()) {
87
+ return type.types.some((t) => (t.flags & ts.TypeFlags.Undefined) !== 0);
88
+ }
89
+ return false;
90
+ }
91
+
92
+ /**
93
+ * Checks if a node has the export modifier.
94
+ */
95
+ export function isExported(node: ts.Node): boolean {
96
+ const modifiers = ts.getCombinedModifierFlags(node as ts.Declaration);
97
+ return (modifiers & ts.ModifierFlags.Export) !== 0;
98
+ }
99
+
100
+ /**
101
+ * Checks if a type is an anonymous object type (like inline type literals).
102
+ * Named types and type aliases are not considered anonymous.
103
+ * This is used to determine if an intersection member should trigger
104
+ * treating the whole intersection as an inline object.
105
+ */
106
+ export function isAnonymousObjectType(type: ts.Type): boolean {
107
+ if (type.aliasSymbol) {
108
+ return false;
109
+ }
110
+ if (!type.symbol) {
111
+ return true;
112
+ }
113
+ const symbolName = type.symbol.getName();
114
+ return symbolName === "__type" || symbolName === "";
115
+ }
116
+
117
+ /**
118
+ * Checks if a type is an object-like type (interface, anonymous object, or mapped type).
119
+ * Used to determine if an intersection of object types should be treated as inline.
120
+ */
121
+ function isObjectLikeType(type: ts.Type): boolean {
122
+ if (!(type.flags & ts.TypeFlags.Object)) {
123
+ return false;
124
+ }
125
+ const objectType = type as ts.ObjectType;
126
+ return (
127
+ (objectType.objectFlags & ts.ObjectFlags.Interface) !== 0 ||
128
+ (objectType.objectFlags & ts.ObjectFlags.Anonymous) !== 0 ||
129
+ (objectType.objectFlags & ts.ObjectFlags.Mapped) !== 0
130
+ );
131
+ }
132
+
133
+ /**
134
+ * Extracts property symbols from a type, handling intersection types
135
+ * and falling back to getApparentType when getProperties() returns empty.
136
+ */
137
+ export function extractPropertySymbols(
138
+ type: ts.Type,
139
+ checker: ts.TypeChecker,
140
+ ): ts.Symbol[] {
141
+ if (type.isIntersection()) {
142
+ const allProps = new Map<string, ts.Symbol>();
143
+ for (const member of type.types) {
144
+ const memberProps = member.getProperties();
145
+ for (const prop of memberProps) {
146
+ const propName = prop.getName();
147
+ if (!allProps.has(propName)) {
148
+ allProps.set(propName, prop);
149
+ }
150
+ }
151
+ }
152
+ return [...allProps.values()];
153
+ }
154
+
155
+ const properties = type.getProperties();
156
+ if (properties.length > 0) {
157
+ return [...properties];
158
+ }
159
+
160
+ const apparentType = checker.getApparentType(type);
161
+ if (apparentType !== type) {
162
+ return [...apparentType.getProperties()];
163
+ }
164
+
165
+ return [];
166
+ }
167
+
168
+ /**
169
+ * Determines if an intersection type should be treated as an inline object.
170
+ * Returns true when:
171
+ * - Case 1: Has at least one anonymous/inline member
172
+ * - Case 2: All members are object-like types that should be merged
173
+ */
174
+ export function shouldTreatIntersectionAsInline(
175
+ type: ts.IntersectionType,
176
+ ): boolean {
177
+ const hasResolvableMember = type.types.some(
178
+ (t) => isInlineObjectType(t) || isAnonymousObjectType(t),
179
+ );
180
+ if (hasResolvableMember) {
181
+ return true;
182
+ }
183
+
184
+ const allObjectLike = type.types.every((t) => isObjectLikeType(t));
185
+ if (allObjectLike) {
186
+ return true;
187
+ }
188
+
189
+ return false;
190
+ }
191
+
192
+ /**
193
+ * Internal TypeScript symbol with parent reference.
194
+ * Used to access the parent enum symbol from enum member types.
195
+ */
196
+ export type SymbolWithParent = ts.Symbol & { parent?: ts.Symbol };
197
+
198
+ /**
199
+ * Finds the parent enum symbol if all types belong to the same enum.
200
+ * Returns null if types are empty, don't have a common parent enum, or belong to different enums.
201
+ */
202
+ export function findEnumParentSymbol(
203
+ types: readonly ts.Type[],
204
+ ): ts.Symbol | null {
205
+ if (types.length === 0) return null;
206
+
207
+ const firstSymbol = types[0]!.symbol as SymbolWithParent | undefined;
208
+ const parentSymbol = firstSymbol?.parent;
209
+
210
+ if (!parentSymbol || !(parentSymbol.flags & ts.SymbolFlags.Enum)) {
211
+ return null;
212
+ }
213
+
214
+ const allBelongToSameEnum = types.every((t) => {
215
+ const sym = t.symbol as SymbolWithParent | undefined;
216
+ return sym?.parent === parentSymbol;
217
+ });
218
+
219
+ return allBelongToSameEnum ? parentSymbol : null;
220
+ }
221
+
222
+ /**
223
+ * Checks if a union type is a boolean union (true | false with optional null/undefined).
224
+ */
225
+ export function isBooleanUnion(type: ts.Type): boolean {
226
+ if (!type.isUnion()) return false;
227
+ const nonNullTypes = getNonNullableTypes(type);
228
+ return (
229
+ nonNullTypes.length === 2 &&
230
+ nonNullTypes.every((t) => t.flags & ts.TypeFlags.BooleanLiteral)
231
+ );
232
+ }
233
+
234
+ /**
235
+ * Resolves a symbol to its original symbol by following alias chains.
236
+ * This is necessary for re-exports where the symbol is an alias.
237
+ */
238
+ export function resolveOriginalSymbol(
239
+ symbol: ts.Symbol,
240
+ checker: ts.TypeChecker,
241
+ ): ts.Symbol {
242
+ if (symbol.flags & ts.SymbolFlags.Alias) {
243
+ return checker.getAliasedSymbol(symbol);
244
+ }
245
+ return symbol;
246
+ }