@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.
- package/README.md +143 -0
- package/dist/auto-type-generator/auto-type-generator.d.ts +10 -4
- package/dist/auto-type-generator/auto-type-generator.d.ts.map +1 -1
- package/dist/auto-type-generator/auto-type-generator.js +656 -146
- package/dist/auto-type-generator/auto-type-generator.js.map +1 -1
- package/dist/auto-type-generator/index.d.ts +8 -1
- package/dist/auto-type-generator/index.d.ts.map +1 -1
- package/dist/auto-type-generator/index.js +3 -0
- package/dist/auto-type-generator/index.js.map +1 -1
- package/dist/auto-type-generator/inline-enum-collector.d.ts +13 -5
- package/dist/auto-type-generator/inline-enum-collector.d.ts.map +1 -1
- package/dist/auto-type-generator/inline-enum-collector.js +107 -71
- package/dist/auto-type-generator/inline-enum-collector.js.map +1 -1
- package/dist/auto-type-generator/inline-object-traverser.d.ts +20 -0
- package/dist/auto-type-generator/inline-object-traverser.d.ts.map +1 -0
- package/dist/auto-type-generator/inline-object-traverser.js +22 -0
- package/dist/auto-type-generator/inline-object-traverser.js.map +1 -0
- package/dist/auto-type-generator/inline-union-collector.d.ts +29 -0
- package/dist/auto-type-generator/inline-union-collector.d.ts.map +1 -0
- package/dist/auto-type-generator/inline-union-collector.js +216 -0
- package/dist/auto-type-generator/inline-union-collector.js.map +1 -0
- package/dist/auto-type-generator/inline-union-types.d.ts +29 -0
- package/dist/auto-type-generator/inline-union-types.d.ts.map +1 -0
- package/dist/auto-type-generator/inline-union-types.js +2 -0
- package/dist/auto-type-generator/inline-union-types.js.map +1 -0
- package/dist/auto-type-generator/inline-union-validator.d.ts +76 -0
- package/dist/auto-type-generator/inline-union-validator.d.ts.map +1 -0
- package/dist/auto-type-generator/inline-union-validator.js +329 -0
- package/dist/auto-type-generator/inline-union-validator.js.map +1 -0
- package/dist/auto-type-generator/naming-convention.d.ts +18 -1
- package/dist/auto-type-generator/naming-convention.d.ts.map +1 -1
- package/dist/auto-type-generator/naming-convention.js +16 -0
- package/dist/auto-type-generator/naming-convention.js.map +1 -1
- package/dist/auto-type-generator/resolve-type-generator.d.ts +20 -0
- package/dist/auto-type-generator/resolve-type-generator.d.ts.map +1 -0
- package/dist/auto-type-generator/resolve-type-generator.js +2 -0
- package/dist/auto-type-generator/resolve-type-generator.js.map +1 -0
- package/dist/auto-type-generator/resolver-field-iterator.d.ts +13 -0
- package/dist/auto-type-generator/resolver-field-iterator.d.ts.map +1 -0
- package/dist/auto-type-generator/resolver-field-iterator.js +22 -0
- package/dist/auto-type-generator/resolver-field-iterator.js.map +1 -0
- package/dist/auto-type-generator/typename-extractor.d.ts +26 -0
- package/dist/auto-type-generator/typename-extractor.d.ts.map +1 -0
- package/dist/auto-type-generator/typename-extractor.js +142 -0
- package/dist/auto-type-generator/typename-extractor.js.map +1 -0
- package/dist/auto-type-generator/typename-resolve-type-generator.d.ts +35 -0
- package/dist/auto-type-generator/typename-resolve-type-generator.d.ts.map +1 -0
- package/dist/auto-type-generator/typename-resolve-type-generator.js +177 -0
- package/dist/auto-type-generator/typename-resolve-type-generator.js.map +1 -0
- package/dist/auto-type-generator/typename-types.d.ts +43 -0
- package/dist/auto-type-generator/typename-types.d.ts.map +1 -0
- package/dist/auto-type-generator/typename-types.js +37 -0
- package/dist/auto-type-generator/typename-types.js.map +1 -0
- package/dist/auto-type-generator/typename-validator.d.ts +37 -0
- package/dist/auto-type-generator/typename-validator.d.ts.map +1 -0
- package/dist/auto-type-generator/typename-validator.js +206 -0
- package/dist/auto-type-generator/typename-validator.js.map +1 -0
- package/dist/cli.js +2 -0
- package/dist/cli.js.map +1 -1
- package/dist/commands/docs.d.ts +51 -0
- package/dist/commands/docs.d.ts.map +1 -0
- package/dist/commands/docs.js +154 -0
- package/dist/commands/docs.js.map +1 -0
- package/dist/config/types.d.ts +13 -0
- package/dist/config/types.d.ts.map +1 -1
- package/dist/config-loader/loader.d.ts +3 -0
- package/dist/config-loader/loader.d.ts.map +1 -1
- package/dist/config-loader/loader.js +1 -0
- package/dist/config-loader/loader.js.map +1 -1
- package/dist/config-loader/validator.d.ts.map +1 -1
- package/dist/config-loader/validator.js +23 -0
- package/dist/config-loader/validator.js.map +1 -1
- package/dist/gen-orchestrator/orchestrator.d.ts.map +1 -1
- package/dist/gen-orchestrator/orchestrator.js +32 -12
- package/dist/gen-orchestrator/orchestrator.js.map +1 -1
- package/dist/resolver-extractor/extract-resolvers.d.ts +19 -1
- package/dist/resolver-extractor/extract-resolvers.d.ts.map +1 -1
- package/dist/resolver-extractor/extractor/define-api-extractor.d.ts +5 -0
- package/dist/resolver-extractor/extractor/define-api-extractor.d.ts.map +1 -1
- package/dist/resolver-extractor/extractor/define-api-extractor.js +18 -65
- package/dist/resolver-extractor/extractor/define-api-extractor.js.map +1 -1
- package/dist/resolver-extractor/index.d.ts +0 -1
- package/dist/resolver-extractor/index.d.ts.map +1 -1
- package/dist/resolver-extractor/validator/abstract-resolver-validator.d.ts +1 -0
- package/dist/resolver-extractor/validator/abstract-resolver-validator.d.ts.map +1 -1
- package/dist/resolver-extractor/validator/abstract-resolver-validator.js +9 -5
- package/dist/resolver-extractor/validator/abstract-resolver-validator.js.map +1 -1
- package/dist/schema-generator/builder/ast-builder.d.ts +2 -2
- package/dist/schema-generator/builder/ast-builder.d.ts.map +1 -1
- package/dist/schema-generator/builder/ast-builder.js +12 -34
- package/dist/schema-generator/builder/ast-builder.js.map +1 -1
- package/dist/schema-generator/emitter/code-emitter.d.ts +3 -1
- package/dist/schema-generator/emitter/code-emitter.d.ts.map +1 -1
- package/dist/schema-generator/emitter/code-emitter.js +42 -12
- package/dist/schema-generator/emitter/code-emitter.js.map +1 -1
- package/dist/schema-generator/emitter/sdl-emitter.d.ts +0 -4
- package/dist/schema-generator/emitter/sdl-emitter.d.ts.map +1 -1
- package/dist/schema-generator/emitter/sdl-emitter.js +0 -4
- package/dist/schema-generator/emitter/sdl-emitter.js.map +1 -1
- package/dist/schema-generator/generate-schema.d.ts +3 -0
- package/dist/schema-generator/generate-schema.d.ts.map +1 -1
- package/dist/schema-generator/generate-schema.js +83 -5
- package/dist/schema-generator/generate-schema.js.map +1 -1
- package/dist/schema-generator/integrator/result-integrator.d.ts +19 -9
- package/dist/schema-generator/integrator/result-integrator.d.ts.map +1 -1
- package/dist/schema-generator/integrator/result-integrator.js +60 -44
- package/dist/schema-generator/integrator/result-integrator.js.map +1 -1
- package/dist/schema-generator/resolver-collector/resolver-collector.d.ts +2 -0
- package/dist/schema-generator/resolver-collector/resolver-collector.d.ts.map +1 -1
- package/dist/schema-generator/resolver-collector/resolver-collector.js +22 -0
- package/dist/schema-generator/resolver-collector/resolver-collector.js.map +1 -1
- package/dist/shared/branded-type-detector.d.ts +43 -0
- package/dist/shared/branded-type-detector.d.ts.map +1 -0
- package/dist/shared/branded-type-detector.js +146 -0
- package/dist/shared/branded-type-detector.js.map +1 -0
- package/dist/shared/enum-prefix-detector.d.ts +63 -0
- package/dist/shared/enum-prefix-detector.d.ts.map +1 -0
- package/dist/shared/enum-prefix-detector.js +80 -0
- package/dist/shared/enum-prefix-detector.js.map +1 -0
- package/dist/shared/ignore-fields-detector.d.ts +26 -0
- package/dist/shared/ignore-fields-detector.d.ts.map +1 -0
- package/dist/shared/ignore-fields-detector.js +83 -0
- package/dist/shared/ignore-fields-detector.js.map +1 -0
- package/dist/shared/ignore-fields-validator.d.ts +29 -0
- package/dist/shared/ignore-fields-validator.d.ts.map +1 -0
- package/dist/shared/ignore-fields-validator.js +43 -0
- package/dist/shared/ignore-fields-validator.js.map +1 -0
- package/dist/shared/index.d.ts +2 -0
- package/dist/shared/index.d.ts.map +1 -1
- package/dist/shared/index.js.map +1 -1
- package/dist/shared/source-location.d.ts +5 -0
- package/dist/shared/source-location.d.ts.map +1 -1
- package/dist/shared/source-location.js +7 -0
- package/dist/shared/source-location.js.map +1 -1
- package/dist/shared/string-utils.d.ts +2 -0
- package/dist/shared/string-utils.d.ts.map +1 -0
- package/dist/shared/string-utils.js +8 -0
- package/dist/shared/string-utils.js.map +1 -0
- package/dist/type-extractor/converter/field-eligibility.d.ts +8 -6
- package/dist/type-extractor/converter/field-eligibility.d.ts.map +1 -1
- package/dist/type-extractor/converter/field-eligibility.js +7 -28
- package/dist/type-extractor/converter/field-eligibility.js.map +1 -1
- package/dist/type-extractor/converter/graphql-converter.d.ts.map +1 -1
- package/dist/type-extractor/converter/graphql-converter.js +27 -18
- package/dist/type-extractor/converter/graphql-converter.js.map +1 -1
- package/dist/type-extractor/extractor/field-type-resolver.d.ts.map +1 -1
- package/dist/type-extractor/extractor/field-type-resolver.js +81 -7
- package/dist/type-extractor/extractor/field-type-resolver.js.map +1 -1
- package/dist/type-extractor/extractor/type-extractor.d.ts.map +1 -1
- package/dist/type-extractor/extractor/type-extractor.js +88 -23
- package/dist/type-extractor/extractor/type-extractor.js.map +1 -1
- package/dist/type-extractor/types/diagnostics.d.ts +1 -1
- package/dist/type-extractor/types/diagnostics.d.ts.map +1 -1
- package/dist/type-extractor/types/ts-type-reference-factory.d.ts +10 -2
- package/dist/type-extractor/types/ts-type-reference-factory.d.ts.map +1 -1
- package/dist/type-extractor/types/ts-type-reference-factory.js +8 -2
- package/dist/type-extractor/types/ts-type-reference-factory.js.map +1 -1
- package/dist/type-extractor/types/typescript.d.ts +4 -0
- package/dist/type-extractor/types/typescript.d.ts.map +1 -1
- package/dist/type-extractor/validator/type-validator.d.ts +1 -1
- package/dist/type-extractor/validator/type-validator.d.ts.map +1 -1
- package/dist/type-extractor/validator/type-validator.js +2 -10
- package/dist/type-extractor/validator/type-validator.js.map +1 -1
- package/docs/coding-agents.md +64 -0
- package/docs/configuration.md +15 -20
- package/docs/getting-started.md +15 -12
- package/docs/index.md +36 -22
- package/docs/integration/apollo.md +8 -40
- package/docs/integration/drizzle.md +6 -10
- package/docs/integration/prisma.md +196 -0
- package/docs/integration/yoga.md +8 -40
- package/docs/schema/abstract-resolvers.md +117 -0
- package/docs/schema/directives.md +5 -0
- package/docs/schema/documentation.md +5 -0
- package/docs/schema/enums.md +99 -0
- package/docs/schema/fields.md +64 -0
- package/docs/schema/index.md +21 -0
- package/docs/schema/inputs.md +115 -15
- package/docs/schema/interfaces.md +31 -1
- package/docs/schema/objects.md +40 -0
- package/docs/schema/queries-mutations.md +136 -22
- package/docs/schema/scalars.md +5 -0
- package/docs/schema/unions.md +208 -1
- package/docs/what-is-gqlkit.md +13 -8
- package/package.json +6 -4
- package/src/auto-type-generator/auto-type-generator.ts +969 -227
- package/src/auto-type-generator/index.ts +42 -0
- package/src/auto-type-generator/inline-enum-collector.ts +187 -139
- package/src/auto-type-generator/inline-object-traverser.ts +49 -0
- package/src/auto-type-generator/inline-union-collector.ts +402 -0
- package/src/auto-type-generator/inline-union-types.ts +33 -0
- package/src/auto-type-generator/inline-union-validator.ts +482 -0
- package/src/auto-type-generator/naming-convention.ts +38 -1
- package/src/auto-type-generator/resolve-type-generator.ts +21 -0
- package/src/auto-type-generator/resolver-field-iterator.ts +39 -0
- package/src/auto-type-generator/typename-extractor.ts +230 -0
- package/src/auto-type-generator/typename-resolve-type-generator.ts +281 -0
- package/src/auto-type-generator/typename-types.ts +66 -0
- package/src/auto-type-generator/typename-validator.ts +326 -0
- package/src/cli.ts +2 -0
- package/src/commands/docs.ts +211 -0
- package/src/config/types.ts +15 -0
- package/src/config-loader/loader.ts +4 -0
- package/src/config-loader/validator.ts +33 -0
- package/src/gen-orchestrator/orchestrator.ts +50 -17
- package/src/resolver-extractor/extract-resolvers.ts +19 -0
- package/src/resolver-extractor/extractor/define-api-extractor.ts +28 -94
- package/src/resolver-extractor/index.ts +0 -6
- package/src/resolver-extractor/validator/abstract-resolver-validator.ts +16 -8
- package/src/schema-generator/builder/ast-builder.ts +52 -81
- package/src/schema-generator/emitter/code-emitter.ts +82 -11
- package/src/schema-generator/emitter/sdl-emitter.ts +0 -4
- package/src/schema-generator/generate-schema.ts +109 -14
- package/src/schema-generator/integrator/result-integrator.ts +91 -63
- package/src/schema-generator/resolver-collector/resolver-collector.ts +34 -0
- package/src/shared/branded-type-detector.ts +182 -0
- package/src/shared/enum-prefix-detector.ts +99 -0
- package/src/shared/ignore-fields-detector.ts +109 -0
- package/src/shared/ignore-fields-validator.ts +66 -0
- package/src/shared/index.ts +2 -0
- package/src/shared/source-location.ts +11 -0
- package/src/shared/string-utils.ts +7 -0
- package/src/type-extractor/converter/field-eligibility.ts +13 -29
- package/src/type-extractor/converter/graphql-converter.ts +37 -23
- package/src/type-extractor/extractor/field-type-resolver.ts +97 -7
- package/src/type-extractor/extractor/type-extractor.ts +103 -26
- package/src/type-extractor/types/diagnostics.ts +13 -2
- package/src/type-extractor/types/ts-type-reference-factory.ts +18 -5
- package/src/type-extractor/types/typescript.ts +4 -0
- package/src/type-extractor/validator/type-validator.ts +2 -15
- package/dist/resolver-extractor/validator/only-validator.d.ts +0 -61
- package/dist/resolver-extractor/validator/only-validator.d.ts.map +0 -1
- package/dist/resolver-extractor/validator/only-validator.js +0 -76
- package/dist/resolver-extractor/validator/only-validator.js.map +0 -1
- 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(
|
|
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
|
-
|
|
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 } =
|
|
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 (
|
|
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 } =
|
|
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 |
|
|
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
|
|
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
|
|
214
|
+
return null;
|
|
210
215
|
}
|
|
211
216
|
|
|
212
217
|
const kindProp = actualType.getProperty("kind");
|
|
213
218
|
if (!kindProp) {
|
|
214
|
-
return
|
|
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
|
|
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
|
-
*
|
|
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
|
|
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
|
-
|
|
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 };
|