@gqlkit-ts/cli 0.1.0 → 0.2.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 (234) hide show
  1. package/dist/auto-type-generator/auto-type-generator.d.ts +19 -3
  2. package/dist/auto-type-generator/auto-type-generator.d.ts.map +1 -1
  3. package/dist/auto-type-generator/auto-type-generator.js +236 -49
  4. package/dist/auto-type-generator/auto-type-generator.js.map +1 -1
  5. package/dist/auto-type-generator/index.d.ts +1 -1
  6. package/dist/auto-type-generator/index.d.ts.map +1 -1
  7. package/dist/auto-type-generator/index.js.map +1 -1
  8. package/dist/auto-type-generator/inline-enum-collector.d.ts +31 -0
  9. package/dist/auto-type-generator/inline-enum-collector.d.ts.map +1 -0
  10. package/dist/auto-type-generator/inline-enum-collector.js +157 -0
  11. package/dist/auto-type-generator/inline-enum-collector.js.map +1 -0
  12. package/dist/auto-type-generator/naming-convention.d.ts +4 -0
  13. package/dist/auto-type-generator/naming-convention.d.ts.map +1 -1
  14. package/dist/auto-type-generator/naming-convention.js +8 -0
  15. package/dist/auto-type-generator/naming-convention.js.map +1 -1
  16. package/dist/gen-orchestrator/orchestrator.d.ts.map +1 -1
  17. package/dist/gen-orchestrator/orchestrator.js +106 -8
  18. package/dist/gen-orchestrator/orchestrator.js.map +1 -1
  19. package/dist/resolver-extractor/extract-resolvers.d.ts +10 -1
  20. package/dist/resolver-extractor/extract-resolvers.d.ts.map +1 -1
  21. package/dist/resolver-extractor/extractor/define-api-extractor.d.ts +11 -1
  22. package/dist/resolver-extractor/extractor/define-api-extractor.d.ts.map +1 -1
  23. package/dist/resolver-extractor/extractor/define-api-extractor.js +88 -264
  24. package/dist/resolver-extractor/extractor/define-api-extractor.js.map +1 -1
  25. package/dist/schema-generator/emitter/code-emitter.d.ts +10 -2
  26. package/dist/schema-generator/emitter/code-emitter.d.ts.map +1 -1
  27. package/dist/schema-generator/emitter/code-emitter.js +19 -4
  28. package/dist/schema-generator/emitter/code-emitter.js.map +1 -1
  29. package/dist/schema-generator/generate-schema.d.ts.map +1 -1
  30. package/dist/schema-generator/generate-schema.js +18 -1
  31. package/dist/schema-generator/generate-schema.js.map +1 -1
  32. package/dist/schema-generator/integrator/result-integrator.d.ts +20 -0
  33. package/dist/schema-generator/integrator/result-integrator.d.ts.map +1 -1
  34. package/dist/schema-generator/integrator/result-integrator.js +42 -0
  35. package/dist/schema-generator/integrator/result-integrator.js.map +1 -1
  36. package/dist/shared/constants.d.ts +0 -16
  37. package/dist/shared/constants.d.ts.map +1 -1
  38. package/dist/shared/constants.js +0 -19
  39. package/dist/shared/constants.js.map +1 -1
  40. package/dist/shared/directive-detector.d.ts.map +1 -1
  41. package/dist/shared/directive-detector.js +8 -15
  42. package/dist/shared/directive-detector.js.map +1 -1
  43. package/dist/shared/file-scanner.d.ts.map +1 -1
  44. package/dist/shared/file-scanner.js +5 -3
  45. package/dist/shared/file-scanner.js.map +1 -1
  46. package/dist/shared/index.d.ts +1 -1
  47. package/dist/shared/index.d.ts.map +1 -1
  48. package/dist/shared/index.js +1 -3
  49. package/dist/shared/index.js.map +1 -1
  50. package/dist/shared/interface-detector.d.ts +3 -2
  51. package/dist/shared/interface-detector.d.ts.map +1 -1
  52. package/dist/shared/interface-detector.js +54 -11
  53. package/dist/shared/interface-detector.js.map +1 -1
  54. package/dist/shared/path-utils.d.ts +2 -0
  55. package/dist/shared/path-utils.d.ts.map +1 -0
  56. package/dist/shared/path-utils.js +4 -0
  57. package/dist/shared/path-utils.js.map +1 -0
  58. package/dist/shared/type-converter.d.ts.map +1 -1
  59. package/dist/shared/type-converter.js +11 -0
  60. package/dist/shared/type-converter.js.map +1 -1
  61. package/dist/shared/typescript-utils.d.ts +34 -7
  62. package/dist/shared/typescript-utils.d.ts.map +1 -1
  63. package/dist/shared/typescript-utils.js +72 -24
  64. package/dist/shared/typescript-utils.js.map +1 -1
  65. package/dist/type-extractor/collector/scalar-collector.d.ts.map +1 -1
  66. package/dist/type-extractor/collector/scalar-collector.js +4 -14
  67. package/dist/type-extractor/collector/scalar-collector.js.map +1 -1
  68. package/dist/type-extractor/converter/graphql-converter.d.ts.map +1 -1
  69. package/dist/type-extractor/converter/graphql-converter.js +42 -3
  70. package/dist/type-extractor/converter/graphql-converter.js.map +1 -1
  71. package/dist/type-extractor/extractor/field-type-resolver.d.ts +28 -0
  72. package/dist/type-extractor/extractor/field-type-resolver.d.ts.map +1 -0
  73. package/dist/type-extractor/extractor/field-type-resolver.js +394 -0
  74. package/dist/type-extractor/extractor/field-type-resolver.js.map +1 -0
  75. package/dist/type-extractor/extractor/type-extractor.d.ts +12 -3
  76. package/dist/type-extractor/extractor/type-extractor.d.ts.map +1 -1
  77. package/dist/type-extractor/extractor/type-extractor.js +176 -210
  78. package/dist/type-extractor/extractor/type-extractor.js.map +1 -1
  79. package/dist/type-extractor/extractor/type-name-collector.d.ts +24 -0
  80. package/dist/type-extractor/extractor/type-name-collector.d.ts.map +1 -0
  81. package/dist/type-extractor/extractor/type-name-collector.js +102 -0
  82. package/dist/type-extractor/extractor/type-name-collector.js.map +1 -0
  83. package/dist/type-extractor/mapper/scalar-base-type-mapper.d.ts +89 -0
  84. package/dist/type-extractor/mapper/scalar-base-type-mapper.d.ts.map +1 -0
  85. package/dist/type-extractor/mapper/scalar-base-type-mapper.js +158 -0
  86. package/dist/type-extractor/mapper/scalar-base-type-mapper.js.map +1 -0
  87. package/dist/type-extractor/types/diagnostics.d.ts +1 -1
  88. package/dist/type-extractor/types/diagnostics.d.ts.map +1 -1
  89. package/dist/type-extractor/types/graphql.d.ts +2 -0
  90. package/dist/type-extractor/types/graphql.d.ts.map +1 -1
  91. package/dist/type-extractor/types/index.d.ts +2 -1
  92. package/dist/type-extractor/types/index.d.ts.map +1 -1
  93. package/dist/type-extractor/types/index.js +1 -1
  94. package/dist/type-extractor/types/index.js.map +1 -1
  95. package/dist/type-extractor/types/ts-type-reference-factory.d.ts +39 -0
  96. package/dist/type-extractor/types/ts-type-reference-factory.d.ts.map +1 -0
  97. package/dist/type-extractor/types/ts-type-reference-factory.js +69 -0
  98. package/dist/type-extractor/types/ts-type-reference-factory.js.map +1 -0
  99. package/dist/type-extractor/types/typescript.d.ts +21 -1
  100. package/dist/type-extractor/types/typescript.d.ts.map +1 -1
  101. package/dist/type-extractor/validator/type-validator.js +1 -1
  102. package/dist/type-extractor/validator/type-validator.js.map +1 -1
  103. package/docs/index.md +1 -0
  104. package/docs/integration/drizzle.md +191 -0
  105. package/docs/schema/enums.md +208 -0
  106. package/docs/schema/fields.md +2 -0
  107. package/docs/schema/inputs.md +2 -0
  108. package/docs/schema/objects.md +2 -0
  109. package/docs/schema/queries-mutations.md +2 -0
  110. package/package.json +10 -3
  111. package/src/auto-type-generator/auto-type-generator.ts +925 -0
  112. package/src/auto-type-generator/index.ts +21 -0
  113. package/src/auto-type-generator/inline-enum-collector.ts +290 -0
  114. package/src/auto-type-generator/name-collision-validator.ts +119 -0
  115. package/src/auto-type-generator/naming-convention.ts +126 -0
  116. package/src/cli.ts +11 -0
  117. package/src/commands/gen.ts +141 -0
  118. package/src/commands/main.ts +5 -0
  119. package/src/config/define-config.ts +28 -0
  120. package/src/config/index.ts +7 -0
  121. package/src/config/types.ts +144 -0
  122. package/src/config-loader/index.ts +14 -0
  123. package/src/config-loader/loader.ts +143 -0
  124. package/src/config-loader/validator.ts +672 -0
  125. package/src/gen-orchestrator/hook-executor/hook-executor.ts +117 -0
  126. package/src/gen-orchestrator/orchestrator.ts +784 -0
  127. package/src/gen-orchestrator/reporter/diagnostic-reporter.ts +44 -0
  128. package/src/gen-orchestrator/reporter/progress-reporter.ts +61 -0
  129. package/src/gen-orchestrator/writer/file-writer.ts +38 -0
  130. package/src/index.ts +2 -0
  131. package/src/resolver-extractor/extract-resolvers.ts +63 -0
  132. package/src/resolver-extractor/extractor/define-api-extractor.ts +806 -0
  133. package/src/resolver-extractor/index.ts +19 -0
  134. package/src/resolver-extractor/validator/abstract-resolver-validator.ts +251 -0
  135. package/src/resolver-extractor/validator/only-validator.ts +158 -0
  136. package/src/schema-generator/builder/ast-builder.ts +706 -0
  137. package/src/schema-generator/emitter/code-emitter.ts +351 -0
  138. package/src/schema-generator/emitter/sdl-emitter.ts +13 -0
  139. package/src/schema-generator/generate-schema.ts +170 -0
  140. package/src/schema-generator/index.ts +19 -0
  141. package/src/schema-generator/integrator/result-integrator.ts +690 -0
  142. package/src/schema-generator/pruner/schema-pruner.ts +112 -0
  143. package/src/schema-generator/resolver-collector/resolver-collector.ts +123 -0
  144. package/src/shared/constants.ts +122 -0
  145. package/src/shared/default-value-detector.ts +172 -0
  146. package/src/shared/diagnostics.ts +35 -0
  147. package/src/shared/directive-definition-extractor.ts +564 -0
  148. package/src/shared/directive-detector.ts +556 -0
  149. package/src/shared/file-scanner.ts +170 -0
  150. package/src/shared/index.ts +32 -0
  151. package/src/shared/inline-object-extractor.ts +102 -0
  152. package/src/shared/inline-object-utils.ts +23 -0
  153. package/src/shared/interface-detector.ts +176 -0
  154. package/src/shared/interface-validator.ts +211 -0
  155. package/src/shared/metadata-detector.ts +443 -0
  156. package/src/shared/path-utils.ts +3 -0
  157. package/src/shared/program-factory.ts +51 -0
  158. package/src/shared/source-location.ts +27 -0
  159. package/src/shared/tsconfig-loader.ts +126 -0
  160. package/src/shared/tsdoc-parser.ts +155 -0
  161. package/src/shared/type-converter.ts +99 -0
  162. package/src/shared/typescript-utils.ts +246 -0
  163. package/src/type-extractor/collector/result-collector.ts +57 -0
  164. package/src/type-extractor/collector/scalar-collector.ts +254 -0
  165. package/src/type-extractor/converter/field-eligibility.ts +112 -0
  166. package/src/type-extractor/converter/graphql-converter.ts +459 -0
  167. package/src/type-extractor/extract-types.ts +1 -0
  168. package/src/type-extractor/extractor/field-type-resolver.ts +569 -0
  169. package/src/type-extractor/extractor/type-extractor.ts +1567 -0
  170. package/src/type-extractor/extractor/type-name-collector.ts +130 -0
  171. package/src/type-extractor/index.ts +20 -0
  172. package/src/type-extractor/mapper/scalar-base-type-mapper.ts +265 -0
  173. package/src/type-extractor/types/diagnostics.ts +99 -0
  174. package/src/type-extractor/types/graphql.ts +55 -0
  175. package/src/type-extractor/types/index.ts +37 -0
  176. package/src/type-extractor/types/ts-type-reference-factory.ts +137 -0
  177. package/src/type-extractor/types/typescript.ts +133 -0
  178. package/src/type-extractor/validator/type-validator.ts +77 -0
  179. package/dist/auto-type-generator/auto-type-generator.test.d.ts +0 -2
  180. package/dist/auto-type-generator/auto-type-generator.test.d.ts.map +0 -1
  181. package/dist/auto-type-generator/auto-type-generator.test.js +0 -613
  182. package/dist/auto-type-generator/auto-type-generator.test.js.map +0 -1
  183. package/dist/auto-type-generator/name-collision-validator.test.d.ts +0 -2
  184. package/dist/auto-type-generator/name-collision-validator.test.d.ts.map +0 -1
  185. package/dist/auto-type-generator/name-collision-validator.test.js +0 -358
  186. package/dist/auto-type-generator/name-collision-validator.test.js.map +0 -1
  187. package/dist/auto-type-generator/naming-convention.test.d.ts +0 -2
  188. package/dist/auto-type-generator/naming-convention.test.d.ts.map +0 -1
  189. package/dist/auto-type-generator/naming-convention.test.js +0 -132
  190. package/dist/auto-type-generator/naming-convention.test.js.map +0 -1
  191. package/dist/commands/gen.test.d.ts +0 -2
  192. package/dist/commands/gen.test.d.ts.map +0 -1
  193. package/dist/commands/gen.test.js +0 -226
  194. package/dist/commands/gen.test.js.map +0 -1
  195. package/dist/config-loader/loader.test.d.ts +0 -2
  196. package/dist/config-loader/loader.test.d.ts.map +0 -1
  197. package/dist/config-loader/loader.test.js +0 -123
  198. package/dist/config-loader/loader.test.js.map +0 -1
  199. package/dist/config-loader/validator.test.d.ts +0 -2
  200. package/dist/config-loader/validator.test.d.ts.map +0 -1
  201. package/dist/config-loader/validator.test.js +0 -846
  202. package/dist/config-loader/validator.test.js.map +0 -1
  203. package/dist/gen-orchestrator/golden.test.d.ts +0 -2
  204. package/dist/gen-orchestrator/golden.test.d.ts.map +0 -1
  205. package/dist/gen-orchestrator/golden.test.js +0 -102
  206. package/dist/gen-orchestrator/golden.test.js.map +0 -1
  207. package/dist/gen-orchestrator/hook-executor/hook-executor.test.d.ts +0 -2
  208. package/dist/gen-orchestrator/hook-executor/hook-executor.test.d.ts.map +0 -1
  209. package/dist/gen-orchestrator/hook-executor/hook-executor.test.js +0 -167
  210. package/dist/gen-orchestrator/hook-executor/hook-executor.test.js.map +0 -1
  211. package/dist/gen-orchestrator/reporter/progress-reporter.test.d.ts +0 -2
  212. package/dist/gen-orchestrator/reporter/progress-reporter.test.d.ts.map +0 -1
  213. package/dist/gen-orchestrator/reporter/progress-reporter.test.js +0 -74
  214. package/dist/gen-orchestrator/reporter/progress-reporter.test.js.map +0 -1
  215. package/dist/resolver-extractor/validator/only-validator.test.d.ts +0 -8
  216. package/dist/resolver-extractor/validator/only-validator.test.d.ts.map +0 -1
  217. package/dist/resolver-extractor/validator/only-validator.test.js +0 -352
  218. package/dist/resolver-extractor/validator/only-validator.test.js.map +0 -1
  219. package/dist/schema-generator/builder/ast-builder.test.d.ts +0 -2
  220. package/dist/schema-generator/builder/ast-builder.test.d.ts.map +0 -1
  221. package/dist/schema-generator/builder/ast-builder.test.js +0 -469
  222. package/dist/schema-generator/builder/ast-builder.test.js.map +0 -1
  223. package/dist/shared/file-scanner.test.d.ts +0 -2
  224. package/dist/shared/file-scanner.test.d.ts.map +0 -1
  225. package/dist/shared/file-scanner.test.js +0 -138
  226. package/dist/shared/file-scanner.test.js.map +0 -1
  227. package/dist/shared/interface-validator.test.d.ts +0 -2
  228. package/dist/shared/interface-validator.test.d.ts.map +0 -1
  229. package/dist/shared/interface-validator.test.js +0 -145
  230. package/dist/shared/interface-validator.test.js.map +0 -1
  231. package/dist/type-extractor/types/typescript.test.d.ts +0 -2
  232. package/dist/type-extractor/types/typescript.test.d.ts.map +0 -1
  233. package/dist/type-extractor/types/typescript.test.js +0 -287
  234. package/dist/type-extractor/types/typescript.test.js.map +0 -1
@@ -9,25 +9,9 @@ import { extractImplementsFromDefineInterface, extractImplementsFromGqlTypeDef,
9
9
  import { detectScalarMetadata } from "../../shared/metadata-detector.js";
10
10
  import { getSourceLocationFromNode, } from "../../shared/source-location.js";
11
11
  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
- }
12
+ import { extractPropertySymbols, filterNonNullTypeNodes, findEnumParentSymbol, findNonNullTypeNode, getNonNullableTypes, getTypeNameFromNode, hasUndefinedInType, isAnonymousObjectType, isBooleanUnion, isExported, isNullableUnion, isNullOrUndefined, shouldTreatIntersectionAsInline, } from "../../shared/typescript-utils.js";
13
+ import { createArrayType, createInlineObjectType, createLiteralType, createPrimitiveType, createReferenceType, createScalarType, createUnionType, } from "../types/index.js";
14
+ import { resolveFieldType } from "./field-type-resolver.js";
31
15
  function isDefaultExport(node, sourceFile) {
32
16
  let hasDefaultExport = false;
33
17
  const nodeName = node.name?.getText(sourceFile);
@@ -42,50 +26,32 @@ function isDefaultExport(node, sourceFile) {
42
26
  });
43
27
  return hasDefaultExport;
44
28
  }
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
29
  /**
53
30
  * Attempts to extract a type as an inline object, with cycle detection.
54
31
  * Returns a reference type if a cycle is detected, otherwise returns an inline object.
55
32
  */
56
- function tryExtractAsInlineObject(type, checker, globalTypeMappings, visitedTypes) {
33
+ function tryExtractAsInlineObject(type, ctx) {
34
+ const { checker, visitedTypes } = ctx;
57
35
  if (visitedTypes.has(type)) {
58
36
  const typeName = type.symbol?.getName() ?? "Object";
59
37
  return {
60
- tsType: {
61
- kind: "reference",
38
+ tsType: createReferenceType({
62
39
  name: typeName === "__type" ? "Object" : typeName,
63
- elementType: null,
64
- members: null,
65
40
  nullable: false,
66
- scalarInfo: null,
67
- inlineObjectProperties: null,
68
- },
41
+ }),
69
42
  };
70
43
  }
71
44
  visitedTypes.add(type);
72
- const inlineProperties = extractInlineObjectPropertiesShared(type, checker, (t, c) => convertTsTypeToReference(t, c, globalTypeMappings, visitedTypes).tsType);
45
+ const inlineProperties = extractInlineObjectPropertiesShared(type, checker, (t) => convertTsTypeToReference(t, ctx).tsType);
73
46
  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
- },
47
+ tsType: createInlineObjectType(inlineProperties),
83
48
  };
84
49
  }
85
50
  function findGlobalTypeMapping(typeName, globalTypeMappings) {
86
51
  return globalTypeMappings.find((m) => m.typeName === typeName);
87
52
  }
88
- function convertTsTypeToReference(type, checker, globalTypeMappings = [], visitedTypes = new WeakSet()) {
53
+ function convertTsTypeToReference(type, ctx, typeNode) {
54
+ const { checker, globalTypeMappings, knownTypeNames } = ctx;
89
55
  const metadataResult = detectScalarMetadata(type, checker);
90
56
  // Skip scalar detection if it's an array of scalars (e.g., Int[])
91
57
  // Array types should be handled by the array handling logic below
@@ -93,12 +59,8 @@ function convertTsTypeToReference(type, checker, globalTypeMappings = [], visite
93
59
  !metadataResult.isPrimitive &&
94
60
  !metadataResult.isList) {
95
61
  return {
96
- tsType: {
97
- kind: "scalar",
62
+ tsType: createScalarType({
98
63
  name: metadataResult.scalarName,
99
- elementType: null,
100
- members: null,
101
- nullable: metadataResult.nullable,
102
64
  scalarInfo: {
103
65
  scalarName: metadataResult.scalarName,
104
66
  typeName: metadataResult.scalarName,
@@ -106,22 +68,14 @@ function convertTsTypeToReference(type, checker, globalTypeMappings = [], visite
106
68
  isCustom: true,
107
69
  only: metadataResult.only,
108
70
  },
109
- inlineObjectProperties: null,
110
- },
71
+ nullable: metadataResult.nullable,
72
+ }),
111
73
  };
112
74
  }
113
75
  if (isBooleanUnion(type)) {
114
76
  const nullable = isNullableUnion(type);
115
77
  return {
116
- tsType: {
117
- kind: "primitive",
118
- name: "boolean",
119
- elementType: null,
120
- members: null,
121
- nullable,
122
- scalarInfo: null,
123
- inlineObjectProperties: null,
124
- },
78
+ tsType: createPrimitiveType({ name: "boolean", nullable }),
125
79
  };
126
80
  }
127
81
  if (type.isUnion()) {
@@ -131,15 +85,7 @@ function convertTsTypeToReference(type, checker, globalTypeMappings = [], visite
131
85
  if (aliasSymbol) {
132
86
  const name = aliasSymbol.getName();
133
87
  return {
134
- tsType: {
135
- kind: "reference",
136
- name,
137
- elementType: null,
138
- members: null,
139
- nullable,
140
- scalarInfo: null,
141
- inlineObjectProperties: null,
142
- },
88
+ tsType: createReferenceType({ name, nullable }),
143
89
  };
144
90
  }
145
91
  const nonNullTypes = getNonNullableTypes(type);
@@ -147,129 +93,72 @@ function convertTsTypeToReference(type, checker, globalTypeMappings = [], visite
147
93
  const enumParentSymbol = findEnumParentSymbol(nonNullTypes);
148
94
  if (enumParentSymbol) {
149
95
  return {
150
- tsType: {
151
- kind: "reference",
96
+ tsType: createReferenceType({
152
97
  name: enumParentSymbol.getName(),
153
- elementType: null,
154
- members: null,
155
98
  nullable,
156
- scalarInfo: null,
157
- inlineObjectProperties: null,
158
- },
99
+ }),
159
100
  };
160
101
  }
161
102
  if (nonNullTypes.length === 1) {
162
- const innerResult = convertTsTypeToReference(nonNullTypes[0], checker, globalTypeMappings, visitedTypes);
103
+ // For nullable types like User | null, extract the non-null type node
104
+ const nonNullTypeNode = typeNode && ts.isUnionTypeNode(typeNode)
105
+ ? findNonNullTypeNode(typeNode)
106
+ : undefined;
107
+ const innerResult = convertTsTypeToReference(nonNullTypes[0], ctx, nonNullTypeNode);
163
108
  return {
164
109
  tsType: { ...innerResult.tsType, nullable },
165
110
  };
166
111
  }
167
- const memberResults = nonNullTypes.map((t) => convertTsTypeToReference(t, checker, globalTypeMappings, visitedTypes));
112
+ const memberResults = nonNullTypes.map((t) => convertTsTypeToReference(t, ctx));
168
113
  return {
169
- tsType: {
170
- kind: "union",
171
- name: null,
172
- elementType: null,
114
+ tsType: createUnionType({
173
115
  members: memberResults.map((r) => r.tsType),
174
116
  nullable,
175
- scalarInfo: null,
176
- inlineObjectProperties: null,
177
- },
117
+ }),
178
118
  };
179
119
  }
180
120
  if (checker.isArrayType(type)) {
181
121
  const typeArgs = type.typeArguments;
182
122
  const elementType = typeArgs?.[0];
123
+ // Extract element type node from array type node (e.g., User[] -> User)
124
+ let elementTypeNode;
125
+ if (typeNode && ts.isArrayTypeNode(typeNode)) {
126
+ elementTypeNode = typeNode.elementType;
127
+ }
183
128
  const elementResult = elementType
184
- ? convertTsTypeToReference(elementType, checker, globalTypeMappings, visitedTypes)
129
+ ? convertTsTypeToReference(elementType, ctx, elementTypeNode)
185
130
  : {
186
- tsType: {
187
- kind: "primitive",
188
- name: "unknown",
189
- elementType: null,
190
- members: null,
191
- nullable: false,
192
- scalarInfo: null,
193
- inlineObjectProperties: null,
194
- },
131
+ tsType: createPrimitiveType({ name: "unknown", nullable: false }),
195
132
  };
196
133
  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
- },
134
+ tsType: createArrayType(elementResult.tsType),
206
135
  };
207
136
  }
208
137
  const typeString = checker.typeToString(type);
209
138
  if (type.flags & ts.TypeFlags.String) {
210
139
  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
- },
140
+ tsType: createPrimitiveType({ name: "string", nullable: false }),
220
141
  };
221
142
  }
222
143
  if (type.flags & ts.TypeFlags.Number) {
223
144
  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
- },
145
+ tsType: createPrimitiveType({ name: "number", nullable: false }),
233
146
  };
234
147
  }
235
148
  if (type.flags & ts.TypeFlags.Boolean ||
236
149
  type.flags & ts.TypeFlags.BooleanLiteral) {
237
150
  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
- },
151
+ tsType: createPrimitiveType({ name: "boolean", nullable: false }),
247
152
  };
248
153
  }
249
154
  if (type.flags & ts.TypeFlags.StringLiteral) {
250
155
  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
- },
156
+ tsType: createLiteralType(typeString.replace(/"/g, "")),
260
157
  };
261
158
  }
262
159
  if (type.flags & ts.TypeFlags.NumberLiteral) {
263
160
  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
- },
161
+ tsType: createLiteralType(typeString),
273
162
  };
274
163
  }
275
164
  // Handle intersection types that should be treated as inline objects
@@ -281,31 +170,43 @@ function convertTsTypeToReference(type, checker, globalTypeMappings = [], visite
281
170
  if (type.aliasSymbol) {
282
171
  const aliasName = type.aliasSymbol.getName();
283
172
  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
- },
173
+ tsType: createReferenceType({ name: aliasName, nullable: false }),
293
174
  };
294
175
  }
295
176
  const shouldTreatAsInline = shouldTreatIntersectionAsInline(type);
296
177
  if (shouldTreatAsInline) {
297
- return tryExtractAsInlineObject(type, checker, globalTypeMappings, visitedTypes);
178
+ return tryExtractAsInlineObject(type, ctx);
298
179
  }
299
180
  }
300
181
  if (isInlineObjectType(type)) {
301
- return tryExtractAsInlineObject(type, checker, globalTypeMappings, visitedTypes);
182
+ // Check if typeNode references a known type (schema-defined type)
183
+ if (typeNode && ts.isTypeReferenceNode(typeNode)) {
184
+ const typeName = getTypeNameFromNode(typeNode);
185
+ if (typeName && knownTypeNames.has(typeName)) {
186
+ return {
187
+ tsType: createReferenceType({ name: typeName, nullable: false }),
188
+ };
189
+ }
190
+ }
191
+ return tryExtractAsInlineObject(type, ctx);
302
192
  }
303
193
  // Check for utility types (Omit, Pick, Partial, Required, etc.)
304
194
  // These create mapped types that should be treated as inline objects
305
195
  if (type.flags & ts.TypeFlags.Object) {
306
196
  const objectType = type;
307
197
  if (objectType.objectFlags & ts.ObjectFlags.Mapped) {
308
- return tryExtractAsInlineObject(type, checker, globalTypeMappings, visitedTypes);
198
+ // Check if typeNode references a known type (schema-defined type).
199
+ // This handles Simplify<T> = { [K in keyof T]: T[K] } & {} pattern.
200
+ if (typeNode && ts.isTypeReferenceNode(typeNode)) {
201
+ const typeName = getTypeNameFromNode(typeNode);
202
+ // Only use typeNode name if it's in knownTypeNames (schema-defined type)
203
+ if (typeName && knownTypeNames.has(typeName)) {
204
+ return {
205
+ tsType: createReferenceType({ name: typeName, nullable: false }),
206
+ };
207
+ }
208
+ }
209
+ return tryExtractAsInlineObject(type, ctx);
309
210
  }
310
211
  }
311
212
  if (type.symbol) {
@@ -315,12 +216,8 @@ function convertTsTypeToReference(type, checker, globalTypeMappings = [], visite
315
216
  const globalMapping = findGlobalTypeMapping(symbolName, globalTypeMappings);
316
217
  if (globalMapping) {
317
218
  return {
318
- tsType: {
319
- kind: "scalar",
219
+ tsType: createScalarType({
320
220
  name: globalMapping.scalarName,
321
- elementType: null,
322
- members: null,
323
- nullable: false,
324
221
  scalarInfo: {
325
222
  scalarName: globalMapping.scalarName,
326
223
  typeName: globalMapping.typeName,
@@ -328,36 +225,21 @@ function convertTsTypeToReference(type, checker, globalTypeMappings = [], visite
328
225
  isCustom: true,
329
226
  only: globalMapping.only,
330
227
  },
331
- inlineObjectProperties: null,
332
- },
228
+ nullable: false,
229
+ }),
333
230
  };
334
231
  }
335
232
  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
- },
233
+ tsType: createReferenceType({ name: symbolName, nullable: false }),
345
234
  };
346
235
  }
347
236
  }
348
237
  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
- },
238
+ tsType: createReferenceType({ name: typeString, nullable: false }),
358
239
  };
359
240
  }
360
- function extractFieldsFromType(type, checker, globalTypeMappings = []) {
241
+ function extractFieldsFromType(params) {
242
+ const { type, checker, globalTypeMappings, knownTypeNames, knownTypeSymbols, underlyingSymbolToTypeName, sourceFiles, scalarMappingTable, scalarMappingContext, } = params;
361
243
  const fields = [];
362
244
  const diagnostics = [];
363
245
  const properties = extractPropertySymbols(type, checker);
@@ -408,11 +290,27 @@ function extractFieldsFromType(type, checker, globalTypeMappings = []) {
408
290
  directiveNullable = true;
409
291
  }
410
292
  }
411
- const typeResult = convertTsTypeToReference(actualPropType, checker, globalTypeMappings);
293
+ // Get typeNode from property declaration to preserve type alias names
294
+ let propTypeNode;
295
+ if (declaration &&
296
+ (ts.isPropertySignature(declaration) ||
297
+ ts.isPropertyDeclaration(declaration))) {
298
+ propTypeNode = declaration.type;
299
+ }
300
+ const resolvedType = resolveFieldType(actualPropType, propTypeNode, {
301
+ checker,
302
+ knownTypeNames,
303
+ knownTypeSymbols,
304
+ underlyingSymbolToTypeName,
305
+ globalTypeMappings,
306
+ sourceFiles,
307
+ scalarMappingTable,
308
+ scalarMappingContext,
309
+ });
412
310
  // Preserve nullability from original WithDirectives type
413
- const tsType = directiveNullable && !typeResult.tsType.nullable
414
- ? { ...typeResult.tsType, nullable: true }
415
- : typeResult.tsType;
311
+ const tsType = directiveNullable && !resolvedType.nullable
312
+ ? { ...resolvedType, nullable: true }
313
+ : resolvedType;
416
314
  fields.push({
417
315
  name: propName,
418
316
  tsType,
@@ -567,12 +465,12 @@ function extractStringLiteralUnionMembers(type, checker) {
567
465
  }
568
466
  return members;
569
467
  }
570
- function determineTypeKind(node, type, sourceFile) {
468
+ function determineTypeKind(node, type, checker) {
571
469
  if (ts.isInterfaceDeclaration(node)) {
572
470
  return "interface";
573
471
  }
574
472
  if (ts.isTypeAliasDeclaration(node)) {
575
- if (isDefineInterfaceTypeAlias(node, sourceFile)) {
473
+ if (isDefineInterfaceTypeAlias(node, checker)) {
576
474
  return "graphqlInterface";
577
475
  }
578
476
  const unionKind = determineTypeKindFromUnion(type);
@@ -633,7 +531,7 @@ function createGenericTypeDiagnostic(declaration, exportedName, location) {
633
531
  return null;
634
532
  }
635
533
  function processReexportedSymbol(params) {
636
- const { exportedName, resolvedSymbol, type, location, filePath, checker, globalTypeMappings, scannedSourceFiles, } = params;
534
+ const { exportedName, resolvedSymbol, type, location, filePath, checker, globalTypeMappings, knownTypeNames, knownTypeSymbols, underlyingSymbolToTypeName, scannedSourceFiles, scalarMappingTable, scalarMappingContext, } = params;
637
535
  const diagnostics = [];
638
536
  const scalarMetadataResult = detectScalarMetadata(type, checker);
639
537
  if (scalarMetadataResult.scalarName && !scalarMetadataResult.isPrimitive) {
@@ -710,10 +608,26 @@ function processReexportedSymbol(params) {
710
608
  skip: false,
711
609
  };
712
610
  }
713
- const unionMembers = extractUnionMembers(type);
611
+ // Get typeNode for union member extraction from declaration
612
+ const reexportDeclarations = resolvedSymbol.getDeclarations();
613
+ const reexportDeclaration = reexportDeclarations?.[0];
614
+ const reexportTypeNode = reexportDeclaration && ts.isTypeAliasDeclaration(reexportDeclaration)
615
+ ? reexportDeclaration.type
616
+ : undefined;
617
+ const unionMembers = extractUnionMembers(type, reexportTypeNode);
714
618
  const fieldResult = kind === "union"
715
619
  ? { fields: [], diagnostics: [] }
716
- : extractFieldsFromType(type, checker, globalTypeMappings);
620
+ : extractFieldsFromType({
621
+ type,
622
+ checker,
623
+ globalTypeMappings,
624
+ knownTypeNames,
625
+ knownTypeSymbols,
626
+ underlyingSymbolToTypeName,
627
+ sourceFiles: scannedSourceFiles,
628
+ scalarMappingTable,
629
+ scalarMappingContext,
630
+ });
717
631
  diagnostics.push(...fieldResult.diagnostics);
718
632
  return {
719
633
  typeInfo: {
@@ -730,7 +644,7 @@ function processReexportedSymbol(params) {
730
644
  skip: false,
731
645
  };
732
646
  }
733
- function processExportDeclaration(node, sourceFile, filePath, checker, globalTypeMappings, scannedSourceFiles) {
647
+ function processExportDeclaration(node, sourceFile, filePath, checker, globalTypeMappings, knownTypeNames, knownTypeSymbols, underlyingSymbolToTypeName, scannedSourceFiles, scalarMappingTable) {
734
648
  const types = [];
735
649
  const diagnostics = [];
736
650
  const detectedScalarNames = [];
@@ -802,7 +716,12 @@ function processExportDeclaration(node, sourceFile, filePath, checker, globalTyp
802
716
  filePath,
803
717
  checker,
804
718
  globalTypeMappings,
719
+ knownTypeNames,
720
+ knownTypeSymbols,
721
+ underlyingSymbolToTypeName,
805
722
  scannedSourceFiles,
723
+ scalarMappingTable,
724
+ scalarMappingContext: exportedName.endsWith("Input") ? "input" : "output",
806
725
  });
807
726
  if (result.skip)
808
727
  continue;
@@ -826,7 +745,8 @@ function getNamedTypeName(memberType) {
826
745
  // For regular types, use symbol
827
746
  return memberType.symbol?.getName() ?? "";
828
747
  }
829
- function extractInlineObjectMembers(type, checker, globalTypeMappings = []) {
748
+ function extractInlineObjectMembers(params) {
749
+ const { type, checker, globalTypeMappings, knownTypeNames } = params;
830
750
  if (!type.isUnion()) {
831
751
  return null;
832
752
  }
@@ -839,6 +759,12 @@ function extractInlineObjectMembers(type, checker, globalTypeMappings = []) {
839
759
  let hasInlineObjects = false;
840
760
  let hasNamedTypes = false;
841
761
  const members = [];
762
+ const ctx = {
763
+ checker,
764
+ globalTypeMappings,
765
+ knownTypeNames,
766
+ visitedTypes: new WeakSet(),
767
+ };
842
768
  for (const memberType of nonNullTypes) {
843
769
  if (isAnonymousObjectType(memberType)) {
844
770
  hasInlineObjects = true;
@@ -847,7 +773,7 @@ function extractInlineObjectMembers(type, checker, globalTypeMappings = []) {
847
773
  for (const prop of properties) {
848
774
  const propType = checker.getTypeOfSymbol(prop);
849
775
  const tsdocInfo = extractTsDocFromSymbol(prop, checker);
850
- const typeResult = convertTsTypeToReference(propType, checker, globalTypeMappings);
776
+ const typeResult = convertTsTypeToReference(propType, ctx);
851
777
  memberProperties.push({
852
778
  propertyName: prop.getName(),
853
779
  propertyType: typeResult.tsType,
@@ -863,7 +789,7 @@ function extractInlineObjectMembers(type, checker, globalTypeMappings = []) {
863
789
  }
864
790
  return { members, hasInlineObjects, hasNamedTypes };
865
791
  }
866
- function extractUnionMembers(type) {
792
+ function extractUnionMembers(type, typeNode) {
867
793
  if (!type.isUnion()) {
868
794
  return undefined;
869
795
  }
@@ -872,9 +798,28 @@ function extractUnionMembers(type) {
872
798
  (t.flags & ts.TypeFlags.Intersection) !== 0 ||
873
799
  t.symbol !== undefined);
874
800
  if (nonNullTypes.length > 1 && allObjectTypes) {
801
+ // Extract member type nodes from union type node if available
802
+ const memberTypeNodes = typeNode && ts.isUnionTypeNode(typeNode)
803
+ ? filterNonNullTypeNodes(typeNode)
804
+ : [];
875
805
  const namedMembers = nonNullTypes
876
- .filter((t) => !isAnonymousObjectType(t))
877
- .map((t) => getNamedTypeName(t))
806
+ .map((t, index) => {
807
+ // First try to get name from type
808
+ if (!isAnonymousObjectType(t)) {
809
+ const name = getNamedTypeName(t);
810
+ if (name !== "" && name !== "__type") {
811
+ return name;
812
+ }
813
+ }
814
+ // Fallback to typeNode name for Simplify<T> pattern
815
+ if (memberTypeNodes[index]) {
816
+ const memberNode = memberTypeNodes[index];
817
+ if (ts.isTypeReferenceNode(memberNode)) {
818
+ return getTypeNameFromNode(memberNode) ?? "";
819
+ }
820
+ }
821
+ return "";
822
+ })
878
823
  .filter((name) => name !== "" && name !== "__type");
879
824
  if (namedMembers.length > 0) {
880
825
  return namedMembers.sort();
@@ -882,13 +827,13 @@ function extractUnionMembers(type) {
882
827
  }
883
828
  return undefined;
884
829
  }
885
- export function extractTypesFromProgram(program, sourceFiles, options = {}) {
830
+ export function extractTypesFromProgram(program, sourceFiles, options) {
886
831
  const checker = program.getTypeChecker();
887
832
  const types = [];
888
833
  const diagnostics = [];
889
834
  const detectedScalarNames = new Set();
890
835
  const detectedScalars = [];
891
- const globalTypeMappings = options.globalTypeMappings ?? [];
836
+ const { globalTypeMappings, knownTypeNames, knownTypeSymbols, underlyingSymbolToTypeName, scalarMappingTable, } = options;
892
837
  const scannedSourceFilesSet = new Set(sourceFiles);
893
838
  for (const filePath of sourceFiles) {
894
839
  const sourceFile = program.getSourceFile(filePath);
@@ -1009,9 +954,18 @@ export function extractTypesFromProgram(program, sourceFiles, options = {}) {
1009
954
  }
1010
955
  actualType = type;
1011
956
  }
1012
- const kind = determineTypeKind(node, actualType, sourceFile);
1013
- const unionMembers = extractUnionMembers(actualType);
1014
- const inlineObjectResult = extractInlineObjectMembers(actualType, checker, globalTypeMappings);
957
+ const kind = determineTypeKind(node, actualType, checker);
958
+ // Get typeNode for union member extraction (only for type aliases)
959
+ const typeAliasTypeNode = ts.isTypeAliasDeclaration(node)
960
+ ? node.type
961
+ : undefined;
962
+ const unionMembers = extractUnionMembers(actualType, typeAliasTypeNode);
963
+ const inlineObjectResult = extractInlineObjectMembers({
964
+ type: actualType,
965
+ checker,
966
+ globalTypeMappings,
967
+ knownTypeNames,
968
+ });
1015
969
  const tsdocInfo = extractTsDocInfo(node, checker);
1016
970
  let implementedInterfaces = null;
1017
971
  if (ts.isTypeAliasDeclaration(node)) {
@@ -1052,7 +1006,19 @@ export function extractTypesFromProgram(program, sourceFiles, options = {}) {
1052
1006
  }
1053
1007
  const fieldResult = kind === "union"
1054
1008
  ? { fields: [], diagnostics: [] }
1055
- : extractFieldsFromType(actualType, checker, globalTypeMappings);
1009
+ : extractFieldsFromType({
1010
+ type: actualType,
1011
+ checker,
1012
+ globalTypeMappings,
1013
+ knownTypeNames,
1014
+ knownTypeSymbols,
1015
+ underlyingSymbolToTypeName,
1016
+ sourceFiles: scannedSourceFilesSet,
1017
+ scalarMappingTable,
1018
+ scalarMappingContext: name.endsWith("Input")
1019
+ ? "input"
1020
+ : "output",
1021
+ });
1056
1022
  const fields = fieldResult.fields;
1057
1023
  diagnostics.push(...fieldResult.diagnostics);
1058
1024
  if (name.endsWith("Input") && kind === "union") {
@@ -1096,7 +1062,7 @@ export function extractTypesFromProgram(program, sourceFiles, options = {}) {
1096
1062
  types.push(typeInfo);
1097
1063
  }
1098
1064
  if (ts.isExportDeclaration(node)) {
1099
- const result = processExportDeclaration(node, sourceFile, filePath, checker, globalTypeMappings, scannedSourceFilesSet);
1065
+ const result = processExportDeclaration(node, sourceFile, filePath, checker, globalTypeMappings, knownTypeNames, knownTypeSymbols, underlyingSymbolToTypeName, scannedSourceFilesSet, scalarMappingTable);
1100
1066
  types.push(...result.types);
1101
1067
  diagnostics.push(...result.diagnostics);
1102
1068
  for (const scalarName of result.detectedScalarNames) {