@@ -60,10 +60,14 @@ export async function generateTypes(
6060 contextType : 'h3#H3Event' ,
6161 maybeValue : 'T | null | undefined' ,
6262 inputMaybeValue : 'T | undefined' ,
63- enumsAsTypes : true ,
64- useTypeImports : true ,
63+ declarationKind : 'interface' ,
64+ allowParentTypeOverride : false ,
65+ // Type safety maximization
6566 strictScalars : true ,
66- emitLegacyCommonJSImports : false ,
67+ // Modern TypeScript support
68+ useTypeImports : true ,
69+ enumsAsTypes : true ,
70+ immutableTypes : true ,
6771 }
6872
6973 const mergedConfig = defu ( config , defaultConfig )
@@ -84,38 +88,58 @@ export async function generateTypes(
8488 plugin : pluginContent ,
8589 } ,
8690 imports : {
87- plugin : ( ) => ( {
88- prepend : [
89- `type Primitive =
90- | null
91- | undefined
92- | string
93- | number
94- | boolean
95- | symbol
96- | bigint;
91+ plugin : ( ) => {
92+ return {
93+ prepend : [
94+ `import { schemas } from '#graphql/schemas'` ,
95+ `import type { StandardSchemaV1 } from 'nitro-graphql'` ,
96+
97+ `
98+ export type SchemaType = Partial<Record<Partial<keyof ResolversTypes>, StandardSchemaV1>>
99+ type SchemaKeys = keyof typeof schemas;
100+
101+ type InferInput<T> = T extends StandardSchemaV1 ? StandardSchemaV1.InferInput<T> : unknown;
102+ type InferOutput<T> = T extends StandardSchemaV1 ? StandardSchemaV1.InferOutput<T> : unknown;
103+
104+ type InferInputFromSchema<T extends SchemaKeys> = InferInput<(typeof schemas)[T]>;
105+ type InferOutputFromSchema<T extends SchemaKeys> = InferOutput<(typeof schemas)[T]>;
106+
107+ type Primitive =
108+ | null
109+ | undefined
110+ | string
111+ | number
112+ | boolean
113+ | symbol
114+ | bigint;
97115
98116type BuiltIns = Primitive | void | Date | RegExp;
99117
118+
100119type ResolverReturnType<T> = T extends BuiltIns
101- ? T
102- : T extends (...args: any[]) => unknown
103- ? T | undefined
104- : T extends object
105- ? T extends Array<infer ItemType> // Test for arrays/tuples, per https://github.com/microsoft/TypeScript/issues/35156
106- ? ItemType[] extends T // Test for arrays (non-tuples) specifically
107- ? Array<ResolverReturnType<ItemType>>
108- : ResolverReturnTypeObject<T> // Tuples behave properly
109- : ResolverReturnTypeObject<T>
110- : unknown;
120+ ? T
121+ : T extends (...args: any[]) => unknown
122+ ? T | undefined
123+ : T extends object
124+ ? T extends Array<infer ItemType> // Test for arrays/tuples, per https://github.com/microsoft/TypeScript/issues/35156
125+ ? ItemType[] extends T // Test for arrays (non-tuples) specifically
126+ ? Array<ResolverReturnType<ItemType>>
127+ : ResolverReturnTypeObject<T> // Tuples behave properly
128+ : ResolverReturnTypeObject<T>
129+ : unknown;
111130
112- type ResolverReturnTypeObject<T extends object> = {
113- [K in keyof T]: ResolverReturnType<T[K]>
114- };` ,
115- '' ,
116- ] ,
117- content : '' ,
118- } ) ,
131+ type ResolverReturnTypeObject<T extends object> =
132+ T extends { __typename?: infer TTypename }
133+ ? TTypename extends SchemaKeys
134+ ? InferOutputFromSchema<TTypename>
135+ : { [K in keyof T]: ResolverReturnType<T[K]> }
136+ : { [K in keyof T]: ResolverReturnType<T[K]> };
137+ ` ,
138+ '' ,
139+ ] ,
140+ content : '' ,
141+ }
142+ } ,
119143 } ,
120144 typescript : typescriptPlugin ,
121145 typescriptResolvers : typescriptResolversPlugin ,
0 commit comments