@@ -26,19 +26,25 @@ import {
2626  parse , 
2727  ObjectTypeDefinitionNode , 
2828  print , 
29+   GraphQLInterfaceType , 
30+   GraphQLInputObjectType , 
31+   GraphQLUnionType , 
32+   GraphQLScalarType , 
2933}  from  "graphql" ; 
3034
3135import  { 
3236  g , 
3337  GField , 
3438  GObjectType , 
35-   GArg , 
3639  GEnumType , 
3740  GUnionType , 
3841  GInterfaceType , 
3942  GScalarType , 
4043  GOutputType , 
4144  GInputObjectType , 
45+   GInputType , 
46+   GArg , 
47+   GInterfaceField , 
4248}  from  "@graphql-ts/schema" ; 
4349
4450const  builtinScalars  =  new  Set ( specifiedScalarTypes . map ( ( x )  =>  x . name ) ) ; 
@@ -92,11 +98,11 @@ const builtinScalars = new Set(specifiedScalarTypes.map((x) => x.name));
9298 * } 
9399 * ``` 
94100 */ 
95- export  function  extend ( 
101+ export  function  extend < Types   extends   Record < string ,   NamedType > > ( 
96102  extension :
97103    |  Extension 
98104    |  readonly  Extension [ ] 
99-     |  ( ( base : BaseSchemaMeta )  =>  Extension  |  readonly  Extension [ ] ) 
105+     |  ( ( base : BaseSchemaMeta < Types > )  =>  Extension  |  readonly  Extension [ ] ) 
100106) : ( schema : GraphQLSchema )  =>  GraphQLSchema  { 
101107  return  ( schema )  =>  { 
102108    const  getType  =  ( name : string )  =>  { 
@@ -114,76 +120,81 @@ export function extend(
114120      typeof  extension  ===  "function" 
115121        ? extension ( { 
116122            schema, 
123+             all ( name )  { 
124+               return  getType ( name  as  string )  as  any ; 
125+             } , 
117126            object ( name )  { 
118-               const  graphQLType  =  getType ( name ) ; 
127+               const  graphQLType  =  getType ( name   as   string ) ; 
119128              if  ( ! isObjectType ( graphQLType ) )  { 
120129                throw  new  Error ( 
121130                  `There is a type named ${ JSON . stringify (  
122131                    name  
123132                  ) }   in the schema being extended but it is not an object type`
124133                ) ; 
125134              } 
126-               return  graphQLType ; 
135+               return  graphQLType   as   any ; 
127136            } , 
128137            inputObject ( name )  { 
129-               const  graphQLType  =  getType ( name ) ; 
138+               const  graphQLType  =  getType ( name   as   string ) ; 
130139              if  ( ! isInputObjectType ( graphQLType ) )  { 
131140                throw  new  Error ( 
132141                  `There is a type named ${ JSON . stringify (  
133142                    name  
134143                  ) }   in the schema being extended but it is not an input object type`
135144                ) ; 
136145              } 
137-               return  graphQLType ; 
146+               return  graphQLType   as   any ; 
138147            } , 
139148            enum ( name )  { 
140-               const  graphQLType  =  getType ( name ) ; 
149+               const  graphQLType  =  getType ( name   as   string ) ; 
141150              if  ( ! isEnumType ( graphQLType ) )  { 
142151                throw  new  Error ( 
143152                  `There is a type named ${ JSON . stringify (  
144153                    name  
145154                  ) }   in the schema being extended but it is not an enum type`
146155                ) ; 
147156              } 
148-               return  graphQLType ; 
157+               return  graphQLType   as   any ; 
149158            } , 
150159            interface ( name )  { 
151-               const  graphQLType  =  getType ( name ) ; 
160+               const  graphQLType  =  getType ( name   as   string ) ; 
152161              if  ( ! isInterfaceType ( graphQLType ) )  { 
153162                throw  new  Error ( 
154163                  `There is a type named ${ JSON . stringify (  
155164                    name  
156165                  ) }   in the schema being extended but it is not an interface type`
157166                ) ; 
158167              } 
159-               return  graphQLType ; 
168+               return  graphQLType   as   any ; 
160169            } , 
161170            scalar ( name )  { 
162-               if  ( builtinScalars . has ( name ) )  { 
171+               if  ( builtinScalars . has ( name   as   string ) )  { 
163172                throw  new  Error ( 
164-                   `The names of built-in scalars cannot be passed to BaseSchemaInfo.scalar but ${ name }   was passed` 
173+                   `The names of built-in scalars cannot be passed to BaseSchemaInfo.scalar but ${  
174+                     name  as  string  
175+                   }   was passed`
165176                ) ; 
166177              } 
167-               const  graphQLType  =  getType ( name ) ; 
178+               const  graphQLType  =  getType ( name   as   string ) ; 
168179              if  ( ! isScalarType ( graphQLType ) )  { 
169180                throw  new  Error ( 
170181                  `There is a type named ${ JSON . stringify (  
171182                    name  
172183                  ) }   in the schema being extended but it is not a scalar type`
173184                ) ; 
174185              } 
175-               return  graphQLType ; 
186+               return  graphQLType   as   any ; 
176187            } , 
177188            union ( name )  { 
178-               const  graphQLType  =  getType ( name ) ; 
189+               const  graphQLType  =  getType ( name   as   string ) ; 
179190              if  ( ! isUnionType ( graphQLType ) )  { 
180191                throw  new  Error ( 
181192                  `There is a type named ${ JSON . stringify (  
182193                    name  
183194                  ) }   in the schema being extended but it is not a union type`
184195                ) ; 
185196              } 
186-               return  graphQLType ; 
197+               return  graphQLType   as   any ; 
187198            } , 
188199          } ) 
189200        : extension 
@@ -427,12 +438,39 @@ export type Extension = {
427438  //   unreferencedConcreteInterfaceImplementations?: ObjectType<Context, any>[]; 
428439} ; 
429440
441+ export  type  NamedType  = 
442+   |  GObjectType < any ,  unknown > 
443+   |  GInputObjectType < {  [ key : string ] : GArg < GInputType ,  boolean >  } > 
444+   |  GEnumType < Record < string ,  unknown > > 
445+   |  GUnionType < unknown ,  unknown > 
446+   |  GInterfaceType < 
447+       unknown , 
448+       Record < string ,  GInterfaceField < any ,  GOutputType < unknown > ,  unknown > > , 
449+       unknown 
450+     > 
451+   |  GScalarType < unknown > ; 
452+ 
453+ export  type  NamedTypes  =  Record < string  &  { } ,  NamedType > ; 
454+ 
455+ type  TypeOfKind < Types  extends  Record < string ,  NamedType > ,  Constraint >  =  { 
456+   [ K  in  keyof  Types ] : Extract < Types [ K ] ,  Constraint >  extends  never  ? never  : K ; 
457+ } [ keyof  Types ] ; 
458+ 
430459/** 
431460 * This object contains the schema being extended and functions to get GraphQL 
432461 * types from the schema. 
433462 */ 
434- export  type  BaseSchemaMeta  =  { 
463+ export  type  BaseSchemaMeta < 
464+   Types  extends  Record < string ,  NamedType >  =  NamedTypes , 
465+ >  =  { 
435466  schema : GraphQLSchema ; 
467+   all < 
468+     Name  extends  { 
469+       [ K  in  keyof  Types ] : string  extends  K  ? never  : K ; 
470+     } [ keyof  Types ] , 
471+   > ( 
472+     name : Name 
473+   ) : Types [ Name ] ; 
436474  /** 
437475   * Gets an {@link  GObjectType object type} from the existing GraphQL schema. If 
438476   * there is no object type in the existing schema with the name passed, an 
@@ -453,7 +491,9 @@ export type BaseSchemaMeta = {
453491   * }))(originalSchema); 
454492   * ``` 
455493   */ 
456-   object ( name : string ) : GObjectType < unknown ,  unknown > ; 
494+   object < Name  extends  TypeOfKind < Types ,  GraphQLObjectType > > ( 
495+     name : Name 
496+   ) : Extract < Types [ Name ] ,  GraphQLObjectType > ; 
457497  /** 
458498   * Gets an {@link  GInputObjectType input object type} from the existing GraphQL 
459499   * schema. If there is no input object type in the existing schema with the 
@@ -480,9 +520,9 @@ export type BaseSchemaMeta = {
480520   * }))(originalSchema); 
481521   * ``` 
482522   */ 
483-   inputObject ( 
484-     name : string 
485-   ) : GInputObjectType < {   [ key :  string ] :  GArg < any ,   boolean >   } ,   boolean > ; 
523+   inputObject < Name   extends   TypeOfKind < Types ,   GraphQLInputObjectType > > ( 
524+     name : Name 
525+   ) : Extract < Types [ Name ] ,   GraphQLInputObjectType > ; 
486526  /** 
487527   * Gets an {@link  GEnumType enum type} from the existing GraphQL schema. If 
488528   * there is no enum type in the existing schema with the name passed, an error 
@@ -508,7 +548,9 @@ export type BaseSchemaMeta = {
508548   * }))(originalSchema); 
509549   * ``` 
510550   */ 
511-   enum ( name : string ) : GEnumType < Record < string ,  unknown > > ; 
551+   enum < Name  extends  TypeOfKind < Types ,  GEnumType < any > > > ( 
552+     name : Name 
553+   ) : Extract < Types [ Name ] ,  GEnumType < any > > ; 
512554  /** 
513555   * Gets a {@link  GUnionType union type} from the existing GraphQL schema. If 
514556   * there is no union type in the existing schema with the name passed, an 
@@ -529,7 +571,9 @@ export type BaseSchemaMeta = {
529571   * }))(originalSchema); 
530572   * ``` 
531573   */ 
532-   union ( name : string ) : GUnionType < unknown ,  unknown > ; 
574+   union < Name  extends  TypeOfKind < Types ,  GraphQLUnionType > > ( 
575+     name : Name 
576+   ) : Extract < Types [ Name ] ,  GraphQLUnionType > ; 
533577  /** 
534578   * Gets an {@link  GInterfaceType interface type} from the existing GraphQL 
535579   * schema. If there is no interface type in the existing schema with the name 
@@ -550,7 +594,9 @@ export type BaseSchemaMeta = {
550594   * }))(originalSchema); 
551595   * ``` 
552596   */ 
553-   interface ( name : string ) : GInterfaceType < unknown ,  any ,  unknown > ; 
597+   interface < Name  extends  TypeOfKind < Types ,  GraphQLInterfaceType > > ( 
598+     name : Name 
599+   ) : Extract < Types [ Name ] ,  GraphQLInterfaceType > ; 
554600  /** 
555601   * Gets a {@link  GScalarType scalar type} from the existing GraphQL schema. If 
556602   * there is no scalar type in the existing schema with the name passed, an 
@@ -579,7 +625,9 @@ export type BaseSchemaMeta = {
579625   * }))(originalSchema); 
580626   * ``` 
581627   */ 
582-   scalar ( name : string ) : GScalarType < unknown > ; 
628+   scalar < Name  extends  TypeOfKind < Types ,  GraphQLScalarType < any > > > ( 
629+     name : Name 
630+   ) : Extract < Types [ Name ] ,  GraphQLScalarType < any > > ; 
583631} ; 
584632
585633function  findObjectTypeUsages ( 
0 commit comments