@gqlkit-ts/cli 0.2.0 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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 +640 -133
- 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/gen-orchestrator/orchestrator.d.ts.map +1 -1
- package/dist/gen-orchestrator/orchestrator.js +13 -6
- 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 +14 -61
- 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/emitter/code-emitter.d.ts.map +1 -1
- package/dist/schema-generator/emitter/code-emitter.js +20 -0
- package/dist/schema-generator/emitter/code-emitter.js.map +1 -1
- package/dist/schema-generator/generate-schema.d.ts +1 -0
- package/dist/schema-generator/generate-schema.d.ts.map +1 -1
- package/dist/schema-generator/generate-schema.js +72 -3
- package/dist/schema-generator/generate-schema.js.map +1 -1
- package/dist/schema-generator/integrator/result-integrator.d.ts +14 -2
- package/dist/schema-generator/integrator/result-integrator.d.ts.map +1 -1
- package/dist/schema-generator/integrator/result-integrator.js +54 -1
- 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/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/type-extractor/converter/graphql-converter.d.ts.map +1 -1
- package/dist/type-extractor/converter/graphql-converter.js +21 -7
- package/dist/type-extractor/converter/graphql-converter.js.map +1 -1
- package/dist/type-extractor/extractor/field-type-resolver.js +42 -3
- 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/docs/coding-agents.md +64 -0
- package/docs/configuration.md +6 -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 +946 -201
- 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/gen-orchestrator/orchestrator.ts +20 -6
- package/src/resolver-extractor/extract-resolvers.ts +19 -0
- package/src/resolver-extractor/extractor/define-api-extractor.ts +23 -89
- package/src/resolver-extractor/index.ts +0 -6
- package/src/resolver-extractor/validator/abstract-resolver-validator.ts +16 -8
- package/src/schema-generator/emitter/code-emitter.ts +34 -0
- package/src/schema-generator/generate-schema.ts +99 -2
- package/src/schema-generator/integrator/result-integrator.ts +70 -1
- package/src/schema-generator/resolver-collector/resolver-collector.ts +34 -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/type-extractor/converter/graphql-converter.ts +31 -7
- package/src/type-extractor/extractor/field-type-resolver.ts +48 -3
- package/src/type-extractor/extractor/type-extractor.ts +103 -26
- package/src/type-extractor/types/diagnostics.ts +12 -2
- package/src/type-extractor/types/ts-type-reference-factory.ts +18 -5
- package/src/type-extractor/types/typescript.ts +4 -0
- 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
|
@@ -0,0 +1,402 @@
|
|
|
1
|
+
import type { ExtractResolversResult } from "../resolver-extractor/index.js";
|
|
2
|
+
import { getSourceLocationOrDefault } from "../shared/source-location.js";
|
|
3
|
+
import type {
|
|
4
|
+
ExtractedTypeInfo,
|
|
5
|
+
FieldDefinition,
|
|
6
|
+
InlineObjectPropertyDef,
|
|
7
|
+
SourceLocation,
|
|
8
|
+
TSTypeReference,
|
|
9
|
+
} from "../type-extractor/types/index.js";
|
|
10
|
+
import { traverseInlineObjectProperties } from "./inline-object-traverser.js";
|
|
11
|
+
import type {
|
|
12
|
+
InlineUnionMemberInfo,
|
|
13
|
+
InlineUnionWithContext,
|
|
14
|
+
} from "./inline-union-types.js";
|
|
15
|
+
import {
|
|
16
|
+
type AutoTypeNameContext,
|
|
17
|
+
buildFieldContext,
|
|
18
|
+
isInputTypeName,
|
|
19
|
+
} from "./naming-convention.js";
|
|
20
|
+
import {
|
|
21
|
+
forEachResolverField,
|
|
22
|
+
type ResolverFieldInfo,
|
|
23
|
+
type ResolverType,
|
|
24
|
+
} from "./resolver-field-iterator.js";
|
|
25
|
+
|
|
26
|
+
export type {
|
|
27
|
+
InlineUnionMemberInfo,
|
|
28
|
+
InlineUnionWithContext,
|
|
29
|
+
} from "./inline-union-types.js";
|
|
30
|
+
|
|
31
|
+
function createMemberInfo(
|
|
32
|
+
memberType: TSTypeReference,
|
|
33
|
+
knownTypeNames: ReadonlySet<string>,
|
|
34
|
+
): InlineUnionMemberInfo {
|
|
35
|
+
const isKnown =
|
|
36
|
+
memberType.kind === "reference" &&
|
|
37
|
+
memberType.name !== null &&
|
|
38
|
+
knownTypeNames.has(memberType.name);
|
|
39
|
+
|
|
40
|
+
return {
|
|
41
|
+
memberType,
|
|
42
|
+
needsAutoGeneration: !isKnown,
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
export interface CollectInlineUnionsFromTypesParams {
|
|
47
|
+
readonly extractedTypes: ReadonlyArray<ExtractedTypeInfo>;
|
|
48
|
+
readonly knownTypeNames: ReadonlySet<string>;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* Collect inline unions from ExtractedTypeInfo by traversing type fields.
|
|
53
|
+
*/
|
|
54
|
+
export function collectInlineUnionsFromTypes(
|
|
55
|
+
params: CollectInlineUnionsFromTypesParams,
|
|
56
|
+
): InlineUnionWithContext[] {
|
|
57
|
+
const { extractedTypes, knownTypeNames } = params;
|
|
58
|
+
const results: InlineUnionWithContext[] = [];
|
|
59
|
+
|
|
60
|
+
for (const typeInfo of extractedTypes) {
|
|
61
|
+
const isInput = isInputTypeName(typeInfo.metadata.name);
|
|
62
|
+
|
|
63
|
+
for (const field of typeInfo.fields) {
|
|
64
|
+
collectInlineUnionsFromField({
|
|
65
|
+
field,
|
|
66
|
+
parentTypeName: typeInfo.metadata.name,
|
|
67
|
+
parentPath: [],
|
|
68
|
+
isInput,
|
|
69
|
+
sourceFile: typeInfo.metadata.sourceFile,
|
|
70
|
+
knownTypeNames,
|
|
71
|
+
results,
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
return results;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
interface CollectInlineUnionBaseParams {
|
|
80
|
+
readonly parentTypeName: string;
|
|
81
|
+
readonly parentPath: ReadonlyArray<string>;
|
|
82
|
+
readonly isInput: boolean;
|
|
83
|
+
readonly sourceFile: string;
|
|
84
|
+
readonly knownTypeNames: ReadonlySet<string>;
|
|
85
|
+
readonly results: InlineUnionWithContext[];
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
interface CollectFromFieldParams extends CollectInlineUnionBaseParams {
|
|
89
|
+
readonly field: FieldDefinition;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
function collectInlineUnionsFromField(params: CollectFromFieldParams): void {
|
|
93
|
+
const {
|
|
94
|
+
field,
|
|
95
|
+
parentTypeName,
|
|
96
|
+
parentPath,
|
|
97
|
+
isInput,
|
|
98
|
+
sourceFile,
|
|
99
|
+
knownTypeNames,
|
|
100
|
+
results,
|
|
101
|
+
} = params;
|
|
102
|
+
const tsType = field.tsType;
|
|
103
|
+
const fieldPath = [...parentPath, field.name];
|
|
104
|
+
|
|
105
|
+
if (tsType.kind === "union" && tsType.members) {
|
|
106
|
+
const members = tsType.members.map((m) =>
|
|
107
|
+
createMemberInfo(m, knownTypeNames),
|
|
108
|
+
);
|
|
109
|
+
|
|
110
|
+
results.push({
|
|
111
|
+
members,
|
|
112
|
+
context: buildFieldContext(parentTypeName, fieldPath, isInput),
|
|
113
|
+
sourceLocation: getSourceLocationOrDefault(
|
|
114
|
+
field.sourceLocation,
|
|
115
|
+
sourceFile,
|
|
116
|
+
),
|
|
117
|
+
nullable: tsType.nullable,
|
|
118
|
+
isInputContext: isInput,
|
|
119
|
+
});
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
if (
|
|
123
|
+
tsType.kind === "array" &&
|
|
124
|
+
tsType.elementType?.kind === "union" &&
|
|
125
|
+
tsType.elementType.members
|
|
126
|
+
) {
|
|
127
|
+
const members = tsType.elementType.members.map((m) =>
|
|
128
|
+
createMemberInfo(m, knownTypeNames),
|
|
129
|
+
);
|
|
130
|
+
|
|
131
|
+
results.push({
|
|
132
|
+
members,
|
|
133
|
+
context: buildFieldContext(parentTypeName, fieldPath, isInput),
|
|
134
|
+
sourceLocation: getSourceLocationOrDefault(
|
|
135
|
+
field.sourceLocation,
|
|
136
|
+
sourceFile,
|
|
137
|
+
),
|
|
138
|
+
nullable: tsType.elementType.nullable,
|
|
139
|
+
isInputContext: isInput,
|
|
140
|
+
});
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
if (tsType.kind === "inlineObject" && tsType.inlineObjectProperties) {
|
|
144
|
+
traverseInlineObjectProperties(
|
|
145
|
+
{ properties: tsType.inlineObjectProperties, parentPath: fieldPath },
|
|
146
|
+
(prop, propPath) => {
|
|
147
|
+
const propTsType = prop.tsType;
|
|
148
|
+
if (propTsType.kind === "union" && propTsType.members) {
|
|
149
|
+
const members = propTsType.members.map((m) =>
|
|
150
|
+
createMemberInfo(m, knownTypeNames),
|
|
151
|
+
);
|
|
152
|
+
|
|
153
|
+
results.push({
|
|
154
|
+
members,
|
|
155
|
+
context: buildFieldContext(parentTypeName, propPath, isInput),
|
|
156
|
+
sourceLocation: getSourceLocationOrDefault(
|
|
157
|
+
prop.sourceLocation,
|
|
158
|
+
sourceFile,
|
|
159
|
+
),
|
|
160
|
+
nullable: propTsType.nullable,
|
|
161
|
+
isInputContext: isInput,
|
|
162
|
+
});
|
|
163
|
+
}
|
|
164
|
+
},
|
|
165
|
+
);
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
export interface CollectInlineUnionsFromResolversParams {
|
|
170
|
+
readonly resolversResult: ExtractResolversResult;
|
|
171
|
+
readonly knownTypeNames: ReadonlySet<string>;
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
/**
|
|
175
|
+
* Collect inline unions from ExtractResolversResult by traversing resolver args.
|
|
176
|
+
*/
|
|
177
|
+
export function collectInlineUnionsFromResolvers(
|
|
178
|
+
params: CollectInlineUnionsFromResolversParams,
|
|
179
|
+
): InlineUnionWithContext[] {
|
|
180
|
+
const { resolversResult, knownTypeNames } = params;
|
|
181
|
+
const results: InlineUnionWithContext[] = [];
|
|
182
|
+
|
|
183
|
+
forEachResolverField(resolversResult, (info) => {
|
|
184
|
+
collectInlineUnionsFromResolverArgs({
|
|
185
|
+
...info,
|
|
186
|
+
knownTypeNames,
|
|
187
|
+
results,
|
|
188
|
+
});
|
|
189
|
+
});
|
|
190
|
+
|
|
191
|
+
return results;
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
interface CollectFromResolverArgsParams extends ResolverFieldInfo {
|
|
195
|
+
readonly knownTypeNames: ReadonlySet<string>;
|
|
196
|
+
readonly results: InlineUnionWithContext[];
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
function collectInlineUnionsFromResolverArgs(
|
|
200
|
+
params: CollectFromResolverArgsParams,
|
|
201
|
+
): void {
|
|
202
|
+
const { field, resolverType, parentTypeName, knownTypeNames, results } =
|
|
203
|
+
params;
|
|
204
|
+
if (!field.args) return;
|
|
205
|
+
|
|
206
|
+
for (const arg of field.args) {
|
|
207
|
+
if (arg.inlineUnionMembers) {
|
|
208
|
+
const members = arg.inlineUnionMembers.map((m: TSTypeReference) =>
|
|
209
|
+
createMemberInfo(m, knownTypeNames),
|
|
210
|
+
);
|
|
211
|
+
|
|
212
|
+
const context: AutoTypeNameContext = {
|
|
213
|
+
kind: "resolverArg",
|
|
214
|
+
resolverType,
|
|
215
|
+
fieldName: field.name,
|
|
216
|
+
argName: arg.name,
|
|
217
|
+
parentTypeName,
|
|
218
|
+
fieldPath: [],
|
|
219
|
+
};
|
|
220
|
+
|
|
221
|
+
results.push({
|
|
222
|
+
members,
|
|
223
|
+
context,
|
|
224
|
+
sourceLocation: field.sourceLocation,
|
|
225
|
+
nullable: arg.type.nullable,
|
|
226
|
+
isInputContext: true,
|
|
227
|
+
});
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
if (arg.inlineObjectProperties) {
|
|
231
|
+
collectInlineUnionsFromResolverProperties({
|
|
232
|
+
properties: arg.inlineObjectProperties,
|
|
233
|
+
resolverType,
|
|
234
|
+
fieldName: field.name,
|
|
235
|
+
parentTypeName,
|
|
236
|
+
parentPath: [],
|
|
237
|
+
sourceLocation: field.sourceLocation,
|
|
238
|
+
knownTypeNames,
|
|
239
|
+
contextKind: "resolverArg",
|
|
240
|
+
argName: arg.name,
|
|
241
|
+
results,
|
|
242
|
+
});
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
interface CollectInlineUnionsFromResolverPropertiesBaseParams {
|
|
248
|
+
readonly properties: ReadonlyArray<InlineObjectPropertyDef>;
|
|
249
|
+
readonly resolverType: ResolverType;
|
|
250
|
+
readonly fieldName: string;
|
|
251
|
+
readonly parentTypeName: string | null;
|
|
252
|
+
readonly parentPath: ReadonlyArray<string>;
|
|
253
|
+
readonly sourceLocation: SourceLocation;
|
|
254
|
+
readonly knownTypeNames: ReadonlySet<string>;
|
|
255
|
+
readonly results: InlineUnionWithContext[];
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
interface CollectInlineUnionsFromResolverArgPropertiesParams
|
|
259
|
+
extends CollectInlineUnionsFromResolverPropertiesBaseParams {
|
|
260
|
+
readonly contextKind: "resolverArg";
|
|
261
|
+
readonly argName: string;
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
interface CollectInlineUnionsFromResolverPayloadPropertiesParams
|
|
265
|
+
extends CollectInlineUnionsFromResolverPropertiesBaseParams {
|
|
266
|
+
readonly contextKind: "resolverPayload";
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
type CollectInlineUnionsFromResolverPropertiesParams =
|
|
270
|
+
| CollectInlineUnionsFromResolverArgPropertiesParams
|
|
271
|
+
| CollectInlineUnionsFromResolverPayloadPropertiesParams;
|
|
272
|
+
|
|
273
|
+
/**
|
|
274
|
+
* Unified function for collecting inline unions from nested object properties
|
|
275
|
+
* in both resolver args and payload return types.
|
|
276
|
+
*/
|
|
277
|
+
function collectInlineUnionsFromResolverProperties(
|
|
278
|
+
params: CollectInlineUnionsFromResolverPropertiesParams,
|
|
279
|
+
): void {
|
|
280
|
+
const {
|
|
281
|
+
properties,
|
|
282
|
+
resolverType,
|
|
283
|
+
fieldName,
|
|
284
|
+
parentTypeName,
|
|
285
|
+
parentPath,
|
|
286
|
+
sourceLocation,
|
|
287
|
+
knownTypeNames,
|
|
288
|
+
results,
|
|
289
|
+
} = params;
|
|
290
|
+
|
|
291
|
+
traverseInlineObjectProperties(
|
|
292
|
+
{ properties, parentPath },
|
|
293
|
+
(prop, propPath) => {
|
|
294
|
+
const tsType = prop.tsType;
|
|
295
|
+
|
|
296
|
+
if (tsType.kind === "union" && tsType.members) {
|
|
297
|
+
const members = tsType.members.map((m: TSTypeReference) =>
|
|
298
|
+
createMemberInfo(m, knownTypeNames),
|
|
299
|
+
);
|
|
300
|
+
|
|
301
|
+
const context: AutoTypeNameContext =
|
|
302
|
+
params.contextKind === "resolverArg"
|
|
303
|
+
? {
|
|
304
|
+
kind: "resolverArg",
|
|
305
|
+
resolverType,
|
|
306
|
+
fieldName,
|
|
307
|
+
argName: params.argName,
|
|
308
|
+
parentTypeName,
|
|
309
|
+
fieldPath: propPath,
|
|
310
|
+
}
|
|
311
|
+
: {
|
|
312
|
+
kind: "resolverPayload",
|
|
313
|
+
resolverType,
|
|
314
|
+
fieldName,
|
|
315
|
+
parentTypeName,
|
|
316
|
+
fieldPath: propPath,
|
|
317
|
+
};
|
|
318
|
+
|
|
319
|
+
results.push({
|
|
320
|
+
members,
|
|
321
|
+
context,
|
|
322
|
+
sourceLocation: prop.sourceLocation ?? sourceLocation,
|
|
323
|
+
nullable: tsType.nullable,
|
|
324
|
+
isInputContext: params.contextKind === "resolverArg",
|
|
325
|
+
});
|
|
326
|
+
}
|
|
327
|
+
},
|
|
328
|
+
);
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
export interface CollectInlineUnionsFromPayloadsParams {
|
|
332
|
+
readonly resolversResult: ExtractResolversResult;
|
|
333
|
+
readonly knownTypeNames: ReadonlySet<string>;
|
|
334
|
+
}
|
|
335
|
+
|
|
336
|
+
/**
|
|
337
|
+
* Collect inline unions from resolver return types (Payload types).
|
|
338
|
+
*/
|
|
339
|
+
export function collectInlineUnionsFromPayloads(
|
|
340
|
+
params: CollectInlineUnionsFromPayloadsParams,
|
|
341
|
+
): InlineUnionWithContext[] {
|
|
342
|
+
const { resolversResult, knownTypeNames } = params;
|
|
343
|
+
const results: InlineUnionWithContext[] = [];
|
|
344
|
+
|
|
345
|
+
forEachResolverField(resolversResult, (info) => {
|
|
346
|
+
collectInlineUnionsFromPayloadReturnType({
|
|
347
|
+
...info,
|
|
348
|
+
knownTypeNames,
|
|
349
|
+
results,
|
|
350
|
+
});
|
|
351
|
+
});
|
|
352
|
+
|
|
353
|
+
return results;
|
|
354
|
+
}
|
|
355
|
+
|
|
356
|
+
interface CollectFromPayloadReturnTypeParams extends ResolverFieldInfo {
|
|
357
|
+
readonly knownTypeNames: ReadonlySet<string>;
|
|
358
|
+
readonly results: InlineUnionWithContext[];
|
|
359
|
+
}
|
|
360
|
+
|
|
361
|
+
function collectInlineUnionsFromPayloadReturnType(
|
|
362
|
+
params: CollectFromPayloadReturnTypeParams,
|
|
363
|
+
): void {
|
|
364
|
+
const { field, resolverType, parentTypeName, knownTypeNames, results } =
|
|
365
|
+
params;
|
|
366
|
+
|
|
367
|
+
if (field.returnTypeInlineUnionMembers) {
|
|
368
|
+
const members = field.returnTypeInlineUnionMembers.map(
|
|
369
|
+
(m: TSTypeReference) => createMemberInfo(m, knownTypeNames),
|
|
370
|
+
);
|
|
371
|
+
|
|
372
|
+
const context: AutoTypeNameContext = {
|
|
373
|
+
kind: "resolverPayload",
|
|
374
|
+
resolverType,
|
|
375
|
+
fieldName: field.name,
|
|
376
|
+
parentTypeName,
|
|
377
|
+
fieldPath: [],
|
|
378
|
+
};
|
|
379
|
+
|
|
380
|
+
results.push({
|
|
381
|
+
members,
|
|
382
|
+
context,
|
|
383
|
+
sourceLocation: field.sourceLocation,
|
|
384
|
+
nullable: field.type.nullable,
|
|
385
|
+
isInputContext: false,
|
|
386
|
+
});
|
|
387
|
+
}
|
|
388
|
+
|
|
389
|
+
if (field.returnTypeInlineObjectProperties) {
|
|
390
|
+
collectInlineUnionsFromResolverProperties({
|
|
391
|
+
properties: field.returnTypeInlineObjectProperties,
|
|
392
|
+
resolverType,
|
|
393
|
+
fieldName: field.name,
|
|
394
|
+
parentTypeName,
|
|
395
|
+
parentPath: [],
|
|
396
|
+
sourceLocation: field.sourceLocation,
|
|
397
|
+
knownTypeNames,
|
|
398
|
+
contextKind: "resolverPayload",
|
|
399
|
+
results,
|
|
400
|
+
});
|
|
401
|
+
}
|
|
402
|
+
}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import type {
|
|
2
|
+
SourceLocation,
|
|
3
|
+
TSTypeReference,
|
|
4
|
+
} from "../type-extractor/types/index.js";
|
|
5
|
+
import type { AutoTypeNameContext } from "./naming-convention.js";
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Information about a single member of an inline union type.
|
|
9
|
+
* Tracks the type reference and whether it needs auto-generation.
|
|
10
|
+
*/
|
|
11
|
+
export interface InlineUnionMemberInfo {
|
|
12
|
+
/** Member type reference (can be reference, inlineObject, etc.) */
|
|
13
|
+
readonly memberType: TSTypeReference;
|
|
14
|
+
/** True if this member needs to be auto-generated as a named type */
|
|
15
|
+
readonly needsAutoGeneration: boolean;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Inline union with context information for naming and generation.
|
|
20
|
+
* Used for both Union types (output context) and OneOf Input types (input context).
|
|
21
|
+
*/
|
|
22
|
+
export interface InlineUnionWithContext {
|
|
23
|
+
/** Union members with their type info and auto-generation requirements */
|
|
24
|
+
readonly members: ReadonlyArray<InlineUnionMemberInfo>;
|
|
25
|
+
/** Context for generating the auto type name */
|
|
26
|
+
readonly context: AutoTypeNameContext;
|
|
27
|
+
/** Source location for error reporting */
|
|
28
|
+
readonly sourceLocation: SourceLocation;
|
|
29
|
+
/** Whether this union type is nullable */
|
|
30
|
+
readonly nullable: boolean;
|
|
31
|
+
/** True if this union is in input context (should become @oneOf Input Object) */
|
|
32
|
+
readonly isInputContext: boolean;
|
|
33
|
+
}
|