@gqlkit-ts/cli 0.2.0 → 0.4.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 (235) hide show
  1. package/README.md +143 -0
  2. package/dist/auto-type-generator/auto-type-generator.d.ts +10 -4
  3. package/dist/auto-type-generator/auto-type-generator.d.ts.map +1 -1
  4. package/dist/auto-type-generator/auto-type-generator.js +656 -146
  5. package/dist/auto-type-generator/auto-type-generator.js.map +1 -1
  6. package/dist/auto-type-generator/index.d.ts +8 -1
  7. package/dist/auto-type-generator/index.d.ts.map +1 -1
  8. package/dist/auto-type-generator/index.js +3 -0
  9. package/dist/auto-type-generator/index.js.map +1 -1
  10. package/dist/auto-type-generator/inline-enum-collector.d.ts +13 -5
  11. package/dist/auto-type-generator/inline-enum-collector.d.ts.map +1 -1
  12. package/dist/auto-type-generator/inline-enum-collector.js +107 -71
  13. package/dist/auto-type-generator/inline-enum-collector.js.map +1 -1
  14. package/dist/auto-type-generator/inline-object-traverser.d.ts +20 -0
  15. package/dist/auto-type-generator/inline-object-traverser.d.ts.map +1 -0
  16. package/dist/auto-type-generator/inline-object-traverser.js +22 -0
  17. package/dist/auto-type-generator/inline-object-traverser.js.map +1 -0
  18. package/dist/auto-type-generator/inline-union-collector.d.ts +29 -0
  19. package/dist/auto-type-generator/inline-union-collector.d.ts.map +1 -0
  20. package/dist/auto-type-generator/inline-union-collector.js +216 -0
  21. package/dist/auto-type-generator/inline-union-collector.js.map +1 -0
  22. package/dist/auto-type-generator/inline-union-types.d.ts +29 -0
  23. package/dist/auto-type-generator/inline-union-types.d.ts.map +1 -0
  24. package/dist/auto-type-generator/inline-union-types.js +2 -0
  25. package/dist/auto-type-generator/inline-union-types.js.map +1 -0
  26. package/dist/auto-type-generator/inline-union-validator.d.ts +76 -0
  27. package/dist/auto-type-generator/inline-union-validator.d.ts.map +1 -0
  28. package/dist/auto-type-generator/inline-union-validator.js +329 -0
  29. package/dist/auto-type-generator/inline-union-validator.js.map +1 -0
  30. package/dist/auto-type-generator/naming-convention.d.ts +18 -1
  31. package/dist/auto-type-generator/naming-convention.d.ts.map +1 -1
  32. package/dist/auto-type-generator/naming-convention.js +16 -0
  33. package/dist/auto-type-generator/naming-convention.js.map +1 -1
  34. package/dist/auto-type-generator/resolve-type-generator.d.ts +20 -0
  35. package/dist/auto-type-generator/resolve-type-generator.d.ts.map +1 -0
  36. package/dist/auto-type-generator/resolve-type-generator.js +2 -0
  37. package/dist/auto-type-generator/resolve-type-generator.js.map +1 -0
  38. package/dist/auto-type-generator/resolver-field-iterator.d.ts +13 -0
  39. package/dist/auto-type-generator/resolver-field-iterator.d.ts.map +1 -0
  40. package/dist/auto-type-generator/resolver-field-iterator.js +22 -0
  41. package/dist/auto-type-generator/resolver-field-iterator.js.map +1 -0
  42. package/dist/auto-type-generator/typename-extractor.d.ts +26 -0
  43. package/dist/auto-type-generator/typename-extractor.d.ts.map +1 -0
  44. package/dist/auto-type-generator/typename-extractor.js +142 -0
  45. package/dist/auto-type-generator/typename-extractor.js.map +1 -0
  46. package/dist/auto-type-generator/typename-resolve-type-generator.d.ts +35 -0
  47. package/dist/auto-type-generator/typename-resolve-type-generator.d.ts.map +1 -0
  48. package/dist/auto-type-generator/typename-resolve-type-generator.js +177 -0
  49. package/dist/auto-type-generator/typename-resolve-type-generator.js.map +1 -0
  50. package/dist/auto-type-generator/typename-types.d.ts +43 -0
  51. package/dist/auto-type-generator/typename-types.d.ts.map +1 -0
  52. package/dist/auto-type-generator/typename-types.js +37 -0
  53. package/dist/auto-type-generator/typename-types.js.map +1 -0
  54. package/dist/auto-type-generator/typename-validator.d.ts +37 -0
  55. package/dist/auto-type-generator/typename-validator.d.ts.map +1 -0
  56. package/dist/auto-type-generator/typename-validator.js +206 -0
  57. package/dist/auto-type-generator/typename-validator.js.map +1 -0
  58. package/dist/cli.js +2 -0
  59. package/dist/cli.js.map +1 -1
  60. package/dist/commands/docs.d.ts +51 -0
  61. package/dist/commands/docs.d.ts.map +1 -0
  62. package/dist/commands/docs.js +154 -0
  63. package/dist/commands/docs.js.map +1 -0
  64. package/dist/config/types.d.ts +13 -0
  65. package/dist/config/types.d.ts.map +1 -1
  66. package/dist/config-loader/loader.d.ts +3 -0
  67. package/dist/config-loader/loader.d.ts.map +1 -1
  68. package/dist/config-loader/loader.js +1 -0
  69. package/dist/config-loader/loader.js.map +1 -1
  70. package/dist/config-loader/validator.d.ts.map +1 -1
  71. package/dist/config-loader/validator.js +23 -0
  72. package/dist/config-loader/validator.js.map +1 -1
  73. package/dist/gen-orchestrator/orchestrator.d.ts.map +1 -1
  74. package/dist/gen-orchestrator/orchestrator.js +32 -12
  75. package/dist/gen-orchestrator/orchestrator.js.map +1 -1
  76. package/dist/resolver-extractor/extract-resolvers.d.ts +19 -1
  77. package/dist/resolver-extractor/extract-resolvers.d.ts.map +1 -1
  78. package/dist/resolver-extractor/extractor/define-api-extractor.d.ts +5 -0
  79. package/dist/resolver-extractor/extractor/define-api-extractor.d.ts.map +1 -1
  80. package/dist/resolver-extractor/extractor/define-api-extractor.js +18 -65
  81. package/dist/resolver-extractor/extractor/define-api-extractor.js.map +1 -1
  82. package/dist/resolver-extractor/index.d.ts +0 -1
  83. package/dist/resolver-extractor/index.d.ts.map +1 -1
  84. package/dist/resolver-extractor/validator/abstract-resolver-validator.d.ts +1 -0
  85. package/dist/resolver-extractor/validator/abstract-resolver-validator.d.ts.map +1 -1
  86. package/dist/resolver-extractor/validator/abstract-resolver-validator.js +9 -5
  87. package/dist/resolver-extractor/validator/abstract-resolver-validator.js.map +1 -1
  88. package/dist/schema-generator/builder/ast-builder.d.ts +2 -2
  89. package/dist/schema-generator/builder/ast-builder.d.ts.map +1 -1
  90. package/dist/schema-generator/builder/ast-builder.js +12 -34
  91. package/dist/schema-generator/builder/ast-builder.js.map +1 -1
  92. package/dist/schema-generator/emitter/code-emitter.d.ts +3 -1
  93. package/dist/schema-generator/emitter/code-emitter.d.ts.map +1 -1
  94. package/dist/schema-generator/emitter/code-emitter.js +42 -12
  95. package/dist/schema-generator/emitter/code-emitter.js.map +1 -1
  96. package/dist/schema-generator/emitter/sdl-emitter.d.ts +0 -4
  97. package/dist/schema-generator/emitter/sdl-emitter.d.ts.map +1 -1
  98. package/dist/schema-generator/emitter/sdl-emitter.js +0 -4
  99. package/dist/schema-generator/emitter/sdl-emitter.js.map +1 -1
  100. package/dist/schema-generator/generate-schema.d.ts +3 -0
  101. package/dist/schema-generator/generate-schema.d.ts.map +1 -1
  102. package/dist/schema-generator/generate-schema.js +83 -5
  103. package/dist/schema-generator/generate-schema.js.map +1 -1
  104. package/dist/schema-generator/integrator/result-integrator.d.ts +19 -9
  105. package/dist/schema-generator/integrator/result-integrator.d.ts.map +1 -1
  106. package/dist/schema-generator/integrator/result-integrator.js +60 -44
  107. package/dist/schema-generator/integrator/result-integrator.js.map +1 -1
  108. package/dist/schema-generator/resolver-collector/resolver-collector.d.ts +2 -0
  109. package/dist/schema-generator/resolver-collector/resolver-collector.d.ts.map +1 -1
  110. package/dist/schema-generator/resolver-collector/resolver-collector.js +22 -0
  111. package/dist/schema-generator/resolver-collector/resolver-collector.js.map +1 -1
  112. package/dist/shared/branded-type-detector.d.ts +43 -0
  113. package/dist/shared/branded-type-detector.d.ts.map +1 -0
  114. package/dist/shared/branded-type-detector.js +146 -0
  115. package/dist/shared/branded-type-detector.js.map +1 -0
  116. package/dist/shared/enum-prefix-detector.d.ts +63 -0
  117. package/dist/shared/enum-prefix-detector.d.ts.map +1 -0
  118. package/dist/shared/enum-prefix-detector.js +80 -0
  119. package/dist/shared/enum-prefix-detector.js.map +1 -0
  120. package/dist/shared/ignore-fields-detector.d.ts +26 -0
  121. package/dist/shared/ignore-fields-detector.d.ts.map +1 -0
  122. package/dist/shared/ignore-fields-detector.js +83 -0
  123. package/dist/shared/ignore-fields-detector.js.map +1 -0
  124. package/dist/shared/ignore-fields-validator.d.ts +29 -0
  125. package/dist/shared/ignore-fields-validator.d.ts.map +1 -0
  126. package/dist/shared/ignore-fields-validator.js +43 -0
  127. package/dist/shared/ignore-fields-validator.js.map +1 -0
  128. package/dist/shared/index.d.ts +2 -0
  129. package/dist/shared/index.d.ts.map +1 -1
  130. package/dist/shared/index.js.map +1 -1
  131. package/dist/shared/source-location.d.ts +5 -0
  132. package/dist/shared/source-location.d.ts.map +1 -1
  133. package/dist/shared/source-location.js +7 -0
  134. package/dist/shared/source-location.js.map +1 -1
  135. package/dist/shared/string-utils.d.ts +2 -0
  136. package/dist/shared/string-utils.d.ts.map +1 -0
  137. package/dist/shared/string-utils.js +8 -0
  138. package/dist/shared/string-utils.js.map +1 -0
  139. package/dist/type-extractor/converter/field-eligibility.d.ts +8 -6
  140. package/dist/type-extractor/converter/field-eligibility.d.ts.map +1 -1
  141. package/dist/type-extractor/converter/field-eligibility.js +7 -28
  142. package/dist/type-extractor/converter/field-eligibility.js.map +1 -1
  143. package/dist/type-extractor/converter/graphql-converter.d.ts.map +1 -1
  144. package/dist/type-extractor/converter/graphql-converter.js +27 -18
  145. package/dist/type-extractor/converter/graphql-converter.js.map +1 -1
  146. package/dist/type-extractor/extractor/field-type-resolver.d.ts.map +1 -1
  147. package/dist/type-extractor/extractor/field-type-resolver.js +81 -7
  148. package/dist/type-extractor/extractor/field-type-resolver.js.map +1 -1
  149. package/dist/type-extractor/extractor/type-extractor.d.ts.map +1 -1
  150. package/dist/type-extractor/extractor/type-extractor.js +88 -23
  151. package/dist/type-extractor/extractor/type-extractor.js.map +1 -1
  152. package/dist/type-extractor/types/diagnostics.d.ts +1 -1
  153. package/dist/type-extractor/types/diagnostics.d.ts.map +1 -1
  154. package/dist/type-extractor/types/ts-type-reference-factory.d.ts +10 -2
  155. package/dist/type-extractor/types/ts-type-reference-factory.d.ts.map +1 -1
  156. package/dist/type-extractor/types/ts-type-reference-factory.js +8 -2
  157. package/dist/type-extractor/types/ts-type-reference-factory.js.map +1 -1
  158. package/dist/type-extractor/types/typescript.d.ts +4 -0
  159. package/dist/type-extractor/types/typescript.d.ts.map +1 -1
  160. package/dist/type-extractor/validator/type-validator.d.ts +1 -1
  161. package/dist/type-extractor/validator/type-validator.d.ts.map +1 -1
  162. package/dist/type-extractor/validator/type-validator.js +2 -10
  163. package/dist/type-extractor/validator/type-validator.js.map +1 -1
  164. package/docs/coding-agents.md +64 -0
  165. package/docs/configuration.md +15 -20
  166. package/docs/getting-started.md +15 -12
  167. package/docs/index.md +36 -22
  168. package/docs/integration/apollo.md +8 -40
  169. package/docs/integration/drizzle.md +6 -10
  170. package/docs/integration/prisma.md +196 -0
  171. package/docs/integration/yoga.md +8 -40
  172. package/docs/schema/abstract-resolvers.md +117 -0
  173. package/docs/schema/directives.md +5 -0
  174. package/docs/schema/documentation.md +5 -0
  175. package/docs/schema/enums.md +99 -0
  176. package/docs/schema/fields.md +64 -0
  177. package/docs/schema/index.md +21 -0
  178. package/docs/schema/inputs.md +115 -15
  179. package/docs/schema/interfaces.md +31 -1
  180. package/docs/schema/objects.md +40 -0
  181. package/docs/schema/queries-mutations.md +136 -22
  182. package/docs/schema/scalars.md +5 -0
  183. package/docs/schema/unions.md +208 -1
  184. package/docs/what-is-gqlkit.md +13 -8
  185. package/package.json +6 -4
  186. package/src/auto-type-generator/auto-type-generator.ts +969 -227
  187. package/src/auto-type-generator/index.ts +42 -0
  188. package/src/auto-type-generator/inline-enum-collector.ts +187 -139
  189. package/src/auto-type-generator/inline-object-traverser.ts +49 -0
  190. package/src/auto-type-generator/inline-union-collector.ts +402 -0
  191. package/src/auto-type-generator/inline-union-types.ts +33 -0
  192. package/src/auto-type-generator/inline-union-validator.ts +482 -0
  193. package/src/auto-type-generator/naming-convention.ts +38 -1
  194. package/src/auto-type-generator/resolve-type-generator.ts +21 -0
  195. package/src/auto-type-generator/resolver-field-iterator.ts +39 -0
  196. package/src/auto-type-generator/typename-extractor.ts +230 -0
  197. package/src/auto-type-generator/typename-resolve-type-generator.ts +281 -0
  198. package/src/auto-type-generator/typename-types.ts +66 -0
  199. package/src/auto-type-generator/typename-validator.ts +326 -0
  200. package/src/cli.ts +2 -0
  201. package/src/commands/docs.ts +211 -0
  202. package/src/config/types.ts +15 -0
  203. package/src/config-loader/loader.ts +4 -0
  204. package/src/config-loader/validator.ts +33 -0
  205. package/src/gen-orchestrator/orchestrator.ts +50 -17
  206. package/src/resolver-extractor/extract-resolvers.ts +19 -0
  207. package/src/resolver-extractor/extractor/define-api-extractor.ts +28 -94
  208. package/src/resolver-extractor/index.ts +0 -6
  209. package/src/resolver-extractor/validator/abstract-resolver-validator.ts +16 -8
  210. package/src/schema-generator/builder/ast-builder.ts +52 -81
  211. package/src/schema-generator/emitter/code-emitter.ts +82 -11
  212. package/src/schema-generator/emitter/sdl-emitter.ts +0 -4
  213. package/src/schema-generator/generate-schema.ts +109 -14
  214. package/src/schema-generator/integrator/result-integrator.ts +91 -63
  215. package/src/schema-generator/resolver-collector/resolver-collector.ts +34 -0
  216. package/src/shared/branded-type-detector.ts +182 -0
  217. package/src/shared/enum-prefix-detector.ts +99 -0
  218. package/src/shared/ignore-fields-detector.ts +109 -0
  219. package/src/shared/ignore-fields-validator.ts +66 -0
  220. package/src/shared/index.ts +2 -0
  221. package/src/shared/source-location.ts +11 -0
  222. package/src/shared/string-utils.ts +7 -0
  223. package/src/type-extractor/converter/field-eligibility.ts +13 -29
  224. package/src/type-extractor/converter/graphql-converter.ts +37 -23
  225. package/src/type-extractor/extractor/field-type-resolver.ts +97 -7
  226. package/src/type-extractor/extractor/type-extractor.ts +103 -26
  227. package/src/type-extractor/types/diagnostics.ts +13 -2
  228. package/src/type-extractor/types/ts-type-reference-factory.ts +18 -5
  229. package/src/type-extractor/types/typescript.ts +4 -0
  230. package/src/type-extractor/validator/type-validator.ts +2 -15
  231. package/dist/resolver-extractor/validator/only-validator.d.ts +0 -61
  232. package/dist/resolver-extractor/validator/only-validator.d.ts.map +0 -1
  233. package/dist/resolver-extractor/validator/only-validator.js +0 -76
  234. package/dist/resolver-extractor/validator/only-validator.js.map +0 -1
  235. package/src/resolver-extractor/validator/only-validator.ts +0 -158
@@ -91,6 +91,12 @@ interface ResolversResult {
91
91
  diagnostics: Diagnostics;
92
92
  }
93
93
 
94
+ interface ScalarConfig {
95
+ readonly customScalarNames: string[];
96
+ readonly globalTypeMappings: GlobalTypeMapping[];
97
+ readonly configScalars: ConfigScalarMapping[];
98
+ }
99
+
94
100
  interface PipelineContext {
95
101
  readonly config: GenerationConfig;
96
102
  readonly sourceFiles: ReadonlyArray<string>;
@@ -101,6 +107,7 @@ interface PipelineContext {
101
107
  readonly typesResult: TypesResult | null;
102
108
  readonly resolversResult: ResolversResult | null;
103
109
  readonly directiveDefinitions: DirectiveDefinitionInfo[] | null;
110
+ readonly scalarConfig: ScalarConfig | null;
104
111
  readonly diagnostics: Diagnostic[];
105
112
  readonly aborted: boolean;
106
113
  }
@@ -262,6 +269,8 @@ function convertArgsToInputValues(
262
269
  externalEnumSymbol: arg.tsType.externalEnumSymbol ?? null,
263
270
  externalEnumDescription: arg.tsType.externalEnumDescription ?? null,
264
271
  externalEnumDeprecated: arg.tsType.externalEnumDeprecated ?? null,
272
+ inlineUnionMembers:
273
+ arg.tsType.kind === "union" ? (arg.tsType.members ?? null) : null,
265
274
  }));
266
275
  }
267
276
 
@@ -277,19 +286,30 @@ function convertDefineApiToFields(
277
286
  const typeExtensionMap = new Map<string, GraphQLFieldDefinition[]>();
278
287
 
279
288
  for (const resolver of resolvers) {
289
+ const returnType = resolver.returnType;
280
290
  const fieldDef: GraphQLFieldDefinition = {
281
291
  name: resolver.fieldName,
282
- type: convertTsTypeToGraphQLType(resolver.returnType),
292
+ type: convertTsTypeToGraphQLType(returnType),
283
293
  args: resolver.args ? convertArgsToInputValues(resolver.args) : null,
284
- sourceLocation: {
285
- file: resolver.sourceFile,
286
- line: 1,
287
- column: 1,
288
- },
294
+ sourceLocation: resolver.sourceLocation,
289
295
  resolverExportName: resolver.fieldName,
290
296
  description: resolver.description,
291
297
  deprecated: resolver.deprecated,
292
298
  directives: resolver.directives,
299
+ returnTypeInlineObjectProperties:
300
+ returnType.inlineObjectProperties ?? null,
301
+ returnTypeInlineObjectDescription:
302
+ returnType.inlineObjectDescription ?? null,
303
+ returnTypeInlineObjectDeprecated:
304
+ returnType.inlineObjectDeprecated ?? null,
305
+ returnTypeInlineEnumMembers: returnType.inlineEnumMembers ?? null,
306
+ returnTypeInlineUnionMembers:
307
+ returnType.kind === "union" ? (returnType.members ?? null) : null,
308
+ returnTypeExternalEnumSymbol: returnType.externalEnumSymbol ?? null,
309
+ returnTypeExternalEnumDescription:
310
+ returnType.externalEnumDescription ?? null,
311
+ returnTypeExternalEnumDeprecated:
312
+ returnType.externalEnumDeprecated ?? null,
293
313
  };
294
314
 
295
315
  if (resolver.resolverType === "query") {
@@ -436,6 +456,7 @@ function createInitialContext(config: GenerationConfig): PipelineContext {
436
456
  typesResult: null,
437
457
  resolversResult: null,
438
458
  directiveDefinitions: null,
459
+ scalarConfig: null,
439
460
  diagnostics: [],
440
461
  aborted: false,
441
462
  };
@@ -501,11 +522,7 @@ function collectTypeNamesStep(ctx: PipelineContext): PipelineContext {
501
522
  };
502
523
  }
503
524
 
504
- function prepareScalarConfig(config: GenerationConfig): {
505
- customScalarNames: string[];
506
- globalTypeMappings: GlobalTypeMapping[];
507
- configScalars: ConfigScalarMapping[];
508
- } {
525
+ function prepareScalarConfig(config: GenerationConfig): ScalarConfig {
509
526
  const customScalarNames =
510
527
  config.customScalars?.map((s) => s.graphqlName) ?? [];
511
528
 
@@ -543,18 +560,25 @@ function prepareScalarConfig(config: GenerationConfig): {
543
560
  return { customScalarNames, globalTypeMappings, configScalars };
544
561
  }
545
562
 
563
+ function prepareScalarConfigStep(ctx: PipelineContext): PipelineContext {
564
+ if (ctx.aborted) return ctx;
565
+
566
+ return { ...ctx, scalarConfig: prepareScalarConfig(ctx.config) };
567
+ }
568
+
546
569
  function extractTypesStep(ctx: PipelineContext): PipelineContext {
547
570
  if (
548
571
  ctx.aborted ||
549
572
  !ctx.program ||
550
573
  !ctx.knownTypeNames ||
551
574
  !ctx.knownTypeSymbols ||
552
- !ctx.underlyingSymbolToTypeName
575
+ !ctx.underlyingSymbolToTypeName ||
576
+ !ctx.scalarConfig
553
577
  )
554
578
  return ctx;
555
579
 
556
580
  const { customScalarNames, globalTypeMappings, configScalars } =
557
- prepareScalarConfig(ctx.config);
581
+ ctx.scalarConfig;
558
582
 
559
583
  const typesResult = extractTypesCore({
560
584
  program: ctx.program,
@@ -578,11 +602,12 @@ function extractResolversStep(ctx: PipelineContext): PipelineContext {
578
602
  !ctx.knownTypeNames ||
579
603
  !ctx.knownTypeSymbols ||
580
604
  !ctx.underlyingSymbolToTypeName ||
581
- !ctx.typesResult
605
+ !ctx.typesResult ||
606
+ !ctx.scalarConfig
582
607
  )
583
608
  return ctx;
584
609
 
585
- const { globalTypeMappings } = prepareScalarConfig(ctx.config);
610
+ const { globalTypeMappings } = ctx.scalarConfig;
586
611
 
587
612
  const resolversResult = extractResolversCore({
588
613
  program: ctx.program,
@@ -650,11 +675,16 @@ function generateSchemaStep(ctx: PipelineContext): {
650
675
  ctx: PipelineContext;
651
676
  schemaResult: ReturnType<typeof generateSchema> | null;
652
677
  } {
653
- if (ctx.aborted || !ctx.typesResult || !ctx.resolversResult) {
678
+ if (
679
+ ctx.aborted ||
680
+ !ctx.typesResult ||
681
+ !ctx.resolversResult ||
682
+ !ctx.scalarConfig
683
+ ) {
654
684
  return { ctx, schemaResult: null };
655
685
  }
656
686
 
657
- const { customScalarNames } = prepareScalarConfig(ctx.config);
687
+ const { customScalarNames } = ctx.scalarConfig;
658
688
  const allCustomScalarNames = [
659
689
  ...customScalarNames,
660
690
  ...ctx.typesResult.detectedScalarNames,
@@ -673,6 +703,8 @@ function generateSchemaStep(ctx: PipelineContext): {
673
703
  : null,
674
704
  enablePruning: null,
675
705
  sourceRoot: ctx.config.cwd,
706
+ knownTypeNames: ctx.knownTypeNames,
707
+ importExtension: ctx.config.output.importExtension,
676
708
  });
677
709
 
678
710
  const newDiagnostics = [...ctx.diagnostics, ...schemaResult.diagnostics];
@@ -725,6 +757,7 @@ export async function executeGeneration(
725
757
  ctx = await scanSourceFilesStep(ctx);
726
758
  ctx = createProgramStep(ctx);
727
759
  ctx = collectTypeNamesStep(ctx);
760
+ ctx = prepareScalarConfigStep(ctx);
728
761
  ctx = extractTypesStep(ctx);
729
762
  ctx = extractResolversStep(ctx);
730
763
  ctx = extractDirectivesStep(ctx);
@@ -10,6 +10,7 @@ import type {
10
10
  InlineEnumMemberInfo,
11
11
  InlineObjectPropertyDef,
12
12
  SourceLocation,
13
+ TSTypeReference,
13
14
  } from "../type-extractor/types/index.js";
14
15
  import type { AbstractResolverInfo } from "./extractor/define-api-extractor.js";
15
16
 
@@ -28,6 +29,8 @@ export interface GraphQLInputValue {
28
29
  readonly externalEnumDescription: string | null;
29
30
  /** @deprecated tag from the external enum type itself (null for string literal unions) */
30
31
  readonly externalEnumDeprecated: DeprecationInfo | null;
32
+ /** Inline union members when arg type is a union type (for @oneOf input objects) */
33
+ readonly inlineUnionMembers: ReadonlyArray<TSTypeReference> | null;
31
34
  }
32
35
 
33
36
  export interface GraphQLFieldDefinition {
@@ -39,6 +42,22 @@ export interface GraphQLFieldDefinition {
39
42
  readonly description: string | null;
40
43
  readonly deprecated: DeprecationInfo | null;
41
44
  readonly directives: ReadonlyArray<DirectiveInfo> | null;
45
+ /** Inline object properties when return type is an inline object type */
46
+ readonly returnTypeInlineObjectProperties: ReadonlyArray<InlineObjectPropertyDef> | null;
47
+ /** TSDoc description from the inline object type alias (Requirement 7.2) */
48
+ readonly returnTypeInlineObjectDescription: string | null;
49
+ /** @deprecated tag from the inline object type alias (Requirement 7.3) */
50
+ readonly returnTypeInlineObjectDeprecated: DeprecationInfo | null;
51
+ /** Inline enum members when return type is an inline enum (string literal union or external TypeScript enum) */
52
+ readonly returnTypeInlineEnumMembers: ReadonlyArray<InlineEnumMemberInfo> | null;
53
+ /** Inline union members when return type is a union type (for Payload union types) */
54
+ readonly returnTypeInlineUnionMembers: ReadonlyArray<TSTypeReference> | null;
55
+ /** External TypeScript enum symbol for deduplication across multiple references */
56
+ readonly returnTypeExternalEnumSymbol: ts.Symbol | null;
57
+ /** TSDoc description from the external enum type itself (null for string literal unions) */
58
+ readonly returnTypeExternalEnumDescription: string | null;
59
+ /** @deprecated tag from the external enum type itself (null for string literal unions) */
60
+ readonly returnTypeExternalEnumDeprecated: DeprecationInfo | null;
42
61
  }
43
62
 
44
63
  export interface QueryFieldDefinitions {
@@ -62,6 +62,11 @@ export interface DefineApiResolverInfo {
62
62
  readonly args: ReadonlyArray<ArgumentDefinition> | null;
63
63
  readonly returnType: TSTypeReference;
64
64
  readonly sourceFile: string;
65
+ readonly sourceLocation: {
66
+ readonly file: string;
67
+ readonly line: number;
68
+ readonly column: number;
69
+ };
65
70
  readonly exportedInputTypes: ReadonlyArray<ExportedInputType>;
66
71
  readonly description: string | null;
67
72
  readonly deprecated: DeprecationInfo | null;
@@ -195,23 +200,23 @@ function extractTypeNameFromType(
195
200
  function detectResolverFromMetadataType(
196
201
  callExpr: ts.CallExpression,
197
202
  checker: ts.TypeChecker,
198
- ): DefineApiResolverType | undefined {
203
+ ): DefineApiResolverType | null {
199
204
  const returnType = checker.getTypeAtLocation(callExpr);
200
205
 
201
206
  const metadataProp = returnType.getProperty(RESOLVER_METADATA_PROPERTY);
202
207
  if (!metadataProp) {
203
- return undefined;
208
+ return null;
204
209
  }
205
210
 
206
211
  const metadataType = checker.getTypeOfSymbol(metadataProp);
207
212
  const actualType = getActualMetadataType(metadataType);
208
213
  if (!actualType) {
209
- return undefined;
214
+ return null;
210
215
  }
211
216
 
212
217
  const kindProp = actualType.getProperty("kind");
213
218
  if (!kindProp) {
214
- return undefined;
219
+ return null;
215
220
  }
216
221
 
217
222
  const kindType = checker.getTypeOfSymbol(kindProp);
@@ -222,7 +227,7 @@ function detectResolverFromMetadataType(
222
227
  }
223
228
  }
224
229
 
225
- return undefined;
230
+ return null;
226
231
  }
227
232
 
228
233
  function isInlineTypeLiteralDeclaration(declaration: ts.Declaration): boolean {
@@ -277,48 +282,15 @@ function shouldUnwrapAsGqlField(type: ts.Type): boolean {
277
282
  return hasDirectiveMetadata(type);
278
283
  }
279
284
 
280
- /**
281
- * Checks if a type is structurally equivalent to Record<string, never>.
282
- * This is a special type that represents "no arguments".
283
- * Detection is based on type structure, not type names.
284
- */
285
- function isNoArgsType(type: ts.Type, checker: ts.TypeChecker): boolean {
286
- const apparentType = checker.getApparentType(type);
287
-
288
- // Check for string index signature with 'never' value type
289
- const indexInfos = checker.getIndexInfosOfType(apparentType);
290
- const hasNeverStringIndex = indexInfos.some((info) => {
291
- return (
292
- (info.keyType.flags & ts.TypeFlags.String) !== 0 &&
293
- (info.type.flags & ts.TypeFlags.Never) !== 0
294
- );
295
- });
296
-
297
- if (!hasNeverStringIndex) {
298
- return false;
299
- }
300
-
301
- // Check that there are no named properties (excluding metadata properties)
302
- const properties = apparentType
303
- .getProperties()
304
- .filter((p) => !p.getName().startsWith("$"));
305
-
306
- return properties.length === 0;
307
- }
308
-
309
285
  /**
310
286
  * Checks if a type has only index signatures with no named properties.
311
287
  * Types like `{ [key: string]: number }` return true.
312
- * Does NOT return true for NoArgs type.
288
+ * Returns false for NoArgs type (Record<string, never>).
313
289
  */
314
290
  function hasOnlyIndexSignatures(
315
291
  type: ts.Type,
316
292
  checker: ts.TypeChecker,
317
293
  ): boolean {
318
- if (isNoArgsType(type, checker)) {
319
- return false;
320
- }
321
-
322
294
  const targetType = checker.getApparentType(type);
323
295
 
324
296
  const indexInfos = checker.getIndexInfosOfType(targetType);
@@ -328,6 +300,17 @@ function hasOnlyIndexSignatures(
328
300
  return false;
329
301
  }
330
302
 
303
+ const hasNeverStringIndex = indexInfos.some((info) => {
304
+ return (
305
+ (info.keyType.flags & ts.TypeFlags.String) !== 0 &&
306
+ (info.type.flags & ts.TypeFlags.Never) !== 0
307
+ );
308
+ });
309
+
310
+ if (hasNeverStringIndex) {
311
+ return false;
312
+ }
313
+
331
314
  const properties = targetType
332
315
  .getProperties()
333
316
  .filter((p) => !p.getName().startsWith(" $"));
@@ -458,37 +441,6 @@ function validateArgsType(
458
441
  return diagnostics;
459
442
  }
460
443
 
461
- /**
462
- * Checks if the extracted args are empty and the original type was not NoArgs.
463
- * This indicates the type resolved to an empty object.
464
- * Does not emit warnings for types that only have index signatures (they get INDEX_SIGNATURE_ONLY error instead).
465
- */
466
- function checkEmptyArgsType(
467
- argsType: ts.Type,
468
- argsTypeNode: ts.TypeNode,
469
- args: ArgumentDefinition[] | null,
470
- checker: ts.TypeChecker,
471
- ): Diagnostic | null {
472
- if (isNoArgsType(argsType, checker)) {
473
- return null;
474
- }
475
-
476
- if (hasOnlyIndexSignatures(argsType, checker)) {
477
- return null;
478
- }
479
-
480
- if (args !== null && args.length === 0) {
481
- const typeName = getTypeNameForDiagnostic(argsType, checker);
482
- return {
483
- code: "EMPTY_TYPE_PROPERTIES",
484
- message: `Type '${typeName}' has no properties. Consider adding properties or using a different type.`,
485
- severity: "warning",
486
- location: getSourceLocationFromNode(argsTypeNode),
487
- };
488
- }
489
- return null;
490
- }
491
-
492
444
  interface ExtractTypeArgumentsFromCallParams {
493
445
  readonly node: ts.CallExpression;
494
446
  readonly inputContext: FieldTypeResolverContext;
@@ -538,18 +490,6 @@ function extractTypeArgumentsFromCall(
538
490
  ? null
539
491
  : extractArgsFromType(argsType, inputContext, argsTypeNode);
540
492
 
541
- if (!isNoArgs) {
542
- const emptyDiagnostic = checkEmptyArgsType(
543
- argsType,
544
- argsTypeNode,
545
- args,
546
- checker,
547
- );
548
- if (emptyDiagnostic) {
549
- diagnostics.push(emptyDiagnostic);
550
- }
551
- }
552
-
553
493
  const directives = extractDirectivesFromTypeNode(
554
494
  directiveTypeNode,
555
495
  checker,
@@ -594,18 +534,6 @@ function extractTypeArgumentsFromCall(
594
534
  ? null
595
535
  : extractArgsFromType(argsType, inputContext, argsTypeNode);
596
536
 
597
- if (!isNoArgs) {
598
- const emptyDiagnostic = checkEmptyArgsType(
599
- argsType,
600
- argsTypeNode,
601
- args,
602
- checker,
603
- );
604
- if (emptyDiagnostic) {
605
- diagnostics.push(emptyDiagnostic);
606
- }
607
- }
608
-
609
537
  const directives = extractDirectivesFromTypeNode(directiveTypeNode, checker);
610
538
 
611
539
  return {
@@ -784,6 +712,11 @@ export function extractDefineApiResolvers(
784
712
  diagnostics.push(...typeInfo.diagnostics);
785
713
 
786
714
  const tsdocInfo = extractTsDocInfo(node, checker);
715
+ const sourceLocation = getSourceLocationFromNode(declaration.name) ?? {
716
+ file: filePath,
717
+ line: 1,
718
+ column: 1,
719
+ };
787
720
 
788
721
  resolvers.push({
789
722
  fieldName,
@@ -793,6 +726,7 @@ export function extractDefineApiResolvers(
793
726
  args: typeInfo.args,
794
727
  returnType: typeInfo.returnType,
795
728
  sourceFile: filePath,
729
+ sourceLocation,
796
730
  exportedInputTypes,
797
731
  description: tsdocInfo.description,
798
732
  deprecated: tsdocInfo.deprecated,
@@ -11,9 +11,3 @@ export type {
11
11
  AbstractResolverInfo,
12
12
  AbstractResolverKind,
13
13
  } from "./extractor/define-api-extractor.js";
14
- export type {
15
- OnlyConstraintViolation,
16
- OnlyConstraintViolationCode,
17
- ValidateOnlyConstraintsOptions,
18
- ValidationContext,
19
- } from "./validator/only-validator.js";
@@ -16,6 +16,7 @@ import type { AbstractResolverInfo } from "../extractor/define-api-extractor.js"
16
16
  export interface ValidateAbstractResolversOptions {
17
17
  readonly abstractResolvers: ReadonlyArray<AbstractResolverInfo>;
18
18
  readonly baseTypes: ReadonlyArray<BaseType>;
19
+ readonly typenameAutoResolveTypeNames?: ReadonlySet<string>;
19
20
  }
20
21
 
21
22
  export interface ValidateAbstractResolversResult {
@@ -113,21 +114,26 @@ function createMissingResolverDiagnostic(
113
114
  };
114
115
  }
115
116
 
117
+ interface DetectMissingAbstractTypeResolversParams {
118
+ readonly resolvers: ReadonlyArray<AbstractResolverInfo>;
119
+ readonly typeMap: Map<string, BaseType>;
120
+ readonly typenameAutoResolveTypeNames: ReadonlySet<string>;
121
+ }
122
+
116
123
  /**
117
124
  * Detects abstract types (union/interface) that have no resolveType defined
118
125
  * and whose member/implementing types don't all have isTypeOf defined.
119
126
  *
120
- * @param resolvers - All abstract resolvers to check
121
- * @param typeMap - Map of type names to their definitions
127
+ * @param params - Parameters including resolvers, type map, and auto-generated typename resolveType names
122
128
  * @returns Array of warning diagnostics for missing resolvers
123
129
  */
124
130
  function detectMissingAbstractTypeResolvers(
125
- resolvers: ReadonlyArray<AbstractResolverInfo>,
126
- typeMap: Map<string, BaseType>,
131
+ params: DetectMissingAbstractTypeResolversParams,
127
132
  ): Diagnostic[] {
133
+ const { resolvers, typeMap, typenameAutoResolveTypeNames } = params;
128
134
  const diagnostics: Diagnostic[] = [];
129
135
 
130
- const resolveTypeSet = new Set<string>();
136
+ const resolveTypeSet = new Set<string>(typenameAutoResolveTypeNames);
131
137
  const isTypeOfSet = new Set<string>();
132
138
 
133
139
  for (const resolver of resolvers) {
@@ -241,10 +247,12 @@ export function validateAbstractResolvers(
241
247
  );
242
248
  diagnostics.push(...duplicateDiagnostics);
243
249
 
244
- const missingResolverWarnings = detectMissingAbstractTypeResolvers(
245
- options.abstractResolvers,
250
+ const missingResolverWarnings = detectMissingAbstractTypeResolvers({
251
+ resolvers: options.abstractResolvers,
246
252
  typeMap,
247
- );
253
+ typenameAutoResolveTypeNames:
254
+ options.typenameAutoResolveTypeNames ?? new Set(),
255
+ });
248
256
  diagnostics.push(...missingResolverWarnings);
249
257
 
250
258
  return { diagnostics };