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