@gqlkit-ts/cli 0.2.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 (190) hide show
  1. package/dist/auto-type-generator/auto-type-generator.d.ts +10 -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 +640 -133
  4. package/dist/auto-type-generator/auto-type-generator.js.map +1 -1
  5. package/dist/auto-type-generator/index.d.ts +8 -1
  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 +13 -5
  10. package/dist/auto-type-generator/inline-enum-collector.d.ts.map +1 -1
  11. package/dist/auto-type-generator/inline-enum-collector.js +107 -71
  12. package/dist/auto-type-generator/inline-enum-collector.js.map +1 -1
  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 +18 -1
  30. package/dist/auto-type-generator/naming-convention.d.ts.map +1 -1
  31. package/dist/auto-type-generator/naming-convention.js +16 -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 +13 -6
  65. package/dist/gen-orchestrator/orchestrator.js.map +1 -1
  66. package/dist/resolver-extractor/extract-resolvers.d.ts +19 -1
  67. package/dist/resolver-extractor/extract-resolvers.d.ts.map +1 -1
  68. package/dist/resolver-extractor/extractor/define-api-extractor.d.ts +5 -0
  69. package/dist/resolver-extractor/extractor/define-api-extractor.d.ts.map +1 -1
  70. package/dist/resolver-extractor/extractor/define-api-extractor.js +14 -61
  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.map +1 -1
  79. package/dist/schema-generator/emitter/code-emitter.js +20 -0
  80. package/dist/schema-generator/emitter/code-emitter.js.map +1 -1
  81. package/dist/schema-generator/generate-schema.d.ts +1 -0
  82. package/dist/schema-generator/generate-schema.d.ts.map +1 -1
  83. package/dist/schema-generator/generate-schema.js +72 -3
  84. package/dist/schema-generator/generate-schema.js.map +1 -1
  85. package/dist/schema-generator/integrator/result-integrator.d.ts +14 -2
  86. package/dist/schema-generator/integrator/result-integrator.d.ts.map +1 -1
  87. package/dist/schema-generator/integrator/result-integrator.js +54 -1
  88. package/dist/schema-generator/integrator/result-integrator.js.map +1 -1
  89. package/dist/schema-generator/resolver-collector/resolver-collector.d.ts +2 -0
  90. package/dist/schema-generator/resolver-collector/resolver-collector.d.ts.map +1 -1
  91. package/dist/schema-generator/resolver-collector/resolver-collector.js +22 -0
  92. package/dist/schema-generator/resolver-collector/resolver-collector.js.map +1 -1
  93. package/dist/shared/enum-prefix-detector.d.ts +63 -0
  94. package/dist/shared/enum-prefix-detector.d.ts.map +1 -0
  95. package/dist/shared/enum-prefix-detector.js +80 -0
  96. package/dist/shared/enum-prefix-detector.js.map +1 -0
  97. package/dist/shared/ignore-fields-detector.d.ts +26 -0
  98. package/dist/shared/ignore-fields-detector.d.ts.map +1 -0
  99. package/dist/shared/ignore-fields-detector.js +83 -0
  100. package/dist/shared/ignore-fields-detector.js.map +1 -0
  101. package/dist/shared/ignore-fields-validator.d.ts +29 -0
  102. package/dist/shared/ignore-fields-validator.d.ts.map +1 -0
  103. package/dist/shared/ignore-fields-validator.js +43 -0
  104. package/dist/shared/ignore-fields-validator.js.map +1 -0
  105. package/dist/shared/index.d.ts +2 -0
  106. package/dist/shared/index.d.ts.map +1 -1
  107. package/dist/shared/index.js.map +1 -1
  108. package/dist/shared/source-location.d.ts +5 -0
  109. package/dist/shared/source-location.d.ts.map +1 -1
  110. package/dist/shared/source-location.js +7 -0
  111. package/dist/shared/source-location.js.map +1 -1
  112. package/dist/type-extractor/converter/graphql-converter.d.ts.map +1 -1
  113. package/dist/type-extractor/converter/graphql-converter.js +21 -7
  114. package/dist/type-extractor/converter/graphql-converter.js.map +1 -1
  115. package/dist/type-extractor/extractor/field-type-resolver.js +42 -3
  116. package/dist/type-extractor/extractor/field-type-resolver.js.map +1 -1
  117. package/dist/type-extractor/extractor/type-extractor.d.ts.map +1 -1
  118. package/dist/type-extractor/extractor/type-extractor.js +88 -23
  119. package/dist/type-extractor/extractor/type-extractor.js.map +1 -1
  120. package/dist/type-extractor/types/diagnostics.d.ts +1 -1
  121. package/dist/type-extractor/types/diagnostics.d.ts.map +1 -1
  122. package/dist/type-extractor/types/ts-type-reference-factory.d.ts +10 -2
  123. package/dist/type-extractor/types/ts-type-reference-factory.d.ts.map +1 -1
  124. package/dist/type-extractor/types/ts-type-reference-factory.js +8 -2
  125. package/dist/type-extractor/types/ts-type-reference-factory.js.map +1 -1
  126. package/dist/type-extractor/types/typescript.d.ts +4 -0
  127. package/dist/type-extractor/types/typescript.d.ts.map +1 -1
  128. package/docs/coding-agents.md +64 -0
  129. package/docs/configuration.md +6 -20
  130. package/docs/getting-started.md +15 -12
  131. package/docs/index.md +36 -22
  132. package/docs/integration/apollo.md +8 -40
  133. package/docs/integration/drizzle.md +6 -10
  134. package/docs/integration/prisma.md +196 -0
  135. package/docs/integration/yoga.md +8 -40
  136. package/docs/schema/abstract-resolvers.md +117 -0
  137. package/docs/schema/directives.md +5 -0
  138. package/docs/schema/documentation.md +5 -0
  139. package/docs/schema/enums.md +99 -0
  140. package/docs/schema/fields.md +64 -0
  141. package/docs/schema/index.md +21 -0
  142. package/docs/schema/inputs.md +115 -15
  143. package/docs/schema/interfaces.md +31 -1
  144. package/docs/schema/objects.md +40 -0
  145. package/docs/schema/queries-mutations.md +136 -22
  146. package/docs/schema/scalars.md +5 -0
  147. package/docs/schema/unions.md +208 -1
  148. package/docs/what-is-gqlkit.md +13 -8
  149. package/package.json +6 -4
  150. package/src/auto-type-generator/auto-type-generator.ts +946 -201
  151. package/src/auto-type-generator/index.ts +42 -0
  152. package/src/auto-type-generator/inline-enum-collector.ts +187 -139
  153. package/src/auto-type-generator/inline-object-traverser.ts +49 -0
  154. package/src/auto-type-generator/inline-union-collector.ts +402 -0
  155. package/src/auto-type-generator/inline-union-types.ts +33 -0
  156. package/src/auto-type-generator/inline-union-validator.ts +482 -0
  157. package/src/auto-type-generator/naming-convention.ts +38 -1
  158. package/src/auto-type-generator/resolve-type-generator.ts +21 -0
  159. package/src/auto-type-generator/resolver-field-iterator.ts +39 -0
  160. package/src/auto-type-generator/typename-extractor.ts +230 -0
  161. package/src/auto-type-generator/typename-resolve-type-generator.ts +281 -0
  162. package/src/auto-type-generator/typename-types.ts +66 -0
  163. package/src/auto-type-generator/typename-validator.ts +326 -0
  164. package/src/cli.ts +2 -0
  165. package/src/commands/docs.ts +211 -0
  166. package/src/gen-orchestrator/orchestrator.ts +20 -6
  167. package/src/resolver-extractor/extract-resolvers.ts +19 -0
  168. package/src/resolver-extractor/extractor/define-api-extractor.ts +23 -89
  169. package/src/resolver-extractor/index.ts +0 -6
  170. package/src/resolver-extractor/validator/abstract-resolver-validator.ts +16 -8
  171. package/src/schema-generator/emitter/code-emitter.ts +34 -0
  172. package/src/schema-generator/generate-schema.ts +99 -2
  173. package/src/schema-generator/integrator/result-integrator.ts +70 -1
  174. package/src/schema-generator/resolver-collector/resolver-collector.ts +34 -0
  175. package/src/shared/enum-prefix-detector.ts +99 -0
  176. package/src/shared/ignore-fields-detector.ts +109 -0
  177. package/src/shared/ignore-fields-validator.ts +66 -0
  178. package/src/shared/index.ts +2 -0
  179. package/src/shared/source-location.ts +11 -0
  180. package/src/type-extractor/converter/graphql-converter.ts +31 -7
  181. package/src/type-extractor/extractor/field-type-resolver.ts +48 -3
  182. package/src/type-extractor/extractor/type-extractor.ts +103 -26
  183. package/src/type-extractor/types/diagnostics.ts +12 -2
  184. package/src/type-extractor/types/ts-type-reference-factory.ts +18 -5
  185. package/src/type-extractor/types/typescript.ts +4 -0
  186. package/dist/resolver-extractor/validator/only-validator.d.ts +0 -61
  187. package/dist/resolver-extractor/validator/only-validator.d.ts.map +0 -1
  188. package/dist/resolver-extractor/validator/only-validator.js +0 -76
  189. package/dist/resolver-extractor/validator/only-validator.js.map +0 -1
  190. package/src/resolver-extractor/validator/only-validator.ts +0 -158
@@ -7,6 +7,15 @@ export {
7
7
  type GeneratedFromInfo,
8
8
  generateAutoTypes,
9
9
  } from "./auto-type-generator.js";
10
+ export type {
11
+ InlineUnionMemberInfo,
12
+ InlineUnionWithContext,
13
+ } from "./inline-union-types.js";
14
+ export type {
15
+ ValidateOneOfMembersParams,
16
+ ValidateUnionMembersParams,
17
+ ValidateUnionResult,
18
+ } from "./inline-union-validator.js";
10
19
  export {
11
20
  type NameCollisionValidatorInput,
12
21
  type NameCollisionValidatorResult,
@@ -18,4 +27,37 @@ export type {
18
27
  InputFieldContext,
19
28
  ObjectFieldContext,
20
29
  ResolverArgContext,
30
+ ResolverPayloadContext,
21
31
  } from "./naming-convention.js";
32
+ export type {
33
+ AutoGeneratedResolveType,
34
+ ResolveTypeFieldPattern,
35
+ } from "./resolve-type-generator.js";
36
+ export {
37
+ type CollectTypenameExtractionsParams,
38
+ collectTypenameExtractions,
39
+ type ExtractTypenamesParams,
40
+ type MemberTypenameInfo,
41
+ type TypenameExtractionResult,
42
+ } from "./typename-extractor.js";
43
+ export {
44
+ type CollectTypenameResolveTypesParams,
45
+ type CollectTypenameResolveTypesResult,
46
+ collectTypenameResolveTypes,
47
+ type GeneratedInlineObjectType,
48
+ type ResolveTypePattern,
49
+ type TypenameAutoResolveTypeInfo,
50
+ } from "./typename-resolve-type-generator.js";
51
+ export type {
52
+ TypenameFieldInfo,
53
+ TypenameFieldName,
54
+ TypenameFieldNameSet,
55
+ } from "./typename-types.js";
56
+ export {
57
+ type ValidateSchemaTypenamesParams,
58
+ type ValidateSchemaTypenamesResult,
59
+ type ValidateTypenamesParams,
60
+ type ValidateTypenamesResult,
61
+ validateSchemaTypenames,
62
+ validateTypenames,
63
+ } from "./typename-validator.js";
@@ -1,8 +1,6 @@
1
1
  import type ts from "typescript";
2
- import type {
3
- ExtractResolversResult,
4
- GraphQLFieldDefinition,
5
- } from "../resolver-extractor/index.js";
2
+ import type { ExtractResolversResult } from "../resolver-extractor/index.js";
3
+ import { getSourceLocationOrDefault } from "../shared/source-location.js";
6
4
  import type { DeprecationInfo } from "../shared/tsdoc-parser.js";
7
5
  import type {
8
6
  ExtractedTypeInfo,
@@ -11,10 +9,17 @@ import type {
11
9
  InlineObjectPropertyDef,
12
10
  SourceLocation,
13
11
  } from "../type-extractor/types/index.js";
12
+ import { traverseInlineObjectProperties } from "./inline-object-traverser.js";
14
13
  import {
15
14
  type AutoTypeNameContext,
16
15
  buildFieldContext,
16
+ isInputTypeName,
17
17
  } from "./naming-convention.js";
18
+ import {
19
+ forEachResolverField,
20
+ type ResolverFieldInfo,
21
+ type ResolverType,
22
+ } from "./resolver-field-iterator.js";
18
23
 
19
24
  /**
20
25
  * Inline enum with context information for naming and generation.
@@ -32,13 +37,8 @@ export interface InlineEnumWithContext {
32
37
  readonly externalEnumDeprecated: DeprecationInfo | null;
33
38
  }
34
39
 
35
- function isInputTypeName(name: string): boolean {
36
- return name.endsWith("Input");
37
- }
38
-
39
40
  /**
40
- * Collect inline enums from ExtractedTypeInfo.
41
- * Task 4.1: Traverse type fields to find inline enums with context.
41
+ * Collect inline enums from ExtractedTypeInfo by traversing type fields.
42
42
  */
43
43
  export function collectInlineEnumsFromTypes(
44
44
  extractedTypes: ReadonlyArray<ExtractedTypeInfo>,
@@ -78,11 +78,10 @@ function collectInlineEnumsFromField(
78
78
  results.push({
79
79
  members: tsType.inlineEnumMembers,
80
80
  context: buildFieldContext(parentTypeName, fieldPath, isInput),
81
- sourceLocation: field.sourceLocation ?? {
82
- file: sourceFile,
83
- line: 1,
84
- column: 1,
85
- },
81
+ sourceLocation: getSourceLocationOrDefault(
82
+ field.sourceLocation,
83
+ sourceFile,
84
+ ),
86
85
  nullable: tsType.nullable,
87
86
  externalEnumSymbol: tsType.externalEnumSymbol,
88
87
  externalEnumDescription: tsType.externalEnumDescription,
@@ -98,11 +97,10 @@ function collectInlineEnumsFromField(
98
97
  results.push({
99
98
  members: tsType.elementType.inlineEnumMembers,
100
99
  context: buildFieldContext(parentTypeName, fieldPath, isInput),
101
- sourceLocation: field.sourceLocation ?? {
102
- file: sourceFile,
103
- line: 1,
104
- column: 1,
105
- },
100
+ sourceLocation: getSourceLocationOrDefault(
101
+ field.sourceLocation,
102
+ sourceFile,
103
+ ),
106
104
  nullable: tsType.elementType.nullable,
107
105
  externalEnumSymbol: tsType.elementType.externalEnumSymbol,
108
106
  externalEnumDescription: tsType.elementType.externalEnumDescription,
@@ -111,95 +109,54 @@ function collectInlineEnumsFromField(
111
109
  }
112
110
 
113
111
  if (tsType.kind === "inlineObject" && tsType.inlineObjectProperties) {
114
- collectInlineEnumsFromInlineObjectProperties(
115
- tsType.inlineObjectProperties,
116
- parentTypeName,
117
- fieldPath,
118
- isInput,
119
- sourceFile,
120
- results,
112
+ traverseInlineObjectProperties(
113
+ { properties: tsType.inlineObjectProperties, parentPath: fieldPath },
114
+ (prop, propPath) => {
115
+ const propTsType = prop.tsType;
116
+ if (propTsType.kind === "inlineEnum" && propTsType.inlineEnumMembers) {
117
+ results.push({
118
+ members: propTsType.inlineEnumMembers,
119
+ context: buildFieldContext(parentTypeName, propPath, isInput),
120
+ sourceLocation: getSourceLocationOrDefault(
121
+ prop.sourceLocation,
122
+ sourceFile,
123
+ ),
124
+ nullable: propTsType.nullable,
125
+ externalEnumSymbol: propTsType.externalEnumSymbol,
126
+ externalEnumDescription: propTsType.externalEnumDescription,
127
+ externalEnumDeprecated: propTsType.externalEnumDeprecated,
128
+ });
129
+ }
130
+ },
121
131
  );
122
132
  }
123
133
  }
124
134
 
125
- function collectInlineEnumsFromInlineObjectProperties(
126
- properties: ReadonlyArray<InlineObjectPropertyDef>,
127
- parentTypeName: string,
128
- parentPath: ReadonlyArray<string>,
129
- isInput: boolean,
130
- sourceFile: string,
131
- results: InlineEnumWithContext[],
132
- ): void {
133
- for (const prop of properties) {
134
- const propPath = [...parentPath, prop.name];
135
- const tsType = prop.tsType;
136
-
137
- if (tsType.kind === "inlineEnum" && tsType.inlineEnumMembers) {
138
- results.push({
139
- members: tsType.inlineEnumMembers,
140
- context: buildFieldContext(parentTypeName, propPath, isInput),
141
- sourceLocation: prop.sourceLocation ?? {
142
- file: sourceFile,
143
- line: 1,
144
- column: 1,
145
- },
146
- nullable: tsType.nullable,
147
- externalEnumSymbol: tsType.externalEnumSymbol,
148
- externalEnumDescription: tsType.externalEnumDescription,
149
- externalEnumDeprecated: tsType.externalEnumDeprecated,
150
- });
151
- }
152
-
153
- if (tsType.kind === "inlineObject" && tsType.inlineObjectProperties) {
154
- collectInlineEnumsFromInlineObjectProperties(
155
- tsType.inlineObjectProperties,
156
- parentTypeName,
157
- propPath,
158
- isInput,
159
- sourceFile,
160
- results,
161
- );
162
- }
163
- }
135
+ export interface CollectInlineEnumsFromResolversParams {
136
+ readonly resolversResult: ExtractResolversResult;
164
137
  }
165
138
 
166
139
  /**
167
- * Collect inline enums from ExtractResolversResult.
168
- * Task 4.2: Traverse resolver args to find inline enums with context.
140
+ * Collect inline enums from ExtractResolversResult by traversing resolver args.
169
141
  */
170
142
  export function collectInlineEnumsFromResolvers(
171
- resolversResult: ExtractResolversResult,
143
+ params: CollectInlineEnumsFromResolversParams,
172
144
  ): InlineEnumWithContext[] {
145
+ const { resolversResult } = params;
173
146
  const results: InlineEnumWithContext[] = [];
174
147
 
175
- for (const field of resolversResult.queryFields.fields) {
176
- collectInlineEnumsFromResolverArgs(field, "query", null, results);
177
- }
178
-
179
- for (const field of resolversResult.mutationFields.fields) {
180
- collectInlineEnumsFromResolverArgs(field, "mutation", null, results);
181
- }
182
-
183
- for (const ext of resolversResult.typeExtensions) {
184
- for (const field of ext.fields) {
185
- collectInlineEnumsFromResolverArgs(
186
- field,
187
- "field",
188
- ext.targetTypeName,
189
- results,
190
- );
191
- }
192
- }
148
+ forEachResolverField(resolversResult, (info) => {
149
+ collectInlineEnumsFromResolverArgs(info, results);
150
+ });
193
151
 
194
152
  return results;
195
153
  }
196
154
 
197
155
  function collectInlineEnumsFromResolverArgs(
198
- field: GraphQLFieldDefinition,
199
- resolverType: "query" | "mutation" | "field",
200
- parentTypeName: string | null,
156
+ info: ResolverFieldInfo,
201
157
  results: InlineEnumWithContext[],
202
158
  ): void {
159
+ const { field, resolverType, parentTypeName } = info;
203
160
  if (!field.args) return;
204
161
 
205
162
  for (const arg of field.args) {
@@ -225,66 +182,157 @@ function collectInlineEnumsFromResolverArgs(
225
182
  }
226
183
 
227
184
  if (arg.inlineObjectProperties) {
228
- collectInlineEnumsFromInlineObjectArg(
229
- arg.inlineObjectProperties,
185
+ collectInlineEnumsFromResolverProperties({
186
+ properties: arg.inlineObjectProperties,
230
187
  resolverType,
231
- field.name,
232
- arg.name,
188
+ fieldName: field.name,
233
189
  parentTypeName,
234
- [],
235
- field.sourceLocation,
190
+ parentPath: [],
191
+ sourceLocation: field.sourceLocation,
192
+ contextKind: "resolverArg",
193
+ argName: arg.name,
236
194
  results,
237
- );
195
+ });
238
196
  }
239
197
  }
240
198
  }
241
199
 
242
- function collectInlineEnumsFromInlineObjectArg(
243
- properties: ReadonlyArray<InlineObjectPropertyDef>,
244
- resolverType: "query" | "mutation" | "field",
245
- fieldName: string,
246
- argName: string,
247
- parentTypeName: string | null,
248
- parentPath: ReadonlyArray<string>,
249
- sourceLocation: SourceLocation,
200
+ interface CollectInlineEnumsFromResolverPropertiesBaseParams {
201
+ readonly properties: ReadonlyArray<InlineObjectPropertyDef>;
202
+ readonly resolverType: ResolverType;
203
+ readonly fieldName: string;
204
+ readonly parentTypeName: string | null;
205
+ readonly parentPath: ReadonlyArray<string>;
206
+ readonly sourceLocation: SourceLocation;
207
+ readonly results: InlineEnumWithContext[];
208
+ }
209
+
210
+ interface CollectInlineEnumsFromResolverArgPropertiesParams
211
+ extends CollectInlineEnumsFromResolverPropertiesBaseParams {
212
+ readonly contextKind: "resolverArg";
213
+ readonly argName: string;
214
+ }
215
+
216
+ interface CollectInlineEnumsFromResolverPayloadPropertiesParams
217
+ extends CollectInlineEnumsFromResolverPropertiesBaseParams {
218
+ readonly contextKind: "resolverPayload";
219
+ }
220
+
221
+ type CollectInlineEnumsFromResolverPropertiesParams =
222
+ | CollectInlineEnumsFromResolverArgPropertiesParams
223
+ | CollectInlineEnumsFromResolverPayloadPropertiesParams;
224
+
225
+ /**
226
+ * Unified function for collecting inline enums from nested object properties
227
+ * in both resolver args and payload return types.
228
+ */
229
+ function collectInlineEnumsFromResolverProperties(
230
+ params: CollectInlineEnumsFromResolverPropertiesParams,
231
+ ): void {
232
+ const {
233
+ properties,
234
+ resolverType,
235
+ fieldName,
236
+ parentTypeName,
237
+ parentPath,
238
+ sourceLocation,
239
+ results,
240
+ } = params;
241
+
242
+ traverseInlineObjectProperties(
243
+ { properties, parentPath },
244
+ (prop, propPath) => {
245
+ const tsType = prop.tsType;
246
+
247
+ if (tsType.kind === "inlineEnum" && tsType.inlineEnumMembers) {
248
+ const context: AutoTypeNameContext =
249
+ params.contextKind === "resolverArg"
250
+ ? {
251
+ kind: "resolverArg",
252
+ resolverType,
253
+ fieldName,
254
+ argName: params.argName,
255
+ parentTypeName,
256
+ fieldPath: propPath,
257
+ }
258
+ : {
259
+ kind: "resolverPayload",
260
+ resolverType,
261
+ fieldName,
262
+ parentTypeName,
263
+ fieldPath: propPath,
264
+ };
265
+
266
+ results.push({
267
+ members: tsType.inlineEnumMembers,
268
+ context,
269
+ sourceLocation: prop.sourceLocation ?? sourceLocation,
270
+ nullable: tsType.nullable,
271
+ externalEnumSymbol: tsType.externalEnumSymbol,
272
+ externalEnumDescription: tsType.externalEnumDescription,
273
+ externalEnumDeprecated: tsType.externalEnumDeprecated,
274
+ });
275
+ }
276
+ },
277
+ );
278
+ }
279
+
280
+ export interface CollectInlineEnumsFromPayloadsParams {
281
+ readonly resolversResult: ExtractResolversResult;
282
+ }
283
+
284
+ /**
285
+ * Collect inline enums from resolver return types (Payload types).
286
+ */
287
+ export function collectInlineEnumsFromPayloads(
288
+ params: CollectInlineEnumsFromPayloadsParams,
289
+ ): InlineEnumWithContext[] {
290
+ const { resolversResult } = params;
291
+ const results: InlineEnumWithContext[] = [];
292
+
293
+ forEachResolverField(resolversResult, (info) => {
294
+ collectInlineEnumsFromPayloadReturnType(info, results);
295
+ });
296
+
297
+ return results;
298
+ }
299
+
300
+ function collectInlineEnumsFromPayloadReturnType(
301
+ info: ResolverFieldInfo,
250
302
  results: InlineEnumWithContext[],
251
303
  ): void {
252
- for (const prop of properties) {
253
- const propPath = [...parentPath, prop.name];
254
- const tsType = prop.tsType;
304
+ const { field, resolverType, parentTypeName } = info;
255
305
 
256
- if (tsType.kind === "inlineEnum" && tsType.inlineEnumMembers) {
257
- const context: AutoTypeNameContext = {
258
- kind: "resolverArg",
259
- resolverType,
260
- fieldName,
261
- argName,
262
- parentTypeName,
263
- fieldPath: propPath,
264
- };
306
+ if (field.returnTypeInlineEnumMembers) {
307
+ const context: AutoTypeNameContext = {
308
+ kind: "resolverPayload",
309
+ resolverType,
310
+ fieldName: field.name,
311
+ parentTypeName,
312
+ fieldPath: [],
313
+ };
265
314
 
266
- results.push({
267
- members: tsType.inlineEnumMembers,
268
- context,
269
- sourceLocation: prop.sourceLocation ?? sourceLocation,
270
- nullable: tsType.nullable,
271
- externalEnumSymbol: tsType.externalEnumSymbol,
272
- externalEnumDescription: tsType.externalEnumDescription,
273
- externalEnumDeprecated: tsType.externalEnumDeprecated,
274
- });
275
- }
315
+ results.push({
316
+ members: field.returnTypeInlineEnumMembers,
317
+ context,
318
+ sourceLocation: field.sourceLocation,
319
+ nullable: field.type.nullable,
320
+ externalEnumSymbol: field.returnTypeExternalEnumSymbol,
321
+ externalEnumDescription: field.returnTypeExternalEnumDescription,
322
+ externalEnumDeprecated: field.returnTypeExternalEnumDeprecated,
323
+ });
324
+ }
276
325
 
277
- if (tsType.kind === "inlineObject" && tsType.inlineObjectProperties) {
278
- collectInlineEnumsFromInlineObjectArg(
279
- tsType.inlineObjectProperties,
280
- resolverType,
281
- fieldName,
282
- argName,
283
- parentTypeName,
284
- propPath,
285
- sourceLocation,
286
- results,
287
- );
288
- }
326
+ if (field.returnTypeInlineObjectProperties) {
327
+ collectInlineEnumsFromResolverProperties({
328
+ properties: field.returnTypeInlineObjectProperties,
329
+ resolverType,
330
+ fieldName: field.name,
331
+ parentTypeName,
332
+ parentPath: [],
333
+ sourceLocation: field.sourceLocation,
334
+ contextKind: "resolverPayload",
335
+ results,
336
+ });
289
337
  }
290
338
  }
@@ -0,0 +1,49 @@
1
+ import type { InlineObjectPropertyDef } from "../type-extractor/types/index.js";
2
+
3
+ /**
4
+ * Visitor callback for each property in an inline object hierarchy.
5
+ * @param prop The property being visited
6
+ * @param propPath Full path from the root to this property (including the property name)
7
+ */
8
+ export type PropertyVisitor = (
9
+ prop: InlineObjectPropertyDef,
10
+ propPath: ReadonlyArray<string>,
11
+ ) => void;
12
+
13
+ export interface TraverseInlineObjectPropertiesParams {
14
+ readonly properties: ReadonlyArray<InlineObjectPropertyDef>;
15
+ readonly parentPath: ReadonlyArray<string>;
16
+ }
17
+
18
+ /**
19
+ * Traverses inline object properties recursively, calling the visitor for each property.
20
+ * Handles nested inlineObject properties automatically.
21
+ *
22
+ * This utility eliminates the duplicated traversal logic in inline-enum-collector
23
+ * and inline-union-collector.
24
+ */
25
+ export function traverseInlineObjectProperties(
26
+ params: TraverseInlineObjectPropertiesParams,
27
+ visitor: PropertyVisitor,
28
+ ): void {
29
+ const { properties, parentPath } = params;
30
+
31
+ for (const prop of properties) {
32
+ const propPath = [...parentPath, prop.name];
33
+
34
+ visitor(prop, propPath);
35
+
36
+ if (
37
+ prop.tsType.kind === "inlineObject" &&
38
+ prop.tsType.inlineObjectProperties
39
+ ) {
40
+ traverseInlineObjectProperties(
41
+ {
42
+ properties: prop.tsType.inlineObjectProperties,
43
+ parentPath: propPath,
44
+ },
45
+ visitor,
46
+ );
47
+ }
48
+ }
49
+ }