@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,564 @@
1
+ /**
2
+ * Directive definition extractor.
3
+ *
4
+ * This module provides functions to extract directive definitions from
5
+ * TypeScript type aliases that use the Directive<Name, Args, Location> type.
6
+ */
7
+
8
+ import ts from "typescript";
9
+ import type { GraphQLFieldType } from "../type-extractor/types/graphql.js";
10
+ import { METADATA_PROPERTIES } from "./constants.js";
11
+ import { getActualMetadataType } from "./metadata-detector.js";
12
+ import {
13
+ getNonNullableTypes,
14
+ isNullableUnion,
15
+ isNullOrUndefined,
16
+ } from "./typescript-utils.js";
17
+
18
+ const DIRECTIVE_NAME_PROPERTY = METADATA_PROPERTIES.DIRECTIVE_NAME;
19
+ const DIRECTIVE_ARGS_PROPERTY = METADATA_PROPERTIES.DIRECTIVE_ARGS;
20
+ const DIRECTIVE_LOCATION_PROPERTY = METADATA_PROPERTIES.DIRECTIVE_LOCATION;
21
+
22
+ /**
23
+ * Represents a directive location.
24
+ */
25
+ export type DirectiveLocation =
26
+ | "SCHEMA"
27
+ | "SCALAR"
28
+ | "OBJECT"
29
+ | "FIELD_DEFINITION"
30
+ | "ARGUMENT_DEFINITION"
31
+ | "INTERFACE"
32
+ | "UNION"
33
+ | "ENUM"
34
+ | "ENUM_VALUE"
35
+ | "INPUT_OBJECT"
36
+ | "INPUT_FIELD_DEFINITION";
37
+
38
+ /**
39
+ * Represents a directive argument definition.
40
+ */
41
+ export interface DirectiveArgumentDefinition {
42
+ readonly name: string;
43
+ readonly type: GraphQLFieldType;
44
+ readonly description: string | null;
45
+ }
46
+
47
+ /**
48
+ * Represents a directive definition extracted from a type alias.
49
+ */
50
+ export interface DirectiveDefinitionInfo {
51
+ readonly name: string;
52
+ readonly typeAliasName: string;
53
+ readonly args: ReadonlyArray<DirectiveArgumentDefinition>;
54
+ readonly locations: ReadonlyArray<DirectiveLocation>;
55
+ readonly sourceFile: string;
56
+ readonly line: number;
57
+ readonly description: string | null;
58
+ }
59
+
60
+ /**
61
+ * Error codes for directive definition extraction.
62
+ */
63
+ export type DirectiveDefinitionErrorCode =
64
+ | "UNRESOLVABLE_ARG_TYPE"
65
+ | "INVALID_LOCATION";
66
+
67
+ /**
68
+ * Error information for directive definition extraction.
69
+ */
70
+ export interface DirectiveDefinitionError {
71
+ readonly code: DirectiveDefinitionErrorCode;
72
+ readonly message: string;
73
+ readonly sourceFile: string;
74
+ readonly line: number;
75
+ }
76
+
77
+ /**
78
+ * Result of directive definition extraction.
79
+ */
80
+ export interface DirectiveDefinitionExtractionResult {
81
+ readonly definitions: ReadonlyArray<DirectiveDefinitionInfo>;
82
+ readonly errors: ReadonlyArray<DirectiveDefinitionError>;
83
+ }
84
+
85
+ /**
86
+ * Checks if a type is a Directive type (has $directiveName, $directiveArgs, $directiveLocation properties).
87
+ */
88
+ function isDirectiveType(type: ts.Type): boolean {
89
+ const nameProp = type.getProperty(DIRECTIVE_NAME_PROPERTY);
90
+ const argsProp = type.getProperty(DIRECTIVE_ARGS_PROPERTY);
91
+
92
+ return nameProp !== undefined && argsProp !== undefined;
93
+ }
94
+
95
+ /**
96
+ * Extracts the directive name from a Directive type.
97
+ */
98
+ function extractDirectiveName(
99
+ type: ts.Type,
100
+ checker: ts.TypeChecker,
101
+ ): string | null {
102
+ const nameProp = type.getProperty(DIRECTIVE_NAME_PROPERTY);
103
+ if (!nameProp) {
104
+ return null;
105
+ }
106
+
107
+ const rawNameType = checker.getTypeOfSymbol(nameProp);
108
+ const nameType = getActualMetadataType(rawNameType);
109
+ if (!nameType || !nameType.isStringLiteral()) {
110
+ return null;
111
+ }
112
+
113
+ return nameType.value;
114
+ }
115
+
116
+ /**
117
+ * Extracts directive locations from a Directive type.
118
+ */
119
+ function extractDirectiveLocations(
120
+ type: ts.Type,
121
+ checker: ts.TypeChecker,
122
+ ): DirectiveLocation[] {
123
+ const locationProp = type.getProperty(DIRECTIVE_LOCATION_PROPERTY);
124
+ if (!locationProp) {
125
+ return ["FIELD_DEFINITION"];
126
+ }
127
+
128
+ const rawLocationType = checker.getTypeOfSymbol(locationProp);
129
+ const locations: DirectiveLocation[] = [];
130
+
131
+ // Handle tuple types like ["FIELD_DEFINITION", "OBJECT"]
132
+ if (checker.isTupleType(rawLocationType)) {
133
+ const typeArgs = checker.getTypeArguments(
134
+ rawLocationType as ts.TypeReference,
135
+ );
136
+ for (const arg of typeArgs) {
137
+ if (arg.flags & ts.TypeFlags.Undefined) {
138
+ continue;
139
+ }
140
+ if (arg.isStringLiteral()) {
141
+ const value = arg.value as DirectiveLocation;
142
+ if (isValidLocation(value)) {
143
+ locations.push(value);
144
+ }
145
+ }
146
+ }
147
+ if (locations.length > 0) {
148
+ return locations;
149
+ }
150
+ }
151
+
152
+ // Handle array types
153
+ if (checker.isArrayType(rawLocationType)) {
154
+ const typeArgs = checker.getTypeArguments(
155
+ rawLocationType as ts.TypeReference,
156
+ );
157
+ if (typeArgs.length > 0 && typeArgs[0]) {
158
+ const elemType = typeArgs[0];
159
+ if (elemType.isUnion()) {
160
+ for (const member of elemType.types) {
161
+ if (member.flags & ts.TypeFlags.Undefined) {
162
+ continue;
163
+ }
164
+ if (member.isStringLiteral()) {
165
+ const value = member.value as DirectiveLocation;
166
+ if (isValidLocation(value)) {
167
+ locations.push(value);
168
+ }
169
+ }
170
+ }
171
+ if (locations.length > 0) {
172
+ return locations;
173
+ }
174
+ }
175
+ }
176
+ }
177
+
178
+ // Handle union types like "OBJECT" | "FIELD_DEFINITION" | undefined
179
+ if (rawLocationType.isUnion()) {
180
+ for (const member of rawLocationType.types) {
181
+ if (member.flags & ts.TypeFlags.Undefined) {
182
+ continue;
183
+ }
184
+ if (member.isStringLiteral()) {
185
+ const value = member.value as DirectiveLocation;
186
+ if (isValidLocation(value)) {
187
+ locations.push(value);
188
+ }
189
+ }
190
+ }
191
+ } else if (rawLocationType.isStringLiteral()) {
192
+ const value = rawLocationType.value as DirectiveLocation;
193
+ if (isValidLocation(value)) {
194
+ locations.push(value);
195
+ }
196
+ } else {
197
+ // Try to unwrap optional type (T | undefined where T is a single type)
198
+ const locationType = getActualMetadataType(rawLocationType);
199
+ if (locationType?.isStringLiteral()) {
200
+ const value = locationType.value as DirectiveLocation;
201
+ if (isValidLocation(value)) {
202
+ locations.push(value);
203
+ }
204
+ }
205
+ }
206
+
207
+ return locations.length > 0 ? locations : ["FIELD_DEFINITION"];
208
+ }
209
+
210
+ const VALID_LOCATIONS = new Set<string>([
211
+ "SCHEMA",
212
+ "SCALAR",
213
+ "OBJECT",
214
+ "FIELD_DEFINITION",
215
+ "ARGUMENT_DEFINITION",
216
+ "INTERFACE",
217
+ "UNION",
218
+ "ENUM",
219
+ "ENUM_VALUE",
220
+ "INPUT_OBJECT",
221
+ "INPUT_FIELD_DEFINITION",
222
+ ]);
223
+
224
+ function isValidLocation(value: string): value is DirectiveLocation {
225
+ return VALID_LOCATIONS.has(value);
226
+ }
227
+
228
+ /**
229
+ * Converts a TypeScript type to a GraphQL field type.
230
+ */
231
+ function convertToGraphQLType(
232
+ type: ts.Type,
233
+ checker: ts.TypeChecker,
234
+ ): GraphQLFieldType | null {
235
+ // Handle type parameters by getting their constraint
236
+ if (type.flags & ts.TypeFlags.TypeParameter) {
237
+ const constraint = checker.getBaseConstraintOfType(type);
238
+ if (constraint) {
239
+ return convertToGraphQLType(constraint, checker);
240
+ }
241
+ }
242
+
243
+ // Check for type alias (e.g., Role = "USER" | "ADMIN")
244
+ if (type.aliasSymbol) {
245
+ const aliasName = type.aliasSymbol.getName();
246
+ if (aliasName && aliasName !== "__type") {
247
+ return {
248
+ typeName: aliasName,
249
+ nullable: false,
250
+ list: false,
251
+ listItemNullable: null,
252
+ };
253
+ }
254
+ }
255
+
256
+ if (
257
+ type.flags & ts.TypeFlags.String ||
258
+ type.flags & ts.TypeFlags.StringLiteral
259
+ ) {
260
+ return {
261
+ typeName: "String",
262
+ nullable: false,
263
+ list: false,
264
+ listItemNullable: null,
265
+ };
266
+ }
267
+
268
+ if (
269
+ type.flags & ts.TypeFlags.Number ||
270
+ type.flags & ts.TypeFlags.NumberLiteral
271
+ ) {
272
+ return {
273
+ typeName: "Float",
274
+ nullable: false,
275
+ list: false,
276
+ listItemNullable: null,
277
+ };
278
+ }
279
+
280
+ if (
281
+ type.flags & ts.TypeFlags.Boolean ||
282
+ type.flags & ts.TypeFlags.BooleanLiteral
283
+ ) {
284
+ return {
285
+ typeName: "Boolean",
286
+ nullable: false,
287
+ list: false,
288
+ listItemNullable: null,
289
+ };
290
+ }
291
+
292
+ if (type.isUnion()) {
293
+ const nonNullTypes = getNonNullableTypes(type);
294
+ const nullable = isNullableUnion(type);
295
+
296
+ if (nonNullTypes.length === 1 && nonNullTypes[0]) {
297
+ const innerType = convertToGraphQLType(nonNullTypes[0], checker);
298
+ if (innerType) {
299
+ return { ...innerType, nullable };
300
+ }
301
+ }
302
+
303
+ if (
304
+ nonNullTypes.length > 0 &&
305
+ nonNullTypes.every((t) => t.isStringLiteral())
306
+ ) {
307
+ return {
308
+ typeName: "String",
309
+ nullable,
310
+ list: false,
311
+ listItemNullable: null,
312
+ };
313
+ }
314
+ }
315
+
316
+ if (checker.isArrayType(type) || checker.isTupleType(type)) {
317
+ const typeArgs = checker.getTypeArguments(type as ts.TypeReference);
318
+ if (typeArgs.length > 0 && typeArgs[0]) {
319
+ let elementType = typeArgs[0];
320
+
321
+ if (checker.isTupleType(type) && typeArgs.length > 1) {
322
+ const nonNullTypes = typeArgs.filter((t) => !isNullOrUndefined(t));
323
+ if (nonNullTypes.length > 0 && nonNullTypes[0]) {
324
+ elementType = nonNullTypes[0];
325
+ }
326
+ }
327
+
328
+ // Check if element type is a type alias (e.g., Role = "USER" | "ADMIN")
329
+ if (elementType.aliasSymbol) {
330
+ const aliasName = elementType.aliasSymbol.getName();
331
+ if (aliasName && aliasName !== "__type") {
332
+ return {
333
+ typeName: aliasName,
334
+ nullable: false,
335
+ list: true,
336
+ listItemNullable: false,
337
+ };
338
+ }
339
+ }
340
+
341
+ if (elementType.isUnion()) {
342
+ const nonNullMembers = getNonNullableTypes(elementType);
343
+ if (
344
+ nonNullMembers.length > 0 &&
345
+ nonNullMembers.every((t) => t.isStringLiteral())
346
+ ) {
347
+ return {
348
+ typeName: "String",
349
+ nullable: false,
350
+ list: true,
351
+ listItemNullable: false,
352
+ };
353
+ }
354
+
355
+ const hasNull = isNullableUnion(elementType);
356
+
357
+ if (nonNullMembers.length === 1 && nonNullMembers[0]) {
358
+ const innerType = convertToGraphQLType(nonNullMembers[0], checker);
359
+ if (innerType && !innerType.list) {
360
+ return {
361
+ typeName: innerType.typeName,
362
+ nullable: false,
363
+ list: true,
364
+ listItemNullable: hasNull,
365
+ };
366
+ }
367
+ }
368
+ }
369
+
370
+ const innerType = convertToGraphQLType(elementType, checker);
371
+ if (innerType && !innerType.list) {
372
+ return {
373
+ typeName: innerType.typeName,
374
+ nullable: false,
375
+ list: true,
376
+ listItemNullable: innerType.nullable,
377
+ };
378
+ }
379
+ }
380
+
381
+ return {
382
+ typeName: "String",
383
+ nullable: false,
384
+ list: true,
385
+ listItemNullable: false,
386
+ };
387
+ }
388
+
389
+ if (type.symbol) {
390
+ const symbolName = type.symbol.getName();
391
+ if (symbolName !== "__type" && symbolName !== "") {
392
+ return {
393
+ typeName: symbolName,
394
+ nullable: false,
395
+ list: false,
396
+ listItemNullable: null,
397
+ };
398
+ }
399
+ }
400
+
401
+ return null;
402
+ }
403
+
404
+ /**
405
+ * Extracts directive argument definitions from a Directive type.
406
+ */
407
+ function extractDirectiveArgs(
408
+ type: ts.Type,
409
+ checker: ts.TypeChecker,
410
+ sourceFile: string,
411
+ line: number,
412
+ ): {
413
+ args: DirectiveArgumentDefinition[];
414
+ errors: DirectiveDefinitionError[];
415
+ } {
416
+ const argsProp = type.getProperty(DIRECTIVE_ARGS_PROPERTY);
417
+ if (!argsProp) {
418
+ return { args: [], errors: [] };
419
+ }
420
+
421
+ const rawArgsType = checker.getTypeOfSymbol(argsProp);
422
+ let argsType = getActualMetadataType(rawArgsType);
423
+ if (!argsType) {
424
+ return { args: [], errors: [] };
425
+ }
426
+
427
+ // If argsType is a type parameter, get its constraint
428
+ if (argsType.flags & ts.TypeFlags.TypeParameter) {
429
+ const constraint = checker.getBaseConstraintOfType(argsType);
430
+ if (constraint) {
431
+ argsType = constraint;
432
+ }
433
+ }
434
+
435
+ const args: DirectiveArgumentDefinition[] = [];
436
+ const errors: DirectiveDefinitionError[] = [];
437
+
438
+ const properties = argsType.getProperties();
439
+ for (const prop of properties) {
440
+ const propName = prop.getName();
441
+ const propType = checker.getTypeOfSymbol(prop);
442
+
443
+ const graphqlType = convertToGraphQLType(propType, checker);
444
+ if (graphqlType) {
445
+ args.push({
446
+ name: propName,
447
+ type: graphqlType,
448
+ description: null,
449
+ });
450
+ } else {
451
+ errors.push({
452
+ code: "UNRESOLVABLE_ARG_TYPE",
453
+ message: `Cannot resolve argument type for '${propName}'`,
454
+ sourceFile,
455
+ line,
456
+ });
457
+ }
458
+ }
459
+
460
+ return { args, errors };
461
+ }
462
+
463
+ /**
464
+ * Extracts directive definitions from a TypeScript program.
465
+ *
466
+ * This function analyzes exported type aliases to find those that use
467
+ * the Directive<Name, Args, Location> type and extracts directive definitions.
468
+ *
469
+ * @param program - The TypeScript program
470
+ * @param sourceFiles - The source files to analyze
471
+ * @returns Extraction result with definitions and errors
472
+ */
473
+ export function extractDirectiveDefinitions(
474
+ program: ts.Program,
475
+ sourceFiles: ReadonlyArray<string>,
476
+ ): DirectiveDefinitionExtractionResult {
477
+ const checker = program.getTypeChecker();
478
+ const definitions: DirectiveDefinitionInfo[] = [];
479
+ const errors: DirectiveDefinitionError[] = [];
480
+
481
+ for (const filePath of sourceFiles) {
482
+ const sourceFile = program.getSourceFile(filePath);
483
+ if (!sourceFile) {
484
+ continue;
485
+ }
486
+
487
+ ts.forEachChild(sourceFile, (node) => {
488
+ if (!ts.isTypeAliasDeclaration(node)) {
489
+ return;
490
+ }
491
+
492
+ const modifiers = ts.getCombinedModifierFlags(node);
493
+ const isExported = (modifiers & ts.ModifierFlags.Export) !== 0;
494
+ if (!isExported) {
495
+ return;
496
+ }
497
+
498
+ const symbol = checker.getSymbolAtLocation(node.name);
499
+ if (!symbol) {
500
+ return;
501
+ }
502
+
503
+ const type = checker.getDeclaredTypeOfSymbol(symbol);
504
+ if (!isDirectiveType(type)) {
505
+ return;
506
+ }
507
+
508
+ const directiveName = extractDirectiveName(type, checker);
509
+ if (!directiveName) {
510
+ return;
511
+ }
512
+
513
+ const typeAliasName = node.name.getText(sourceFile);
514
+
515
+ const { line } = sourceFile.getLineAndCharacterOfPosition(
516
+ node.getStart(sourceFile),
517
+ );
518
+
519
+ const locations = extractDirectiveLocations(type, checker);
520
+ const argsResult = extractDirectiveArgs(
521
+ type,
522
+ checker,
523
+ filePath,
524
+ line + 1,
525
+ );
526
+
527
+ const description = extractDescription(node, checker);
528
+
529
+ definitions.push({
530
+ name: directiveName,
531
+ typeAliasName,
532
+ args: argsResult.args,
533
+ locations,
534
+ sourceFile: filePath,
535
+ line: line + 1,
536
+ description,
537
+ });
538
+
539
+ errors.push(...argsResult.errors);
540
+ });
541
+ }
542
+
543
+ return { definitions, errors };
544
+ }
545
+
546
+ /**
547
+ * Extracts description from TSDoc comments.
548
+ */
549
+ function extractDescription(
550
+ node: ts.TypeAliasDeclaration,
551
+ checker: ts.TypeChecker,
552
+ ): string | null {
553
+ const symbol = checker.getSymbolAtLocation(node.name);
554
+ if (!symbol) {
555
+ return null;
556
+ }
557
+
558
+ const documentation = symbol.getDocumentationComment(checker);
559
+ if (documentation.length === 0) {
560
+ return null;
561
+ }
562
+
563
+ return documentation.map((d) => d.text).join("\n");
564
+ }