@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
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
import { PRIMITIVE_TYPE_MAP } from "../shared/constants.js";
|
|
2
|
+
import type {
|
|
3
|
+
InlineObjectMember,
|
|
4
|
+
InlineObjectProperty,
|
|
5
|
+
} from "../type-extractor/types/index.js";
|
|
6
|
+
import type {
|
|
7
|
+
AutoGeneratedField,
|
|
8
|
+
AutoGeneratedType,
|
|
9
|
+
} from "./auto-type-generator.js";
|
|
10
|
+
|
|
11
|
+
function primitiveToGraphQLScalar(primitive: string): string {
|
|
12
|
+
return PRIMITIVE_TYPE_MAP[primitive] ?? "String";
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
function convertInlineObjectPropertyToField(
|
|
16
|
+
property: InlineObjectProperty,
|
|
17
|
+
): AutoGeneratedField {
|
|
18
|
+
const tsType = property.propertyType;
|
|
19
|
+
let typeName: string;
|
|
20
|
+
const nullable = tsType.nullable;
|
|
21
|
+
let list = false;
|
|
22
|
+
let listItemNullable: boolean | null = null;
|
|
23
|
+
|
|
24
|
+
if (tsType.kind === "array" && tsType.elementType) {
|
|
25
|
+
list = true;
|
|
26
|
+
listItemNullable = tsType.elementType.nullable;
|
|
27
|
+
const elementName = tsType.elementType.name ?? "String";
|
|
28
|
+
typeName =
|
|
29
|
+
tsType.elementType.kind === "primitive"
|
|
30
|
+
? primitiveToGraphQLScalar(elementName)
|
|
31
|
+
: elementName;
|
|
32
|
+
} else if (tsType.kind === "reference" && tsType.name) {
|
|
33
|
+
typeName = tsType.name;
|
|
34
|
+
} else if (tsType.kind === "primitive" && tsType.name) {
|
|
35
|
+
typeName = primitiveToGraphQLScalar(tsType.name);
|
|
36
|
+
} else if (tsType.kind === "scalar" && tsType.scalarInfo) {
|
|
37
|
+
typeName = tsType.scalarInfo.scalarName;
|
|
38
|
+
} else {
|
|
39
|
+
typeName = "String";
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
return {
|
|
43
|
+
name: property.propertyName,
|
|
44
|
+
type: {
|
|
45
|
+
typeName,
|
|
46
|
+
nullable,
|
|
47
|
+
list,
|
|
48
|
+
listItemNullable,
|
|
49
|
+
},
|
|
50
|
+
description: property.description,
|
|
51
|
+
deprecated: property.deprecated,
|
|
52
|
+
directives: null,
|
|
53
|
+
defaultValue: null,
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
interface GenerateObjectTypeFromInlineObjectParams {
|
|
58
|
+
readonly inlineObjectMember: InlineObjectMember;
|
|
59
|
+
readonly typeName: string;
|
|
60
|
+
readonly abstractTypeName: string;
|
|
61
|
+
readonly sourceFile: string;
|
|
62
|
+
readonly skipPropertyNames: ReadonlySet<string>;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
export function generateObjectTypeFromInlineObject(
|
|
66
|
+
params: GenerateObjectTypeFromInlineObjectParams,
|
|
67
|
+
): AutoGeneratedType {
|
|
68
|
+
const {
|
|
69
|
+
inlineObjectMember,
|
|
70
|
+
typeName,
|
|
71
|
+
abstractTypeName,
|
|
72
|
+
sourceFile,
|
|
73
|
+
skipPropertyNames,
|
|
74
|
+
} = params;
|
|
75
|
+
const fields: AutoGeneratedField[] = [];
|
|
76
|
+
|
|
77
|
+
for (const property of inlineObjectMember.properties) {
|
|
78
|
+
if (skipPropertyNames.has(property.propertyName)) {
|
|
79
|
+
continue;
|
|
80
|
+
}
|
|
81
|
+
fields.push(convertInlineObjectPropertyToField(property));
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
return {
|
|
85
|
+
name: typeName,
|
|
86
|
+
kind: "Object",
|
|
87
|
+
fields,
|
|
88
|
+
enumValues: null,
|
|
89
|
+
unionMembers: null,
|
|
90
|
+
needsStringEnumMapping: false,
|
|
91
|
+
sourceLocation: { file: sourceFile, line: 1, column: 1 },
|
|
92
|
+
generatedFrom: {
|
|
93
|
+
parentTypeName: abstractTypeName,
|
|
94
|
+
fieldPath: [],
|
|
95
|
+
context: "typeField",
|
|
96
|
+
},
|
|
97
|
+
description: null,
|
|
98
|
+
resolveTypeFieldPattern: null,
|
|
99
|
+
};
|
|
100
|
+
}
|
|
@@ -1,4 +1,8 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type {
|
|
2
|
+
InlineObjectPropertyDef,
|
|
3
|
+
TSTypeReference,
|
|
4
|
+
} from "../type-extractor/types/index.js";
|
|
5
|
+
import { appendFieldPath } from "./naming-convention.js";
|
|
2
6
|
|
|
3
7
|
/**
|
|
4
8
|
* Visitor callback for each property in an inline object hierarchy.
|
|
@@ -15,6 +19,24 @@ export interface TraverseInlineObjectPropertiesParams {
|
|
|
15
19
|
readonly parentPath: ReadonlyArray<string>;
|
|
16
20
|
}
|
|
17
21
|
|
|
22
|
+
export function getInlineObjectPropertiesFromType(
|
|
23
|
+
tsType: TSTypeReference,
|
|
24
|
+
): ReadonlyArray<InlineObjectPropertyDef> | null {
|
|
25
|
+
if (tsType.kind === "inlineObject" && tsType.inlineObjectProperties) {
|
|
26
|
+
return tsType.inlineObjectProperties;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
if (
|
|
30
|
+
tsType.kind === "array" &&
|
|
31
|
+
tsType.elementType?.kind === "inlineObject" &&
|
|
32
|
+
tsType.elementType.inlineObjectProperties
|
|
33
|
+
) {
|
|
34
|
+
return tsType.elementType.inlineObjectProperties;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
return null;
|
|
38
|
+
}
|
|
39
|
+
|
|
18
40
|
/**
|
|
19
41
|
* Traverses inline object properties recursively, calling the visitor for each property.
|
|
20
42
|
* Handles nested inlineObject properties automatically.
|
|
@@ -27,19 +49,23 @@ export function traverseInlineObjectProperties(
|
|
|
27
49
|
visitor: PropertyVisitor,
|
|
28
50
|
): void {
|
|
29
51
|
const { properties, parentPath } = params;
|
|
52
|
+
const siblingFieldNames = new Set(properties.map((prop) => prop.name));
|
|
30
53
|
|
|
31
54
|
for (const prop of properties) {
|
|
32
|
-
const propPath =
|
|
55
|
+
const propPath = appendFieldPath({
|
|
56
|
+
parentPath,
|
|
57
|
+
fieldName: prop.name,
|
|
58
|
+
singularize: prop.tsType.kind === "array",
|
|
59
|
+
siblingFieldNames,
|
|
60
|
+
});
|
|
33
61
|
|
|
34
62
|
visitor(prop, propPath);
|
|
35
63
|
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
prop.tsType.inlineObjectProperties
|
|
39
|
-
) {
|
|
64
|
+
const nestedProperties = getInlineObjectPropertiesFromType(prop.tsType);
|
|
65
|
+
if (nestedProperties) {
|
|
40
66
|
traverseInlineObjectProperties(
|
|
41
67
|
{
|
|
42
|
-
properties:
|
|
68
|
+
properties: nestedProperties,
|
|
43
69
|
parentPath: propPath,
|
|
44
70
|
},
|
|
45
71
|
visitor,
|
|
@@ -7,13 +7,17 @@ import type {
|
|
|
7
7
|
SourceLocation,
|
|
8
8
|
TSTypeReference,
|
|
9
9
|
} from "../type-extractor/types/index.js";
|
|
10
|
-
import {
|
|
10
|
+
import {
|
|
11
|
+
getInlineObjectPropertiesFromType,
|
|
12
|
+
traverseInlineObjectProperties,
|
|
13
|
+
} from "./inline-object-traverser.js";
|
|
11
14
|
import type {
|
|
12
15
|
InlineUnionMemberInfo,
|
|
13
16
|
InlineUnionWithContext,
|
|
14
17
|
} from "./inline-union-types.js";
|
|
15
18
|
import {
|
|
16
19
|
type AutoTypeNameContext,
|
|
20
|
+
appendFieldPath,
|
|
17
21
|
buildFieldContext,
|
|
18
22
|
isInputTypeName,
|
|
19
23
|
} from "./naming-convention.js";
|
|
@@ -59,6 +63,9 @@ export function collectInlineUnionsFromTypes(
|
|
|
59
63
|
|
|
60
64
|
for (const typeInfo of extractedTypes) {
|
|
61
65
|
const isInput = isInputTypeName(typeInfo.metadata.name);
|
|
66
|
+
const siblingFieldNames = new Set(
|
|
67
|
+
typeInfo.fields.map((field) => field.name),
|
|
68
|
+
);
|
|
62
69
|
|
|
63
70
|
for (const field of typeInfo.fields) {
|
|
64
71
|
collectInlineUnionsFromField({
|
|
@@ -68,6 +75,7 @@ export function collectInlineUnionsFromTypes(
|
|
|
68
75
|
isInput,
|
|
69
76
|
sourceFile: typeInfo.metadata.sourceFile,
|
|
70
77
|
knownTypeNames,
|
|
78
|
+
siblingFieldNames,
|
|
71
79
|
results,
|
|
72
80
|
});
|
|
73
81
|
}
|
|
@@ -82,6 +90,7 @@ interface CollectInlineUnionBaseParams {
|
|
|
82
90
|
readonly isInput: boolean;
|
|
83
91
|
readonly sourceFile: string;
|
|
84
92
|
readonly knownTypeNames: ReadonlySet<string>;
|
|
93
|
+
readonly siblingFieldNames: ReadonlySet<string>;
|
|
85
94
|
readonly results: InlineUnionWithContext[];
|
|
86
95
|
}
|
|
87
96
|
|
|
@@ -97,10 +106,16 @@ function collectInlineUnionsFromField(params: CollectFromFieldParams): void {
|
|
|
97
106
|
isInput,
|
|
98
107
|
sourceFile,
|
|
99
108
|
knownTypeNames,
|
|
109
|
+
siblingFieldNames,
|
|
100
110
|
results,
|
|
101
111
|
} = params;
|
|
102
112
|
const tsType = field.tsType;
|
|
103
|
-
const fieldPath =
|
|
113
|
+
const fieldPath = appendFieldPath({
|
|
114
|
+
parentPath,
|
|
115
|
+
fieldName: field.name,
|
|
116
|
+
singularize: tsType.kind === "array",
|
|
117
|
+
siblingFieldNames,
|
|
118
|
+
});
|
|
104
119
|
|
|
105
120
|
if (tsType.kind === "union" && tsType.members) {
|
|
106
121
|
const members = tsType.members.map((m) =>
|
|
@@ -116,6 +131,7 @@ function collectInlineUnionsFromField(params: CollectFromFieldParams): void {
|
|
|
116
131
|
),
|
|
117
132
|
nullable: tsType.nullable,
|
|
118
133
|
isInputContext: isInput,
|
|
134
|
+
unionAliasName: tsType.name,
|
|
119
135
|
});
|
|
120
136
|
}
|
|
121
137
|
|
|
@@ -137,12 +153,14 @@ function collectInlineUnionsFromField(params: CollectFromFieldParams): void {
|
|
|
137
153
|
),
|
|
138
154
|
nullable: tsType.elementType.nullable,
|
|
139
155
|
isInputContext: isInput,
|
|
156
|
+
unionAliasName: tsType.elementType.name,
|
|
140
157
|
});
|
|
141
158
|
}
|
|
142
159
|
|
|
143
|
-
|
|
160
|
+
const inlineObjectProperties = getInlineObjectPropertiesFromType(tsType);
|
|
161
|
+
if (inlineObjectProperties) {
|
|
144
162
|
traverseInlineObjectProperties(
|
|
145
|
-
{ properties:
|
|
163
|
+
{ properties: inlineObjectProperties, parentPath: fieldPath },
|
|
146
164
|
(prop, propPath) => {
|
|
147
165
|
const propTsType = prop.tsType;
|
|
148
166
|
if (propTsType.kind === "union" && propTsType.members) {
|
|
@@ -159,6 +177,7 @@ function collectInlineUnionsFromField(params: CollectFromFieldParams): void {
|
|
|
159
177
|
),
|
|
160
178
|
nullable: propTsType.nullable,
|
|
161
179
|
isInputContext: isInput,
|
|
180
|
+
unionAliasName: propTsType.name,
|
|
162
181
|
});
|
|
163
182
|
}
|
|
164
183
|
},
|
|
@@ -224,6 +243,7 @@ function collectInlineUnionsFromResolverArgs(
|
|
|
224
243
|
sourceLocation: field.sourceLocation,
|
|
225
244
|
nullable: arg.type.nullable,
|
|
226
245
|
isInputContext: true,
|
|
246
|
+
unionAliasName: null,
|
|
227
247
|
});
|
|
228
248
|
}
|
|
229
249
|
|
|
@@ -322,6 +342,7 @@ function collectInlineUnionsFromResolverProperties(
|
|
|
322
342
|
sourceLocation: prop.sourceLocation ?? sourceLocation,
|
|
323
343
|
nullable: tsType.nullable,
|
|
324
344
|
isInputContext: params.contextKind === "resolverArg",
|
|
345
|
+
unionAliasName: tsType.name,
|
|
325
346
|
});
|
|
326
347
|
}
|
|
327
348
|
},
|
|
@@ -383,6 +404,7 @@ function collectInlineUnionsFromPayloadReturnType(
|
|
|
383
404
|
sourceLocation: field.sourceLocation,
|
|
384
405
|
nullable: field.type.nullable,
|
|
385
406
|
isInputContext: false,
|
|
407
|
+
unionAliasName: null,
|
|
386
408
|
});
|
|
387
409
|
}
|
|
388
410
|
|
|
@@ -30,4 +30,6 @@ export interface InlineUnionWithContext {
|
|
|
30
30
|
readonly nullable: boolean;
|
|
31
31
|
/** True if this union is in input context (should become @oneOf Input Object) */
|
|
32
32
|
readonly isInputContext: boolean;
|
|
33
|
+
/** The TypeScript type alias name for this union (for mapping to auto-generated names) */
|
|
34
|
+
readonly unionAliasName: string | null;
|
|
33
35
|
}
|
|
@@ -90,7 +90,7 @@ function validateUnionMemberType(
|
|
|
90
90
|
};
|
|
91
91
|
}
|
|
92
92
|
|
|
93
|
-
if (memberType.kind === "
|
|
93
|
+
if (memberType.kind === "stringLiteral") {
|
|
94
94
|
return {
|
|
95
95
|
code: "INLINE_UNION_ENUM_MEMBER",
|
|
96
96
|
message: `Inline union '${typeName}' contains a literal type '${memberType.name}'. GraphQL unions can only contain object types.`,
|
|
@@ -338,7 +338,7 @@ function extractTypenameFromNamedType(
|
|
|
338
338
|
if (
|
|
339
339
|
field.optional ||
|
|
340
340
|
tsType.nullable ||
|
|
341
|
-
tsType.kind !== "
|
|
341
|
+
tsType.kind !== "stringLiteral" ||
|
|
342
342
|
tsType.name === null
|
|
343
343
|
) {
|
|
344
344
|
return null;
|
|
@@ -445,7 +445,7 @@ export function validateUnionMemberTypenames(
|
|
|
445
445
|
});
|
|
446
446
|
}
|
|
447
447
|
|
|
448
|
-
if (typenameType.kind !== "
|
|
448
|
+
if (typenameType.kind !== "stringLiteral" || typenameType.name === null) {
|
|
449
449
|
diagnostics.push({
|
|
450
450
|
code: "INVALID_TYPENAME_TYPE",
|
|
451
451
|
message: `Union '${unionTypeName}' member at index ${i} has '${selectedFieldName}' that is not a string literal type. Expected a string literal like '${selectedFieldName}: "TypeName"'.`,
|