@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
@@ -3,31 +3,17 @@ import ts from "typescript";
3
3
  import { isInternalTypeSymbol } from "../../shared/constants.js";
4
4
  import { detectDefaultValueMetadata } from "../../shared/default-value-detector.js";
5
5
  import { detectDirectiveMetadata, hasDirectiveMetadata, unwrapDirectiveType, } from "../../shared/directive-detector.js";
6
+ import { detectIgnoreFieldsMetadata } from "../../shared/ignore-fields-detector.js";
7
+ import { validateIgnoreFields } from "../../shared/ignore-fields-validator.js";
6
8
  import { extractInlineObjectProperties as extractInlineObjectPropertiesShared } from "../../shared/inline-object-extractor.js";
7
9
  import { isInlineObjectType } from "../../shared/inline-object-utils.js";
8
10
  import { extractImplementsFromDefineInterface, extractImplementsFromGqlTypeDef, isDefineInterfaceTypeAlias, } from "../../shared/interface-detector.js";
9
11
  import { detectScalarMetadata } from "../../shared/metadata-detector.js";
10
12
  import { getSourceLocationFromNode, } from "../../shared/source-location.js";
11
13
  import { extractTsDocFromSymbol, extractTsDocInfo, } from "../../shared/tsdoc-parser.js";
12
- import { extractPropertySymbols, getNonNullableTypes, hasUndefinedInType, isAnonymousObjectType, isExported, isNullableUnion, isNullOrUndefined, shouldTreatIntersectionAsInline, } from "../../shared/typescript-utils.js";
13
- /**
14
- * Finds the parent enum symbol if all types belong to the same enum.
15
- * Returns null if types are empty, don't have a common parent enum, or belong to different enums.
16
- */
17
- function findEnumParentSymbol(types) {
18
- if (types.length === 0)
19
- return null;
20
- const firstSymbol = types[0].symbol;
21
- const parentSymbol = firstSymbol?.parent;
22
- if (!parentSymbol || !(parentSymbol.flags & ts.SymbolFlags.Enum)) {
23
- return null;
24
- }
25
- const allBelongToSameEnum = types.every((t) => {
26
- const sym = t.symbol;
27
- return sym?.parent === parentSymbol;
28
- });
29
- return allBelongToSameEnum ? parentSymbol : null;
30
- }
14
+ import { extractPropertySymbols, filterNonNullTypeNodes, findEnumParentSymbol, findNonNullTypeNode, getNonNullableTypes, getTypeNameFromNode, hasUndefinedInType, isAnonymousObjectType, isBooleanUnion, isExported, isNullableUnion, isNullOrUndefined, shouldTreatIntersectionAsInline, } from "../../shared/typescript-utils.js";
15
+ import { createArrayType, createInlineObjectType, createLiteralType, createPrimitiveType, createReferenceType, createScalarType, createUnionType, } from "../types/index.js";
16
+ import { resolveFieldType } from "./field-type-resolver.js";
31
17
  function isDefaultExport(node, sourceFile) {
32
18
  let hasDefaultExport = false;
33
19
  const nodeName = node.name?.getText(sourceFile);
@@ -42,50 +28,36 @@ function isDefaultExport(node, sourceFile) {
42
28
  });
43
29
  return hasDefaultExport;
44
30
  }
45
- function isBooleanUnion(type) {
46
- if (!type.isUnion())
47
- return false;
48
- const nonNullTypes = getNonNullableTypes(type);
49
- return (nonNullTypes.length === 2 &&
50
- nonNullTypes.every((t) => t.flags & ts.TypeFlags.BooleanLiteral));
51
- }
52
31
  /**
53
32
  * Attempts to extract a type as an inline object, with cycle detection.
54
33
  * Returns a reference type if a cycle is detected, otherwise returns an inline object.
55
34
  */
56
- function tryExtractAsInlineObject(type, checker, globalTypeMappings, visitedTypes) {
35
+ function tryExtractAsInlineObject(type, ctx) {
36
+ const { checker, visitedTypes } = ctx;
57
37
  if (visitedTypes.has(type)) {
58
38
  const typeName = type.symbol?.getName() ?? "Object";
59
39
  return {
60
- tsType: {
61
- kind: "reference",
40
+ tsType: createReferenceType({
62
41
  name: typeName === "__type" ? "Object" : typeName,
63
- elementType: null,
64
- members: null,
65
42
  nullable: false,
66
- scalarInfo: null,
67
- inlineObjectProperties: null,
68
- },
43
+ }),
69
44
  };
70
45
  }
71
46
  visitedTypes.add(type);
72
- const inlineProperties = extractInlineObjectPropertiesShared(type, checker, (t, c) => convertTsTypeToReference(t, c, globalTypeMappings, visitedTypes).tsType);
47
+ const inlineProperties = extractInlineObjectPropertiesShared(type, checker, (t) => convertTsTypeToReference(t, ctx).tsType);
73
48
  return {
74
- tsType: {
75
- kind: "inlineObject",
76
- name: null,
77
- elementType: null,
78
- members: null,
79
- nullable: false,
80
- scalarInfo: null,
81
- inlineObjectProperties: inlineProperties,
82
- },
49
+ tsType: createInlineObjectType({
50
+ properties: inlineProperties,
51
+ description: null,
52
+ deprecated: null,
53
+ }),
83
54
  };
84
55
  }
85
56
  function findGlobalTypeMapping(typeName, globalTypeMappings) {
86
57
  return globalTypeMappings.find((m) => m.typeName === typeName);
87
58
  }
88
- function convertTsTypeToReference(type, checker, globalTypeMappings = [], visitedTypes = new WeakSet()) {
59
+ function convertTsTypeToReference(type, ctx, typeNode) {
60
+ const { checker, globalTypeMappings, knownTypeNames } = ctx;
89
61
  const metadataResult = detectScalarMetadata(type, checker);
90
62
  // Skip scalar detection if it's an array of scalars (e.g., Int[])
91
63
  // Array types should be handled by the array handling logic below
@@ -93,12 +65,8 @@ function convertTsTypeToReference(type, checker, globalTypeMappings = [], visite
93
65
  !metadataResult.isPrimitive &&
94
66
  !metadataResult.isList) {
95
67
  return {
96
- tsType: {
97
- kind: "scalar",
68
+ tsType: createScalarType({
98
69
  name: metadataResult.scalarName,
99
- elementType: null,
100
- members: null,
101
- nullable: metadataResult.nullable,
102
70
  scalarInfo: {
103
71
  scalarName: metadataResult.scalarName,
104
72
  typeName: metadataResult.scalarName,
@@ -106,22 +74,14 @@ function convertTsTypeToReference(type, checker, globalTypeMappings = [], visite
106
74
  isCustom: true,
107
75
  only: metadataResult.only,
108
76
  },
109
- inlineObjectProperties: null,
110
- },
77
+ nullable: metadataResult.nullable,
78
+ }),
111
79
  };
112
80
  }
113
81
  if (isBooleanUnion(type)) {
114
82
  const nullable = isNullableUnion(type);
115
83
  return {
116
- tsType: {
117
- kind: "primitive",
118
- name: "boolean",
119
- elementType: null,
120
- members: null,
121
- nullable,
122
- scalarInfo: null,
123
- inlineObjectProperties: null,
124
- },
84
+ tsType: createPrimitiveType({ name: "boolean", nullable }),
125
85
  };
126
86
  }
127
87
  if (type.isUnion()) {
@@ -131,15 +91,7 @@ function convertTsTypeToReference(type, checker, globalTypeMappings = [], visite
131
91
  if (aliasSymbol) {
132
92
  const name = aliasSymbol.getName();
133
93
  return {
134
- tsType: {
135
- kind: "reference",
136
- name,
137
- elementType: null,
138
- members: null,
139
- nullable,
140
- scalarInfo: null,
141
- inlineObjectProperties: null,
142
- },
94
+ tsType: createReferenceType({ name, nullable }),
143
95
  };
144
96
  }
145
97
  const nonNullTypes = getNonNullableTypes(type);
@@ -147,129 +99,72 @@ function convertTsTypeToReference(type, checker, globalTypeMappings = [], visite
147
99
  const enumParentSymbol = findEnumParentSymbol(nonNullTypes);
148
100
  if (enumParentSymbol) {
149
101
  return {
150
- tsType: {
151
- kind: "reference",
102
+ tsType: createReferenceType({
152
103
  name: enumParentSymbol.getName(),
153
- elementType: null,
154
- members: null,
155
104
  nullable,
156
- scalarInfo: null,
157
- inlineObjectProperties: null,
158
- },
105
+ }),
159
106
  };
160
107
  }
161
108
  if (nonNullTypes.length === 1) {
162
- const innerResult = convertTsTypeToReference(nonNullTypes[0], checker, globalTypeMappings, visitedTypes);
109
+ // For nullable types like User | null, extract the non-null type node
110
+ const nonNullTypeNode = typeNode && ts.isUnionTypeNode(typeNode)
111
+ ? findNonNullTypeNode(typeNode)
112
+ : undefined;
113
+ const innerResult = convertTsTypeToReference(nonNullTypes[0], ctx, nonNullTypeNode);
163
114
  return {
164
115
  tsType: { ...innerResult.tsType, nullable },
165
116
  };
166
117
  }
167
- const memberResults = nonNullTypes.map((t) => convertTsTypeToReference(t, checker, globalTypeMappings, visitedTypes));
118
+ const memberResults = nonNullTypes.map((t) => convertTsTypeToReference(t, ctx));
168
119
  return {
169
- tsType: {
170
- kind: "union",
171
- name: null,
172
- elementType: null,
120
+ tsType: createUnionType({
173
121
  members: memberResults.map((r) => r.tsType),
174
122
  nullable,
175
- scalarInfo: null,
176
- inlineObjectProperties: null,
177
- },
123
+ }),
178
124
  };
179
125
  }
180
126
  if (checker.isArrayType(type)) {
181
127
  const typeArgs = type.typeArguments;
182
128
  const elementType = typeArgs?.[0];
129
+ // Extract element type node from array type node (e.g., User[] -> User)
130
+ let elementTypeNode;
131
+ if (typeNode && ts.isArrayTypeNode(typeNode)) {
132
+ elementTypeNode = typeNode.elementType;
133
+ }
183
134
  const elementResult = elementType
184
- ? convertTsTypeToReference(elementType, checker, globalTypeMappings, visitedTypes)
135
+ ? convertTsTypeToReference(elementType, ctx, elementTypeNode)
185
136
  : {
186
- tsType: {
187
- kind: "primitive",
188
- name: "unknown",
189
- elementType: null,
190
- members: null,
191
- nullable: false,
192
- scalarInfo: null,
193
- inlineObjectProperties: null,
194
- },
137
+ tsType: createPrimitiveType({ name: "unknown", nullable: false }),
195
138
  };
196
139
  return {
197
- tsType: {
198
- kind: "array",
199
- name: null,
200
- elementType: elementResult.tsType,
201
- members: null,
202
- nullable: false,
203
- scalarInfo: null,
204
- inlineObjectProperties: null,
205
- },
140
+ tsType: createArrayType(elementResult.tsType),
206
141
  };
207
142
  }
208
143
  const typeString = checker.typeToString(type);
209
144
  if (type.flags & ts.TypeFlags.String) {
210
145
  return {
211
- tsType: {
212
- kind: "primitive",
213
- name: "string",
214
- elementType: null,
215
- members: null,
216
- nullable: false,
217
- scalarInfo: null,
218
- inlineObjectProperties: null,
219
- },
146
+ tsType: createPrimitiveType({ name: "string", nullable: false }),
220
147
  };
221
148
  }
222
149
  if (type.flags & ts.TypeFlags.Number) {
223
150
  return {
224
- tsType: {
225
- kind: "primitive",
226
- name: "number",
227
- elementType: null,
228
- members: null,
229
- nullable: false,
230
- scalarInfo: null,
231
- inlineObjectProperties: null,
232
- },
151
+ tsType: createPrimitiveType({ name: "number", nullable: false }),
233
152
  };
234
153
  }
235
154
  if (type.flags & ts.TypeFlags.Boolean ||
236
155
  type.flags & ts.TypeFlags.BooleanLiteral) {
237
156
  return {
238
- tsType: {
239
- kind: "primitive",
240
- name: "boolean",
241
- elementType: null,
242
- members: null,
243
- nullable: false,
244
- scalarInfo: null,
245
- inlineObjectProperties: null,
246
- },
157
+ tsType: createPrimitiveType({ name: "boolean", nullable: false }),
247
158
  };
248
159
  }
249
160
  if (type.flags & ts.TypeFlags.StringLiteral) {
250
161
  return {
251
- tsType: {
252
- kind: "literal",
253
- name: typeString.replace(/"/g, ""),
254
- elementType: null,
255
- members: null,
256
- nullable: false,
257
- scalarInfo: null,
258
- inlineObjectProperties: null,
259
- },
162
+ tsType: createLiteralType(typeString.replace(/"/g, "")),
260
163
  };
261
164
  }
262
165
  if (type.flags & ts.TypeFlags.NumberLiteral) {
263
166
  return {
264
- tsType: {
265
- kind: "literal",
266
- name: typeString,
267
- elementType: null,
268
- members: null,
269
- nullable: false,
270
- scalarInfo: null,
271
- inlineObjectProperties: null,
272
- },
167
+ tsType: createLiteralType(typeString),
273
168
  };
274
169
  }
275
170
  // Handle intersection types that should be treated as inline objects
@@ -281,31 +176,43 @@ function convertTsTypeToReference(type, checker, globalTypeMappings = [], visite
281
176
  if (type.aliasSymbol) {
282
177
  const aliasName = type.aliasSymbol.getName();
283
178
  return {
284
- tsType: {
285
- kind: "reference",
286
- name: aliasName,
287
- elementType: null,
288
- members: null,
289
- nullable: false,
290
- scalarInfo: null,
291
- inlineObjectProperties: null,
292
- },
179
+ tsType: createReferenceType({ name: aliasName, nullable: false }),
293
180
  };
294
181
  }
295
182
  const shouldTreatAsInline = shouldTreatIntersectionAsInline(type);
296
183
  if (shouldTreatAsInline) {
297
- return tryExtractAsInlineObject(type, checker, globalTypeMappings, visitedTypes);
184
+ return tryExtractAsInlineObject(type, ctx);
298
185
  }
299
186
  }
300
187
  if (isInlineObjectType(type)) {
301
- return tryExtractAsInlineObject(type, checker, globalTypeMappings, visitedTypes);
188
+ // Check if typeNode references a known type (schema-defined type)
189
+ if (typeNode && ts.isTypeReferenceNode(typeNode)) {
190
+ const typeName = getTypeNameFromNode(typeNode);
191
+ if (typeName && knownTypeNames.has(typeName)) {
192
+ return {
193
+ tsType: createReferenceType({ name: typeName, nullable: false }),
194
+ };
195
+ }
196
+ }
197
+ return tryExtractAsInlineObject(type, ctx);
302
198
  }
303
199
  // Check for utility types (Omit, Pick, Partial, Required, etc.)
304
200
  // These create mapped types that should be treated as inline objects
305
201
  if (type.flags & ts.TypeFlags.Object) {
306
202
  const objectType = type;
307
203
  if (objectType.objectFlags & ts.ObjectFlags.Mapped) {
308
- return tryExtractAsInlineObject(type, checker, globalTypeMappings, visitedTypes);
204
+ // Check if typeNode references a known type (schema-defined type).
205
+ // This handles Simplify<T> = { [K in keyof T]: T[K] } & {} pattern.
206
+ if (typeNode && ts.isTypeReferenceNode(typeNode)) {
207
+ const typeName = getTypeNameFromNode(typeNode);
208
+ // Only use typeNode name if it's in knownTypeNames (schema-defined type)
209
+ if (typeName && knownTypeNames.has(typeName)) {
210
+ return {
211
+ tsType: createReferenceType({ name: typeName, nullable: false }),
212
+ };
213
+ }
214
+ }
215
+ return tryExtractAsInlineObject(type, ctx);
309
216
  }
310
217
  }
311
218
  if (type.symbol) {
@@ -315,12 +222,8 @@ function convertTsTypeToReference(type, checker, globalTypeMappings = [], visite
315
222
  const globalMapping = findGlobalTypeMapping(symbolName, globalTypeMappings);
316
223
  if (globalMapping) {
317
224
  return {
318
- tsType: {
319
- kind: "scalar",
225
+ tsType: createScalarType({
320
226
  name: globalMapping.scalarName,
321
- elementType: null,
322
- members: null,
323
- nullable: false,
324
227
  scalarInfo: {
325
228
  scalarName: globalMapping.scalarName,
326
229
  typeName: globalMapping.typeName,
@@ -328,36 +231,32 @@ function convertTsTypeToReference(type, checker, globalTypeMappings = [], visite
328
231
  isCustom: true,
329
232
  only: globalMapping.only,
330
233
  },
331
- inlineObjectProperties: null,
332
- },
234
+ nullable: false,
235
+ }),
333
236
  };
334
237
  }
335
238
  return {
336
- tsType: {
337
- kind: "reference",
338
- name: symbolName,
339
- elementType: null,
340
- members: null,
341
- nullable: false,
342
- scalarInfo: null,
343
- inlineObjectProperties: null,
344
- },
239
+ tsType: createReferenceType({ name: symbolName, nullable: false }),
345
240
  };
346
241
  }
347
242
  }
348
243
  return {
349
- tsType: {
350
- kind: "reference",
351
- name: typeString,
352
- elementType: null,
353
- members: null,
354
- nullable: false,
355
- scalarInfo: null,
356
- inlineObjectProperties: null,
357
- },
244
+ tsType: createReferenceType({ name: typeString, nullable: false }),
358
245
  };
359
246
  }
360
- function extractFieldsFromType(type, checker, globalTypeMappings = []) {
247
+ function collectAllFieldNames(type, checker) {
248
+ const properties = extractPropertySymbols(type, checker);
249
+ const fieldNames = new Set();
250
+ for (const prop of properties) {
251
+ const propName = prop.getName();
252
+ if (!propName.startsWith(" $")) {
253
+ fieldNames.add(propName);
254
+ }
255
+ }
256
+ return fieldNames;
257
+ }
258
+ function extractFieldsFromType(params) {
259
+ const { type, checker, globalTypeMappings, knownTypeNames, knownTypeSymbols, underlyingSymbolToTypeName, sourceFiles, scalarMappingTable, scalarMappingContext, ignoreFields, } = params;
361
260
  const fields = [];
362
261
  const diagnostics = [];
363
262
  const properties = extractPropertySymbols(type, checker);
@@ -366,6 +265,9 @@ function extractFieldsFromType(type, checker, globalTypeMappings = []) {
366
265
  if (propName.startsWith(" $")) {
367
266
  continue;
368
267
  }
268
+ if (ignoreFields?.has(propName)) {
269
+ continue;
270
+ }
369
271
  const propType = checker.getTypeOfSymbol(prop);
370
272
  const declarations = prop.getDeclarations();
371
273
  const declaration = declarations?.[0];
@@ -408,11 +310,27 @@ function extractFieldsFromType(type, checker, globalTypeMappings = []) {
408
310
  directiveNullable = true;
409
311
  }
410
312
  }
411
- const typeResult = convertTsTypeToReference(actualPropType, checker, globalTypeMappings);
313
+ // Get typeNode from property declaration to preserve type alias names
314
+ let propTypeNode;
315
+ if (declaration &&
316
+ (ts.isPropertySignature(declaration) ||
317
+ ts.isPropertyDeclaration(declaration))) {
318
+ propTypeNode = declaration.type;
319
+ }
320
+ const resolvedType = resolveFieldType(actualPropType, propTypeNode, {
321
+ checker,
322
+ knownTypeNames,
323
+ knownTypeSymbols,
324
+ underlyingSymbolToTypeName,
325
+ globalTypeMappings,
326
+ sourceFiles,
327
+ scalarMappingTable,
328
+ scalarMappingContext,
329
+ });
412
330
  // Preserve nullability from original WithDirectives type
413
- const tsType = directiveNullable && !typeResult.tsType.nullable
414
- ? { ...typeResult.tsType, nullable: true }
415
- : typeResult.tsType;
331
+ const tsType = directiveNullable && !resolvedType.nullable
332
+ ? { ...resolvedType, nullable: true }
333
+ : resolvedType;
416
334
  fields.push({
417
335
  name: propName,
418
336
  tsType,
@@ -567,12 +485,12 @@ function extractStringLiteralUnionMembers(type, checker) {
567
485
  }
568
486
  return members;
569
487
  }
570
- function determineTypeKind(node, type, sourceFile) {
488
+ function determineTypeKind(node, type, checker) {
571
489
  if (ts.isInterfaceDeclaration(node)) {
572
490
  return "interface";
573
491
  }
574
492
  if (ts.isTypeAliasDeclaration(node)) {
575
- if (isDefineInterfaceTypeAlias(node, sourceFile)) {
493
+ if (isDefineInterfaceTypeAlias(node, checker)) {
576
494
  return "graphqlInterface";
577
495
  }
578
496
  const unionKind = determineTypeKindFromUnion(type);
@@ -633,7 +551,7 @@ function createGenericTypeDiagnostic(declaration, exportedName, location) {
633
551
  return null;
634
552
  }
635
553
  function processReexportedSymbol(params) {
636
- const { exportedName, resolvedSymbol, type, location, filePath, checker, globalTypeMappings, scannedSourceFiles, } = params;
554
+ const { exportedName, resolvedSymbol, type, location, filePath, checker, globalTypeMappings, knownTypeNames, knownTypeSymbols, underlyingSymbolToTypeName, scannedSourceFiles, scalarMappingTable, scalarMappingContext, } = params;
637
555
  const diagnostics = [];
638
556
  const scalarMetadataResult = detectScalarMetadata(type, checker);
639
557
  if (scalarMetadataResult.scalarName && !scalarMetadataResult.isPrimitive) {
@@ -710,10 +628,38 @@ function processReexportedSymbol(params) {
710
628
  skip: false,
711
629
  };
712
630
  }
713
- const unionMembers = extractUnionMembers(type);
631
+ // Get typeNode for union member extraction from declaration
632
+ const reexportDeclarations = resolvedSymbol.getDeclarations();
633
+ const reexportDeclaration = reexportDeclarations?.[0];
634
+ const reexportTypeNode = reexportDeclaration && ts.isTypeAliasDeclaration(reexportDeclaration)
635
+ ? reexportDeclaration.type
636
+ : undefined;
637
+ const unionMembers = extractUnionMembers(type, reexportTypeNode);
638
+ const ignoreFields = detectIgnoreFieldsMetadata({ type, checker });
639
+ if (ignoreFields !== null && kind !== "union") {
640
+ const allFieldNames = collectAllFieldNames(type, checker);
641
+ const validationDiagnostics = validateIgnoreFields({
642
+ typeName: exportedName,
643
+ ignoreFields,
644
+ allFieldNames,
645
+ sourceLocation: location,
646
+ });
647
+ diagnostics.push(...validationDiagnostics);
648
+ }
714
649
  const fieldResult = kind === "union"
715
650
  ? { fields: [], diagnostics: [] }
716
- : extractFieldsFromType(type, checker, globalTypeMappings);
651
+ : extractFieldsFromType({
652
+ type,
653
+ checker,
654
+ globalTypeMappings,
655
+ knownTypeNames,
656
+ knownTypeSymbols,
657
+ underlyingSymbolToTypeName,
658
+ sourceFiles: scannedSourceFiles,
659
+ scalarMappingTable,
660
+ scalarMappingContext,
661
+ ignoreFields,
662
+ });
717
663
  diagnostics.push(...fieldResult.diagnostics);
718
664
  return {
719
665
  typeInfo: {
@@ -730,7 +676,7 @@ function processReexportedSymbol(params) {
730
676
  skip: false,
731
677
  };
732
678
  }
733
- function processExportDeclaration(node, sourceFile, filePath, checker, globalTypeMappings, scannedSourceFiles) {
679
+ function processExportDeclaration(node, sourceFile, filePath, checker, globalTypeMappings, knownTypeNames, knownTypeSymbols, underlyingSymbolToTypeName, scannedSourceFiles, scalarMappingTable) {
734
680
  const types = [];
735
681
  const diagnostics = [];
736
682
  const detectedScalarNames = [];
@@ -802,7 +748,12 @@ function processExportDeclaration(node, sourceFile, filePath, checker, globalTyp
802
748
  filePath,
803
749
  checker,
804
750
  globalTypeMappings,
751
+ knownTypeNames,
752
+ knownTypeSymbols,
753
+ underlyingSymbolToTypeName,
805
754
  scannedSourceFiles,
755
+ scalarMappingTable,
756
+ scalarMappingContext: exportedName.endsWith("Input") ? "input" : "output",
806
757
  });
807
758
  if (result.skip)
808
759
  continue;
@@ -826,11 +777,15 @@ function getNamedTypeName(memberType) {
826
777
  // For regular types, use symbol
827
778
  return memberType.symbol?.getName() ?? "";
828
779
  }
829
- function extractInlineObjectMembers(type, checker, globalTypeMappings = []) {
780
+ function extractInlineObjectMembers(params) {
781
+ const { type, checker, globalTypeMappings, knownTypeNames, typeNode } = params;
830
782
  if (!type.isUnion()) {
831
783
  return null;
832
784
  }
833
785
  const nonNullTypes = getNonNullableTypes(type);
786
+ const memberTypeNodes = typeNode && ts.isUnionTypeNode(typeNode)
787
+ ? filterNonNullTypeNodes(typeNode)
788
+ : [];
834
789
  const allObjectTypes = nonNullTypes.every((t) => (t.flags & ts.TypeFlags.Object) !== 0 ||
835
790
  (t.flags & ts.TypeFlags.Intersection) !== 0);
836
791
  if (nonNullTypes.length < 2 || !allObjectTypes) {
@@ -839,31 +794,55 @@ function extractInlineObjectMembers(type, checker, globalTypeMappings = []) {
839
794
  let hasInlineObjects = false;
840
795
  let hasNamedTypes = false;
841
796
  const members = [];
842
- for (const memberType of nonNullTypes) {
843
- if (isAnonymousObjectType(memberType)) {
844
- hasInlineObjects = true;
845
- const properties = memberType.getProperties();
846
- const memberProperties = [];
847
- for (const prop of properties) {
848
- const propType = checker.getTypeOfSymbol(prop);
849
- const tsdocInfo = extractTsDocFromSymbol(prop, checker);
850
- const typeResult = convertTsTypeToReference(propType, checker, globalTypeMappings);
851
- memberProperties.push({
852
- propertyName: prop.getName(),
853
- propertyType: typeResult.tsType,
854
- description: tsdocInfo.description ?? null,
855
- deprecated: tsdocInfo.deprecated ?? null,
856
- });
797
+ const ctx = {
798
+ checker,
799
+ globalTypeMappings,
800
+ knownTypeNames,
801
+ visitedTypes: new WeakSet(),
802
+ };
803
+ if (memberTypeNodes.length > 0) {
804
+ for (const memberNode of memberTypeNodes) {
805
+ if (ts.isTypeReferenceNode(memberNode)) {
806
+ hasNamedTypes = true;
807
+ }
808
+ else {
809
+ hasInlineObjects = true;
857
810
  }
858
- members.push({ properties: memberProperties });
859
811
  }
860
- else {
861
- hasNamedTypes = true;
812
+ }
813
+ else {
814
+ for (const memberType of nonNullTypes) {
815
+ if (isAnonymousObjectType(memberType)) {
816
+ hasInlineObjects = true;
817
+ }
818
+ else {
819
+ hasNamedTypes = true;
820
+ }
821
+ }
822
+ }
823
+ if (hasInlineObjects) {
824
+ for (const memberType of nonNullTypes) {
825
+ if (isAnonymousObjectType(memberType)) {
826
+ const properties = memberType.getProperties();
827
+ const memberProperties = [];
828
+ for (const prop of properties) {
829
+ const propType = checker.getTypeOfSymbol(prop);
830
+ const tsdocInfo = extractTsDocFromSymbol(prop, checker);
831
+ const typeResult = convertTsTypeToReference(propType, ctx);
832
+ memberProperties.push({
833
+ propertyName: prop.getName(),
834
+ propertyType: typeResult.tsType,
835
+ description: tsdocInfo.description ?? null,
836
+ deprecated: tsdocInfo.deprecated ?? null,
837
+ });
838
+ }
839
+ members.push({ properties: memberProperties });
840
+ }
862
841
  }
863
842
  }
864
843
  return { members, hasInlineObjects, hasNamedTypes };
865
844
  }
866
- function extractUnionMembers(type) {
845
+ function extractUnionMembers(type, typeNode) {
867
846
  if (!type.isUnion()) {
868
847
  return undefined;
869
848
  }
@@ -872,9 +851,28 @@ function extractUnionMembers(type) {
872
851
  (t.flags & ts.TypeFlags.Intersection) !== 0 ||
873
852
  t.symbol !== undefined);
874
853
  if (nonNullTypes.length > 1 && allObjectTypes) {
854
+ // Extract member type nodes from union type node if available
855
+ const memberTypeNodes = typeNode && ts.isUnionTypeNode(typeNode)
856
+ ? filterNonNullTypeNodes(typeNode)
857
+ : [];
875
858
  const namedMembers = nonNullTypes
876
- .filter((t) => !isAnonymousObjectType(t))
877
- .map((t) => getNamedTypeName(t))
859
+ .map((t, index) => {
860
+ // First try to get name from type
861
+ if (!isAnonymousObjectType(t)) {
862
+ const name = getNamedTypeName(t);
863
+ if (name !== "" && name !== "__type") {
864
+ return name;
865
+ }
866
+ }
867
+ // Fallback to typeNode name for Simplify<T> pattern
868
+ if (memberTypeNodes[index]) {
869
+ const memberNode = memberTypeNodes[index];
870
+ if (ts.isTypeReferenceNode(memberNode)) {
871
+ return getTypeNameFromNode(memberNode) ?? "";
872
+ }
873
+ }
874
+ return "";
875
+ })
878
876
  .filter((name) => name !== "" && name !== "__type");
879
877
  if (namedMembers.length > 0) {
880
878
  return namedMembers.sort();
@@ -882,13 +880,13 @@ function extractUnionMembers(type) {
882
880
  }
883
881
  return undefined;
884
882
  }
885
- export function extractTypesFromProgram(program, sourceFiles, options = {}) {
883
+ export function extractTypesFromProgram(program, sourceFiles, options) {
886
884
  const checker = program.getTypeChecker();
887
885
  const types = [];
888
886
  const diagnostics = [];
889
887
  const detectedScalarNames = new Set();
890
888
  const detectedScalars = [];
891
- const globalTypeMappings = options.globalTypeMappings ?? [];
889
+ const { globalTypeMappings, knownTypeNames, knownTypeSymbols, underlyingSymbolToTypeName, scalarMappingTable, } = options;
892
890
  const scannedSourceFilesSet = new Set(sourceFiles);
893
891
  for (const filePath of sourceFiles) {
894
892
  const sourceFile = program.getSourceFile(filePath);
@@ -1009,9 +1007,19 @@ export function extractTypesFromProgram(program, sourceFiles, options = {}) {
1009
1007
  }
1010
1008
  actualType = type;
1011
1009
  }
1012
- const kind = determineTypeKind(node, actualType, sourceFile);
1013
- const unionMembers = extractUnionMembers(actualType);
1014
- const inlineObjectResult = extractInlineObjectMembers(actualType, checker, globalTypeMappings);
1010
+ const kind = determineTypeKind(node, actualType, checker);
1011
+ // Get typeNode for union member extraction (only for type aliases)
1012
+ const typeAliasTypeNode = ts.isTypeAliasDeclaration(node)
1013
+ ? node.type
1014
+ : undefined;
1015
+ const unionMembers = extractUnionMembers(actualType, typeAliasTypeNode);
1016
+ const inlineObjectResult = extractInlineObjectMembers({
1017
+ type: actualType,
1018
+ checker,
1019
+ globalTypeMappings,
1020
+ knownTypeNames,
1021
+ typeNode: typeAliasTypeNode,
1022
+ });
1015
1023
  const tsdocInfo = extractTsDocInfo(node, checker);
1016
1024
  let implementedInterfaces = null;
1017
1025
  if (ts.isTypeAliasDeclaration(node)) {
@@ -1050,9 +1058,33 @@ export function extractTypesFromProgram(program, sourceFiles, options = {}) {
1050
1058
  });
1051
1059
  return;
1052
1060
  }
1061
+ const ignoreFields = detectIgnoreFieldsMetadata({ type, checker });
1062
+ if (ignoreFields !== null && kind !== "union") {
1063
+ const allFieldNames = collectAllFieldNames(type, checker);
1064
+ const validationDiagnostics = validateIgnoreFields({
1065
+ typeName: name,
1066
+ ignoreFields,
1067
+ allFieldNames,
1068
+ sourceLocation: typeSourceLocation,
1069
+ });
1070
+ diagnostics.push(...validationDiagnostics);
1071
+ }
1053
1072
  const fieldResult = kind === "union"
1054
1073
  ? { fields: [], diagnostics: [] }
1055
- : extractFieldsFromType(actualType, checker, globalTypeMappings);
1074
+ : extractFieldsFromType({
1075
+ type: actualType,
1076
+ checker,
1077
+ globalTypeMappings,
1078
+ knownTypeNames,
1079
+ knownTypeSymbols,
1080
+ underlyingSymbolToTypeName,
1081
+ sourceFiles: scannedSourceFilesSet,
1082
+ scalarMappingTable,
1083
+ scalarMappingContext: name.endsWith("Input")
1084
+ ? "input"
1085
+ : "output",
1086
+ ignoreFields,
1087
+ });
1056
1088
  const fields = fieldResult.fields;
1057
1089
  diagnostics.push(...fieldResult.diagnostics);
1058
1090
  if (name.endsWith("Input") && kind === "union") {
@@ -1081,8 +1113,7 @@ export function extractTypesFromProgram(program, sourceFiles, options = {}) {
1081
1113
  });
1082
1114
  }
1083
1115
  }
1084
- const inlineObjectMembers = inlineObjectResult?.hasInlineObjects &&
1085
- !inlineObjectResult.hasNamedTypes
1116
+ const inlineObjectMembers = inlineObjectResult?.hasInlineObjects
1086
1117
  ? inlineObjectResult.members
1087
1118
  : null;
1088
1119
  const typeInfo = {
@@ -1096,7 +1127,7 @@ export function extractTypesFromProgram(program, sourceFiles, options = {}) {
1096
1127
  types.push(typeInfo);
1097
1128
  }
1098
1129
  if (ts.isExportDeclaration(node)) {
1099
- const result = processExportDeclaration(node, sourceFile, filePath, checker, globalTypeMappings, scannedSourceFilesSet);
1130
+ const result = processExportDeclaration(node, sourceFile, filePath, checker, globalTypeMappings, knownTypeNames, knownTypeSymbols, underlyingSymbolToTypeName, scannedSourceFilesSet, scalarMappingTable);
1100
1131
  types.push(...result.types);
1101
1132
  diagnostics.push(...result.diagnostics);
1102
1133
  for (const scalarName of result.detectedScalarNames) {