@gqlkit-ts/cli 0.5.1 → 0.7.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/dist/auto-type-generator/auto-type-generator.d.ts +7 -0
- package/dist/auto-type-generator/auto-type-generator.d.ts.map +1 -1
- package/dist/auto-type-generator/auto-type-generator.js +379 -56
- package/dist/auto-type-generator/auto-type-generator.js.map +1 -1
- package/dist/auto-type-generator/discriminator-field-validator.d.ts +26 -0
- package/dist/auto-type-generator/discriminator-field-validator.d.ts.map +1 -0
- package/dist/auto-type-generator/discriminator-field-validator.js +242 -0
- package/dist/auto-type-generator/discriminator-field-validator.js.map +1 -0
- package/dist/auto-type-generator/discriminator-naming.d.ts +11 -0
- package/dist/auto-type-generator/discriminator-naming.d.ts.map +1 -0
- package/dist/auto-type-generator/discriminator-naming.js +15 -0
- package/dist/auto-type-generator/discriminator-naming.js.map +1 -0
- package/dist/auto-type-generator/discriminator-resolve-type-generator.d.ts +44 -0
- package/dist/auto-type-generator/discriminator-resolve-type-generator.d.ts.map +1 -0
- package/dist/auto-type-generator/discriminator-resolve-type-generator.js +77 -0
- package/dist/auto-type-generator/discriminator-resolve-type-generator.js.map +1 -0
- package/dist/auto-type-generator/index.d.ts +3 -0
- 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.map +1 -1
- package/dist/auto-type-generator/inline-enum-collector.js +14 -7
- package/dist/auto-type-generator/inline-enum-collector.js.map +1 -1
- package/dist/auto-type-generator/inline-object-converter.d.ts +12 -0
- package/dist/auto-type-generator/inline-object-converter.d.ts.map +1 -0
- package/dist/auto-type-generator/inline-object-converter.js +72 -0
- package/dist/auto-type-generator/inline-object-converter.js.map +1 -0
- package/dist/auto-type-generator/inline-object-traverser.d.ts +2 -1
- package/dist/auto-type-generator/inline-object-traverser.d.ts.map +1 -1
- package/dist/auto-type-generator/inline-object-traverser.js +22 -4
- package/dist/auto-type-generator/inline-object-traverser.js.map +1 -1
- package/dist/auto-type-generator/inline-union-collector.d.ts.map +1 -1
- package/dist/auto-type-generator/inline-union-collector.js +20 -6
- package/dist/auto-type-generator/inline-union-collector.js.map +1 -1
- package/dist/auto-type-generator/inline-union-types.d.ts +2 -0
- package/dist/auto-type-generator/inline-union-types.d.ts.map +1 -1
- package/dist/auto-type-generator/inline-union-validator.js +3 -3
- package/dist/auto-type-generator/inline-union-validator.js.map +1 -1
- package/dist/auto-type-generator/intersection-flattener.d.ts +44 -0
- package/dist/auto-type-generator/intersection-flattener.d.ts.map +1 -0
- package/dist/auto-type-generator/intersection-flattener.js +398 -0
- package/dist/auto-type-generator/intersection-flattener.js.map +1 -0
- package/dist/auto-type-generator/naming-convention.d.ts +23 -2
- package/dist/auto-type-generator/naming-convention.d.ts.map +1 -1
- package/dist/auto-type-generator/naming-convention.js +145 -1
- package/dist/auto-type-generator/naming-convention.js.map +1 -1
- package/dist/auto-type-generator/resolver-field-iterator.d.ts +1 -1
- package/dist/auto-type-generator/resolver-field-iterator.d.ts.map +1 -1
- package/dist/auto-type-generator/resolver-field-iterator.js +3 -0
- package/dist/auto-type-generator/resolver-field-iterator.js.map +1 -1
- package/dist/auto-type-generator/typename-extractor.d.ts +2 -0
- package/dist/auto-type-generator/typename-extractor.d.ts.map +1 -1
- package/dist/auto-type-generator/typename-extractor.js +11 -3
- package/dist/auto-type-generator/typename-extractor.js.map +1 -1
- package/dist/auto-type-generator/typename-resolve-type-generator.d.ts +2 -0
- package/dist/auto-type-generator/typename-resolve-type-generator.d.ts.map +1 -1
- package/dist/auto-type-generator/typename-resolve-type-generator.js +12 -84
- package/dist/auto-type-generator/typename-resolve-type-generator.js.map +1 -1
- package/dist/auto-type-generator/typename-types.d.ts +4 -0
- package/dist/auto-type-generator/typename-types.d.ts.map +1 -1
- package/dist/auto-type-generator/typename-types.js +6 -0
- package/dist/auto-type-generator/typename-types.js.map +1 -1
- package/dist/auto-type-generator/typename-validator.d.ts.map +1 -1
- package/dist/auto-type-generator/typename-validator.js +4 -3
- package/dist/auto-type-generator/typename-validator.js.map +1 -1
- package/dist/commands/docs.d.ts +1 -0
- package/dist/commands/docs.d.ts.map +1 -1
- package/dist/commands/gen.d.ts +1 -0
- package/dist/commands/gen.d.ts.map +1 -1
- package/dist/commands/gen.js +2 -1
- package/dist/commands/gen.js.map +1 -1
- package/dist/commands/main.d.ts +1 -0
- package/dist/commands/main.d.ts.map +1 -1
- package/dist/config/types.d.ts +7 -0
- package/dist/config/types.d.ts.map +1 -1
- package/dist/config-loader/index.d.ts +1 -1
- package/dist/config-loader/index.d.ts.map +1 -1
- package/dist/config-loader/index.js.map +1 -1
- package/dist/config-loader/loader.d.ts +6 -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 +84 -1
- package/dist/config-loader/validator.js.map +1 -1
- package/dist/gen-orchestrator/orchestrator.d.ts +2 -1
- package/dist/gen-orchestrator/orchestrator.d.ts.map +1 -1
- package/dist/gen-orchestrator/orchestrator.js +43 -3
- package/dist/gen-orchestrator/orchestrator.js.map +1 -1
- package/dist/resolver-extractor/extract-resolvers.d.ts +4 -0
- package/dist/resolver-extractor/extract-resolvers.d.ts.map +1 -1
- package/dist/resolver-extractor/extractor/define-api-extractor.d.ts +2 -1
- package/dist/resolver-extractor/extractor/define-api-extractor.d.ts.map +1 -1
- package/dist/resolver-extractor/extractor/define-api-extractor.js +35 -6
- package/dist/resolver-extractor/extractor/define-api-extractor.js.map +1 -1
- package/dist/resolver-extractor/index.d.ts +1 -1
- package/dist/resolver-extractor/index.d.ts.map +1 -1
- package/dist/resolver-extractor/validator/abstract-resolver-validator.d.ts +2 -0
- package/dist/resolver-extractor/validator/abstract-resolver-validator.d.ts.map +1 -1
- package/dist/resolver-extractor/validator/abstract-resolver-validator.js +16 -3
- package/dist/resolver-extractor/validator/abstract-resolver-validator.js.map +1 -1
- package/dist/schema-generator/emitter/code-emitter.d.ts.map +1 -1
- package/dist/schema-generator/emitter/code-emitter.js +24 -4
- package/dist/schema-generator/emitter/code-emitter.js.map +1 -1
- package/dist/schema-generator/emitter/discriminator-resolve-type-emitter.d.ts +18 -0
- package/dist/schema-generator/emitter/discriminator-resolve-type-emitter.d.ts.map +1 -0
- package/dist/schema-generator/emitter/discriminator-resolve-type-emitter.js +89 -0
- package/dist/schema-generator/emitter/discriminator-resolve-type-emitter.js.map +1 -0
- package/dist/schema-generator/generate-schema.d.ts +2 -0
- package/dist/schema-generator/generate-schema.d.ts.map +1 -1
- package/dist/schema-generator/generate-schema.js +69 -10
- package/dist/schema-generator/generate-schema.js.map +1 -1
- package/dist/schema-generator/integrator/result-integrator.d.ts +5 -0
- package/dist/schema-generator/integrator/result-integrator.d.ts.map +1 -1
- package/dist/schema-generator/integrator/result-integrator.js +44 -3
- 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 +4 -0
- package/dist/schema-generator/resolver-collector/resolver-collector.js.map +1 -1
- package/dist/shared/constants.d.ts.map +1 -1
- package/dist/shared/constants.js +14 -1
- package/dist/shared/constants.js.map +1 -1
- package/dist/shared/enum-prefix-detector.d.ts.map +1 -1
- package/dist/shared/enum-prefix-detector.js +78 -8
- package/dist/shared/enum-prefix-detector.js.map +1 -1
- package/dist/shared/inline-object-utils.js +1 -1
- package/dist/shared/inline-object-utils.js.map +1 -1
- package/dist/shared/type-converter.d.ts.map +1 -1
- package/dist/shared/type-converter.js +55 -0
- package/dist/shared/type-converter.js.map +1 -1
- package/dist/type-extractor/converter/graphql-converter.d.ts.map +1 -1
- package/dist/type-extractor/converter/graphql-converter.js +11 -1
- package/dist/type-extractor/converter/graphql-converter.js.map +1 -1
- package/dist/type-extractor/extractor/field-type-resolver.d.ts +18 -0
- package/dist/type-extractor/extractor/field-type-resolver.d.ts.map +1 -1
- package/dist/type-extractor/extractor/field-type-resolver.js +198 -15
- package/dist/type-extractor/extractor/field-type-resolver.js.map +1 -1
- package/dist/type-extractor/extractor/type-extractor.d.ts +1 -0
- package/dist/type-extractor/extractor/type-extractor.d.ts.map +1 -1
- package/dist/type-extractor/extractor/type-extractor.js +100 -9
- 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/index.d.ts +1 -1
- package/dist/type-extractor/types/index.d.ts.map +1 -1
- package/dist/type-extractor/types/index.js +1 -1
- package/dist/type-extractor/types/index.js.map +1 -1
- package/dist/type-extractor/types/ts-type-reference-factory.d.ts +7 -1
- package/dist/type-extractor/types/ts-type-reference-factory.d.ts.map +1 -1
- package/dist/type-extractor/types/ts-type-reference-factory.js +18 -3
- package/dist/type-extractor/types/ts-type-reference-factory.js.map +1 -1
- package/dist/type-extractor/types/typescript.d.ts +3 -1
- package/dist/type-extractor/types/typescript.d.ts.map +1 -1
- package/dist/type-extractor/validator/type-validator.d.ts.map +1 -1
- package/dist/type-extractor/validator/type-validator.js +6 -1
- package/dist/type-extractor/validator/type-validator.js.map +1 -1
- package/docs/configuration.md +19 -0
- package/docs/getting-started.md +2 -1
- package/docs/index.md +2 -0
- package/docs/integration/ai-sdk.md +189 -0
- package/docs/schema/conventions.md +7 -0
- package/docs/schema/fields.md +15 -0
- package/docs/schema/queries-mutations.md +21 -2
- package/docs/schema/subscriptions.md +173 -0
- package/docs/schema/unions.md +117 -0
- package/package.json +4 -4
- package/src/auto-type-generator/auto-type-generator.ts +588 -62
- package/src/auto-type-generator/discriminator-field-validator.ts +368 -0
- package/src/auto-type-generator/discriminator-naming.ts +24 -0
- package/src/auto-type-generator/discriminator-resolve-type-generator.ts +136 -0
- package/src/auto-type-generator/index.ts +17 -0
- package/src/auto-type-generator/inline-enum-collector.ts +19 -4
- package/src/auto-type-generator/inline-object-converter.ts +100 -0
- package/src/auto-type-generator/inline-object-traverser.ts +33 -7
- package/src/auto-type-generator/inline-union-collector.ts +26 -4
- package/src/auto-type-generator/inline-union-types.ts +2 -0
- package/src/auto-type-generator/inline-union-validator.ts +3 -3
- package/src/auto-type-generator/intersection-flattener.ts +554 -0
- package/src/auto-type-generator/naming-convention.ts +207 -3
- package/src/auto-type-generator/resolver-field-iterator.ts +5 -1
- package/src/auto-type-generator/typename-extractor.ts +17 -3
- package/src/auto-type-generator/typename-resolve-type-generator.ts +19 -108
- package/src/auto-type-generator/typename-types.ts +7 -0
- package/src/auto-type-generator/typename-validator.ts +4 -3
- package/src/commands/gen.ts +9 -2
- package/src/config/types.ts +10 -0
- package/src/config-loader/index.ts +1 -0
- package/src/config-loader/loader.ts +11 -0
- package/src/config-loader/validator.ts +100 -1
- package/src/gen-orchestrator/orchestrator.ts +50 -3
- package/src/resolver-extractor/extract-resolvers.ts +5 -0
- package/src/resolver-extractor/extractor/define-api-extractor.ts +47 -7
- package/src/resolver-extractor/index.ts +1 -0
- package/src/resolver-extractor/validator/abstract-resolver-validator.ts +20 -6
- package/src/schema-generator/emitter/code-emitter.ts +43 -5
- package/src/schema-generator/emitter/discriminator-resolve-type-emitter.ts +125 -0
- package/src/schema-generator/generate-schema.ts +100 -13
- package/src/schema-generator/integrator/result-integrator.ts +55 -2
- package/src/schema-generator/resolver-collector/resolver-collector.ts +7 -0
- package/src/shared/constants.ts +15 -1
- package/src/shared/enum-prefix-detector.ts +96 -8
- package/src/shared/inline-object-utils.ts +1 -1
- package/src/shared/type-converter.ts +63 -0
- package/src/type-extractor/converter/graphql-converter.ts +17 -1
- package/src/type-extractor/extractor/field-type-resolver.ts +241 -16
- package/src/type-extractor/extractor/type-extractor.ts +119 -5
- package/src/type-extractor/types/diagnostics.ts +10 -1
- package/src/type-extractor/types/index.ts +2 -1
- package/src/type-extractor/types/ts-type-reference-factory.ts +24 -3
- package/src/type-extractor/types/typescript.ts +6 -2
- package/src/type-extractor/validator/type-validator.ts +6 -1
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
import { resolve } from "node:path";
|
|
2
2
|
import ts from "typescript";
|
|
3
|
-
import {
|
|
3
|
+
import {
|
|
4
|
+
isBuiltInScalar,
|
|
5
|
+
isInternalTypeSymbol,
|
|
6
|
+
} from "../../shared/constants.js";
|
|
4
7
|
import { detectDefaultValueMetadata } from "../../shared/default-value-detector.js";
|
|
5
8
|
import {
|
|
6
9
|
type DirectiveArgumentValue,
|
|
@@ -50,10 +53,11 @@ import type {
|
|
|
50
53
|
import {
|
|
51
54
|
createArrayType,
|
|
52
55
|
createInlineObjectType,
|
|
53
|
-
|
|
56
|
+
createNumericLiteralType,
|
|
54
57
|
createPrimitiveType,
|
|
55
58
|
createReferenceType,
|
|
56
59
|
createScalarType,
|
|
60
|
+
createStringLiteralType,
|
|
57
61
|
createUnionType,
|
|
58
62
|
type Diagnostic,
|
|
59
63
|
type EnumMemberInfo,
|
|
@@ -65,7 +69,11 @@ import {
|
|
|
65
69
|
type TypeKind,
|
|
66
70
|
type TypeMetadata,
|
|
67
71
|
} from "../types/index.js";
|
|
68
|
-
import {
|
|
72
|
+
import {
|
|
73
|
+
type DiscoveredTypeEntry,
|
|
74
|
+
type FieldTypeResolverDiagnostic,
|
|
75
|
+
resolveFieldType,
|
|
76
|
+
} from "./field-type-resolver.js";
|
|
69
77
|
|
|
70
78
|
/**
|
|
71
79
|
* Global type mapping configuration.
|
|
@@ -98,6 +106,7 @@ export interface ExtractionResult {
|
|
|
98
106
|
readonly diagnostics: ReadonlyArray<Diagnostic>;
|
|
99
107
|
readonly detectedScalarNames: ReadonlyArray<string>;
|
|
100
108
|
readonly detectedScalars: ReadonlyArray<ScalarMetadataInfo>;
|
|
109
|
+
readonly discoveredTypeNames: ReadonlySet<string>;
|
|
101
110
|
}
|
|
102
111
|
|
|
103
112
|
function isDefaultExport(node: ts.Node, sourceFile: ts.SourceFile): boolean {
|
|
@@ -163,6 +172,7 @@ function tryExtractAsInlineObject(
|
|
|
163
172
|
properties: inlineProperties,
|
|
164
173
|
description: null,
|
|
165
174
|
deprecated: null,
|
|
175
|
+
hintName: null,
|
|
166
176
|
}),
|
|
167
177
|
};
|
|
168
178
|
}
|
|
@@ -260,6 +270,7 @@ function convertTsTypeToReference(
|
|
|
260
270
|
tsType: createUnionType({
|
|
261
271
|
members: memberResults.map((r) => r.tsType),
|
|
262
272
|
nullable,
|
|
273
|
+
aliasName: type.aliasSymbol?.getName() ?? null,
|
|
263
274
|
}),
|
|
264
275
|
};
|
|
265
276
|
}
|
|
@@ -307,12 +318,12 @@ function convertTsTypeToReference(
|
|
|
307
318
|
}
|
|
308
319
|
if (type.flags & ts.TypeFlags.StringLiteral) {
|
|
309
320
|
return {
|
|
310
|
-
tsType:
|
|
321
|
+
tsType: createStringLiteralType(typeString.replace(/"/g, "")),
|
|
311
322
|
};
|
|
312
323
|
}
|
|
313
324
|
if (type.flags & ts.TypeFlags.NumberLiteral) {
|
|
314
325
|
return {
|
|
315
|
-
tsType:
|
|
326
|
+
tsType: createNumericLiteralType(typeString),
|
|
316
327
|
};
|
|
317
328
|
}
|
|
318
329
|
|
|
@@ -436,6 +447,7 @@ interface ExtractFieldsParams {
|
|
|
436
447
|
readonly scalarMappingTable: ScalarBaseTypeMappingTable | null;
|
|
437
448
|
readonly scalarMappingContext: ScalarMappingContext;
|
|
438
449
|
readonly ignoreFields: ReadonlySet<string> | null;
|
|
450
|
+
readonly discoveredTypes: Map<string, DiscoveredTypeEntry> | null;
|
|
439
451
|
}
|
|
440
452
|
|
|
441
453
|
function extractFieldsFromType(
|
|
@@ -452,6 +464,7 @@ function extractFieldsFromType(
|
|
|
452
464
|
scalarMappingTable,
|
|
453
465
|
scalarMappingContext,
|
|
454
466
|
ignoreFields,
|
|
467
|
+
discoveredTypes,
|
|
455
468
|
} = params;
|
|
456
469
|
const fields: FieldDefinition[] = [];
|
|
457
470
|
const diagnostics: Diagnostic[] = [];
|
|
@@ -528,6 +541,7 @@ function extractFieldsFromType(
|
|
|
528
541
|
propTypeNode = declaration.type;
|
|
529
542
|
}
|
|
530
543
|
|
|
544
|
+
const fieldDiagnostics: FieldTypeResolverDiagnostic[] = [];
|
|
531
545
|
const resolvedType = resolveFieldType(actualPropType, propTypeNode, {
|
|
532
546
|
checker,
|
|
533
547
|
knownTypeNames,
|
|
@@ -537,7 +551,22 @@ function extractFieldsFromType(
|
|
|
537
551
|
sourceFiles,
|
|
538
552
|
scalarMappingTable,
|
|
539
553
|
scalarMappingContext,
|
|
554
|
+
discoveredTypes,
|
|
555
|
+
diagnostics: fieldDiagnostics,
|
|
540
556
|
});
|
|
557
|
+
for (const d of fieldDiagnostics) {
|
|
558
|
+
diagnostics.push({
|
|
559
|
+
code: d.code,
|
|
560
|
+
message: `Field '${propName}': ${d.message}`,
|
|
561
|
+
severity: d.severity,
|
|
562
|
+
location: getSourceLocationFromNode(declaration),
|
|
563
|
+
});
|
|
564
|
+
}
|
|
565
|
+
|
|
566
|
+
// Skip fields with never type — they have no GraphQL representation
|
|
567
|
+
if (resolvedType.kind === "never") {
|
|
568
|
+
continue;
|
|
569
|
+
}
|
|
541
570
|
|
|
542
571
|
// Preserve nullability from original WithDirectives type
|
|
543
572
|
const tsType =
|
|
@@ -847,6 +876,7 @@ interface ProcessReexportedSymbolParams {
|
|
|
847
876
|
readonly scannedSourceFiles: ReadonlySet<string>;
|
|
848
877
|
readonly scalarMappingTable: ScalarBaseTypeMappingTable | null;
|
|
849
878
|
readonly scalarMappingContext: ScalarMappingContext;
|
|
879
|
+
readonly discoveredTypes: Map<string, DiscoveredTypeEntry> | null;
|
|
850
880
|
}
|
|
851
881
|
|
|
852
882
|
interface ProcessReexportedSymbolResult {
|
|
@@ -874,6 +904,7 @@ function processReexportedSymbol(
|
|
|
874
904
|
scannedSourceFiles,
|
|
875
905
|
scalarMappingTable,
|
|
876
906
|
scalarMappingContext,
|
|
907
|
+
discoveredTypes,
|
|
877
908
|
} = params;
|
|
878
909
|
|
|
879
910
|
const diagnostics: Diagnostic[] = [];
|
|
@@ -999,6 +1030,7 @@ function processReexportedSymbol(
|
|
|
999
1030
|
scalarMappingTable,
|
|
1000
1031
|
scalarMappingContext,
|
|
1001
1032
|
ignoreFields,
|
|
1033
|
+
discoveredTypes,
|
|
1002
1034
|
});
|
|
1003
1035
|
diagnostics.push(...fieldResult.diagnostics);
|
|
1004
1036
|
|
|
@@ -1036,6 +1068,7 @@ function processExportDeclaration(
|
|
|
1036
1068
|
underlyingSymbolToTypeName: ReadonlyMap<ts.Symbol, string>,
|
|
1037
1069
|
scannedSourceFiles: ReadonlySet<string>,
|
|
1038
1070
|
scalarMappingTable: ScalarBaseTypeMappingTable | null,
|
|
1071
|
+
discoveredTypes: Map<string, DiscoveredTypeEntry> | null,
|
|
1039
1072
|
): ProcessExportDeclarationResult {
|
|
1040
1073
|
const types: ExtractedTypeInfo[] = [];
|
|
1041
1074
|
const diagnostics: Diagnostic[] = [];
|
|
@@ -1132,6 +1165,7 @@ function processExportDeclaration(
|
|
|
1132
1165
|
scannedSourceFiles,
|
|
1133
1166
|
scalarMappingTable,
|
|
1134
1167
|
scalarMappingContext: exportedName.endsWith("Input") ? "input" : "output",
|
|
1168
|
+
discoveredTypes,
|
|
1135
1169
|
});
|
|
1136
1170
|
|
|
1137
1171
|
if (result.skip) continue;
|
|
@@ -1317,6 +1351,7 @@ export function extractTypesFromProgram(
|
|
|
1317
1351
|
const diagnostics: Diagnostic[] = [];
|
|
1318
1352
|
const detectedScalarNames = new Set<string>();
|
|
1319
1353
|
const detectedScalars: ScalarMetadataInfo[] = [];
|
|
1354
|
+
const discoveredTypes = new Map<string, DiscoveredTypeEntry>();
|
|
1320
1355
|
const {
|
|
1321
1356
|
globalTypeMappings,
|
|
1322
1357
|
knownTypeNames,
|
|
@@ -1562,6 +1597,7 @@ export function extractTypesFromProgram(
|
|
|
1562
1597
|
? "input"
|
|
1563
1598
|
: "output",
|
|
1564
1599
|
ignoreFields,
|
|
1600
|
+
discoveredTypes,
|
|
1565
1601
|
});
|
|
1566
1602
|
const fields = fieldResult.fields;
|
|
1567
1603
|
diagnostics.push(...fieldResult.diagnostics);
|
|
@@ -1624,6 +1660,7 @@ export function extractTypesFromProgram(
|
|
|
1624
1660
|
underlyingSymbolToTypeName,
|
|
1625
1661
|
scannedSourceFilesSet,
|
|
1626
1662
|
scalarMappingTable,
|
|
1663
|
+
discoveredTypes,
|
|
1627
1664
|
);
|
|
1628
1665
|
types.push(...result.types);
|
|
1629
1666
|
diagnostics.push(...result.diagnostics);
|
|
@@ -1635,10 +1672,87 @@ export function extractTypesFromProgram(
|
|
|
1635
1672
|
});
|
|
1636
1673
|
}
|
|
1637
1674
|
|
|
1675
|
+
// Process transitively discovered types
|
|
1676
|
+
const processedDiscovered = new Set<string>();
|
|
1677
|
+
while (discoveredTypes.size > processedDiscovered.size) {
|
|
1678
|
+
for (const [name, entry] of discoveredTypes) {
|
|
1679
|
+
if (processedDiscovered.has(name)) continue;
|
|
1680
|
+
processedDiscovered.add(name);
|
|
1681
|
+
if (knownTypeNames.has(name)) continue;
|
|
1682
|
+
|
|
1683
|
+
const { fields } = extractFieldsFromType({
|
|
1684
|
+
type: entry.tsType,
|
|
1685
|
+
checker,
|
|
1686
|
+
globalTypeMappings,
|
|
1687
|
+
knownTypeNames,
|
|
1688
|
+
knownTypeSymbols,
|
|
1689
|
+
underlyingSymbolToTypeName,
|
|
1690
|
+
sourceFiles: scannedSourceFilesSet,
|
|
1691
|
+
scalarMappingTable,
|
|
1692
|
+
scalarMappingContext: "output",
|
|
1693
|
+
ignoreFields: null,
|
|
1694
|
+
discoveredTypes,
|
|
1695
|
+
});
|
|
1696
|
+
if (fields.length === 0) continue;
|
|
1697
|
+
|
|
1698
|
+
types.push({
|
|
1699
|
+
metadata: {
|
|
1700
|
+
name,
|
|
1701
|
+
kind: "object",
|
|
1702
|
+
sourceFile: entry.sourceFile,
|
|
1703
|
+
sourceLocation: entry.sourceLocation,
|
|
1704
|
+
exportKind: "named",
|
|
1705
|
+
description: null,
|
|
1706
|
+
deprecated: null,
|
|
1707
|
+
directives: null,
|
|
1708
|
+
},
|
|
1709
|
+
fields,
|
|
1710
|
+
enumMembers: null,
|
|
1711
|
+
unionMembers: null,
|
|
1712
|
+
implementedInterfaces: null,
|
|
1713
|
+
inlineObjectMembers: null,
|
|
1714
|
+
});
|
|
1715
|
+
}
|
|
1716
|
+
}
|
|
1717
|
+
|
|
1718
|
+
// Collect scalar names from field types (e.g., unknown → Unknown scalar)
|
|
1719
|
+
for (const typeInfo of types) {
|
|
1720
|
+
for (const field of typeInfo.fields) {
|
|
1721
|
+
collectScalarNamesFromType(field.tsType, detectedScalarNames);
|
|
1722
|
+
}
|
|
1723
|
+
}
|
|
1724
|
+
|
|
1638
1725
|
return {
|
|
1639
1726
|
types,
|
|
1640
1727
|
diagnostics,
|
|
1641
1728
|
detectedScalarNames: [...detectedScalarNames],
|
|
1642
1729
|
detectedScalars,
|
|
1730
|
+
discoveredTypeNames: new Set(discoveredTypes.keys()),
|
|
1643
1731
|
};
|
|
1644
1732
|
}
|
|
1733
|
+
|
|
1734
|
+
function collectScalarNamesFromType(
|
|
1735
|
+
tsType: TSTypeReference,
|
|
1736
|
+
scalarNames: Set<string>,
|
|
1737
|
+
): void {
|
|
1738
|
+
if (
|
|
1739
|
+
tsType.kind === "scalar" &&
|
|
1740
|
+
tsType.scalarInfo?.isCustom &&
|
|
1741
|
+
!isBuiltInScalar(tsType.scalarInfo.scalarName)
|
|
1742
|
+
) {
|
|
1743
|
+
scalarNames.add(tsType.scalarInfo.scalarName);
|
|
1744
|
+
}
|
|
1745
|
+
if (tsType.elementType) {
|
|
1746
|
+
collectScalarNamesFromType(tsType.elementType, scalarNames);
|
|
1747
|
+
}
|
|
1748
|
+
if (tsType.members) {
|
|
1749
|
+
for (const member of tsType.members) {
|
|
1750
|
+
collectScalarNamesFromType(member, scalarNames);
|
|
1751
|
+
}
|
|
1752
|
+
}
|
|
1753
|
+
if (tsType.inlineObjectProperties) {
|
|
1754
|
+
for (const prop of tsType.inlineObjectProperties) {
|
|
1755
|
+
collectScalarNamesFromType(prop.tsType, scalarNames);
|
|
1756
|
+
}
|
|
1757
|
+
}
|
|
1758
|
+
}
|
|
@@ -95,9 +95,18 @@ export type DiagnosticCode =
|
|
|
95
95
|
| "NULLABLE_TYPENAME_PROPERTY"
|
|
96
96
|
| "TYPENAME_FIELD_STRUCTURE_MISMATCH"
|
|
97
97
|
| "DUPLICATE_TYPENAME_VALUE"
|
|
98
|
+
| "UNNAMEABLE_UNION_MEMBER"
|
|
98
99
|
| "IGNORE_FIELD_NOT_FOUND"
|
|
99
100
|
| "IGNORE_ALL_FIELDS"
|
|
100
|
-
| "DUPLICATE_TYPE_EXPORT"
|
|
101
|
+
| "DUPLICATE_TYPE_EXPORT"
|
|
102
|
+
| "CONFIG_INVALID_DISCRIMINATOR_FIELDS"
|
|
103
|
+
| "CONFIG_INVALID_DISCRIMINATOR_ENTRY"
|
|
104
|
+
| "CONFIG_EMPTY_DISCRIMINATOR_FIELDS"
|
|
105
|
+
| "DISCRIMINATOR_FIELD_NOT_FOUND"
|
|
106
|
+
| "DISCRIMINATOR_FIELD_NOT_STRING_LITERAL"
|
|
107
|
+
| "DISCRIMINATOR_DUPLICATE_VALUE_TUPLE"
|
|
108
|
+
| "DISCRIMINATOR_UNKNOWN_UNION"
|
|
109
|
+
| "CYCLE_DETECTED";
|
|
101
110
|
|
|
102
111
|
export interface Diagnostic {
|
|
103
112
|
readonly code: DiagnosticCode;
|
|
@@ -15,10 +15,11 @@ export type {
|
|
|
15
15
|
export {
|
|
16
16
|
createArrayType,
|
|
17
17
|
createInlineObjectType,
|
|
18
|
-
|
|
18
|
+
createNumericLiteralType,
|
|
19
19
|
createPrimitiveType,
|
|
20
20
|
createReferenceType,
|
|
21
21
|
createScalarType,
|
|
22
|
+
createStringLiteralType,
|
|
22
23
|
createUnionType,
|
|
23
24
|
} from "./ts-type-reference-factory.js";
|
|
24
25
|
export type {
|
|
@@ -25,6 +25,7 @@ function createTSTypeReference(
|
|
|
25
25
|
inlineObjectProperties: null,
|
|
26
26
|
inlineObjectDescription: null,
|
|
27
27
|
inlineObjectDeprecated: null,
|
|
28
|
+
inlineObjectHintName: null,
|
|
28
29
|
inlineEnumMembers: null,
|
|
29
30
|
externalEnumSymbol: null,
|
|
30
31
|
externalEnumDescription: null,
|
|
@@ -68,6 +69,8 @@ export function createArrayType(elementType: TSTypeReference): TSTypeReference {
|
|
|
68
69
|
interface CreateUnionTypeParams {
|
|
69
70
|
readonly members: ReadonlyArray<TSTypeReference>;
|
|
70
71
|
readonly nullable: boolean;
|
|
72
|
+
/** The TypeScript type alias name for this union (e.g., "ItemPart" for `type ItemPart = A | B`) */
|
|
73
|
+
readonly aliasName: string | null;
|
|
71
74
|
}
|
|
72
75
|
|
|
73
76
|
export function createUnionType(
|
|
@@ -75,7 +78,11 @@ export function createUnionType(
|
|
|
75
78
|
): TSTypeReference {
|
|
76
79
|
return createTSTypeReference({
|
|
77
80
|
kind: "union",
|
|
78
|
-
overrides: {
|
|
81
|
+
overrides: {
|
|
82
|
+
members: params.members,
|
|
83
|
+
nullable: params.nullable,
|
|
84
|
+
name: params.aliasName,
|
|
85
|
+
},
|
|
79
86
|
});
|
|
80
87
|
}
|
|
81
88
|
|
|
@@ -85,6 +92,8 @@ interface CreateInlineObjectTypeParams {
|
|
|
85
92
|
readonly description: string | null;
|
|
86
93
|
/** @deprecated tag from the type alias (null for true inline objects) */
|
|
87
94
|
readonly deprecated: DeprecationInfo | null;
|
|
95
|
+
/** Original type name hint for inline objects extracted from external types */
|
|
96
|
+
readonly hintName: string | null;
|
|
88
97
|
}
|
|
89
98
|
|
|
90
99
|
export function createInlineObjectType(
|
|
@@ -96,6 +105,7 @@ export function createInlineObjectType(
|
|
|
96
105
|
inlineObjectProperties: params.properties,
|
|
97
106
|
inlineObjectDescription: params.description,
|
|
98
107
|
inlineObjectDeprecated: params.deprecated,
|
|
108
|
+
inlineObjectHintName: params.hintName,
|
|
99
109
|
},
|
|
100
110
|
});
|
|
101
111
|
}
|
|
@@ -119,8 +129,19 @@ export function createScalarType(
|
|
|
119
129
|
});
|
|
120
130
|
}
|
|
121
131
|
|
|
122
|
-
export function
|
|
123
|
-
return createTSTypeReference({ kind: "
|
|
132
|
+
export function createNeverType(): TSTypeReference {
|
|
133
|
+
return createTSTypeReference({ kind: "never", overrides: {} });
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
export function createStringLiteralType(name: string): TSTypeReference {
|
|
137
|
+
return createTSTypeReference({ kind: "stringLiteral", overrides: { name } });
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
export function createNumericLiteralType(name: string): TSTypeReference {
|
|
141
|
+
return createTSTypeReference({
|
|
142
|
+
kind: "numericLiteral",
|
|
143
|
+
overrides: { name },
|
|
144
|
+
});
|
|
124
145
|
}
|
|
125
146
|
|
|
126
147
|
interface CreateInlineEnumTypeParams {
|
|
@@ -45,10 +45,12 @@ export type TSTypeReferenceKind =
|
|
|
45
45
|
| "reference"
|
|
46
46
|
| "array"
|
|
47
47
|
| "union"
|
|
48
|
-
| "
|
|
48
|
+
| "stringLiteral"
|
|
49
|
+
| "numericLiteral"
|
|
49
50
|
| "scalar"
|
|
50
51
|
| "inlineObject"
|
|
51
|
-
| "inlineEnum"
|
|
52
|
+
| "inlineEnum"
|
|
53
|
+
| "never";
|
|
52
54
|
|
|
53
55
|
/**
|
|
54
56
|
* Information about an inline enum member (string literal union value).
|
|
@@ -76,6 +78,8 @@ export interface TSTypeReference {
|
|
|
76
78
|
readonly inlineObjectDeprecated: DeprecationInfo | null;
|
|
77
79
|
/** Inline enum members when kind is "inlineEnum" */
|
|
78
80
|
readonly inlineEnumMembers: ReadonlyArray<InlineEnumMemberInfo> | null;
|
|
81
|
+
/** Original type name hint for inline objects extracted from external types */
|
|
82
|
+
readonly inlineObjectHintName: string | null;
|
|
79
83
|
/** External TypeScript enum symbol for deduplication (Requirement 5.2) */
|
|
80
84
|
readonly externalEnumSymbol: ts.Symbol | null;
|
|
81
85
|
/** TSDoc description from the external enum type itself (Requirement 6.1) */
|
|
@@ -10,7 +10,12 @@ export interface ValidateTypesOptions {
|
|
|
10
10
|
readonly types: ReadonlyArray<GraphQLTypeInfo>;
|
|
11
11
|
readonly customScalarNames: ReadonlyArray<string> | null;
|
|
12
12
|
}
|
|
13
|
-
const PLACEHOLDER_TYPES = new Set([
|
|
13
|
+
const PLACEHOLDER_TYPES = new Set([
|
|
14
|
+
"__INLINE_OBJECT__",
|
|
15
|
+
"__INLINE_ENUM__",
|
|
16
|
+
"__INLINE_UNION__",
|
|
17
|
+
"__NEVER__",
|
|
18
|
+
]);
|
|
14
19
|
|
|
15
20
|
export function validateTypes(options: ValidateTypesOptions): ValidationResult {
|
|
16
21
|
const { types, customScalarNames } = options;
|