import { FieldsSelection } from '@genql/runtime/src/client/typeSelection' ; import { NoExtraProperties } from '@genql/runtime' ; type SRC = { literalsUnion : 'a' | 'b' ; nullableField : null | { x : boolean ; optional ? : string ; } ; list : { x : number ; a : string ; optional ? : string ; } [ ] ; nested ? : { list ? : { edges ? : { x ? : number ; } [ ] ; } [ ] ; } ; category : { a : Date ; b : Date ; c : Date ; nested1 : { a : string ; b : string ; c : string ; } ; nested2 : { a : string ; b : string ; } ; optionalFieldsNested ? : { a ? : string ; b ? : number ; } ; } ; optionalFields : { a ? : string ; b ? : number ; } ; order : { customer : { address : { city : 1 ; a : 1 ; b : 1 ; } ; } ; } ; union : { a : string ; __isUnion ? : true ; } | { a : string ; b : string ; __isUnion ? : true ; } ; nesting : { nestedUnion : { a : string ; __isUnion ? : true ; } | { a : string ; b : string ; __isUnion ? : true ; } ; } ; xxx : { xxx : boolean ; } ; yyy : { yyy : boolean ; } ; argumentSyntax : { a : string ; optional ? : string ; nesting : { x : number ; y : number ; } ; union : { a : string ; __isUnion ? : true ; } | { a : string ; b : string ; __isUnion ? : true ; } ; list : { x : number ; a : string ; optional ? : string ; } [ ] ; } ; } ; describe ( 'pick' , ( ) => { const req = { category : { a : 1 , b : 1 , nested1 : { a : 1 } } , argumentSyntax : [ { x : 3 } , { a : 1 , nesting : { __scalar : 1 } } , ] as const } ; const z = { } as any ; test ( 'response type picks from request type' , dontExecute ( ( ) => { z . category ; z . category . a ; z . category . b ; z . category . c ; z . category . nested1 . a ; } ) ) ; test ( 'response type does not have additional properties' , dontExecute ( ( ) => { z . order ; z . category . nested1 . b ; z . category . nested1 . b ; z . category . nested1 . c ; z . category . nested2 ; } ) ) ; test ( 'argument syntax' , dontExecute ( ( ) => { z . argumentSyntax . a . toLocaleLowerCase ; } ) ) ; } ) ; describe ( '__scalar' , ( ) => { const req = { __name : 'name' , category : { __scalar : 1 , nested1 : { a : 1 } } , argumentSyntax : [ { a : 7 } , { __scalar : 1 } , ] as const } ; const z = { } as any ; test ( 'response type picks from request type' , dontExecute ( ( ) => { z . category ; z . category . a ; z . category . b ; z . category . c ; z . category . nested1 . a ; z . category . a . getDate ; z . category . b . getDate ; } ) ) ; test ( 'response type does not have additional properties' , dontExecute ( ( ) => { z . order ; z . category . nested1 . b ; z . category . nested1 . c ; z . category . nested2 ; } ) ) ; test ( '__scalar is not present' , dontExecute ( ( ) => { z . category . __scalar ; } ) ) ; test ( '__name is not present' , dontExecute ( ( ) => { z . __name ; } ) ) ; test ( 'argument syntax' , dontExecute ( ( ) => { z . argumentSyntax . a . toLocaleLowerCase ; z . argumentSyntax . optional ?. big ; z . argumentSyntax . nesting . x ; } ) ) ; } ) ; describe ( 'optional fields' , ( ) => { const req = { optionalFields : { a : 1 , b : 1 } , category : { optionalFieldsNested : { __scalar : 1 } } , argumentSyntax : [ { } , { optional : 1 } , ] as const } ; const z = { } as any ; test ( 'optional fields are preserved' , dontExecute ( ( ) => { z . optionalFields . a . toLocaleLowerCase ; z . optionalFields . a ?. toLocaleLowerCase ; z . optionalFields . b . toLocaleLowerCase ; z . optionalFields . b ?. toFixed ; z . category . optionalFieldsNested . a ; z . category ?. optionalFieldsNested . a ; } ) ) ; test ( 'optional fields are preserved in __scalar' , dontExecute ( ( ) => { z . optionalFields . a . toLocaleLowerCase ; z . optionalFields . a ?. toLocaleLowerCase ; z . optionalFields . b . toLocaleLowerCase ; z . optionalFields . b ?. toFixed ; z . category . optionalFieldsNested . a ; z . category . optionalFieldsNested ?. a ?. toLocaleLowerCase ; } ) ) ; test ( 'argument syntax' , dontExecute ( ( ) => { z . argumentSyntax . optional . toLocaleLowerCase ; z . argumentSyntax . optional ?. toLocaleLowerCase ; } ) ) ; } ) ; describe ( 'unions' , ( ) => { const req = { union : { onX : { a : 1 , __scalar : 1 } } , nesting : { nestedUnion : { onX : { a : 1 } , onY : { b : 1 } } } , argumentSyntax : { union : { a : 1 , onX : { b : 1 } } } } ; const z = { } as any ; test ( 'pick union fields' , dontExecute ( ( ) => { z . union . a . toLocaleLowerCase ; z . union . a . toLocaleLowerCase ; z . nesting . nestedUnion . a . toLocaleLowerCase ; } ) ) ; test ( 'does not have __isUnion' , dontExecute ( ( ) => { z . union . __isUnion ; z . nesting . nestedUnion . __isUnion ; } ) ) ; test ( 'argument syntax' , dontExecute ( ( ) => { z . argumentSyntax . union . a . charAt ; z . argumentSyntax . a ; } ) ) ; } ) ; describe ( 'hide fields in request' , ( ) => { const SKIP = false ; const req = { category : { a : 1 , b : SKIP , c : false as const } } ; const z = { } as any ; } ) ; describe ( 'arrays' , ( ) => { const req = { list : { a : 1 , x : 1 , optional : 1 } , nested : [ { x : 1 } , { __scalar : 1 , list : { edges : { x : 1 } } } , ] as const , argumentSyntax : { list : { x : 1 , optional : 1 } } } ; const z = { } as any ; test ( 'list' , dontExecute ( ( ) => { z . list [ 0 ] . a . charCodeAt ; z . list [ 0 ] . x . toFixed ; } ) ) ; test ( 'nested' , dontExecute ( ( ) => { z . nested ?. list ?. [ 0 ] ?. edges ?. [ 0 ] . x ?. toFixed ; } ) ) ; test ( 'maintain optionals' , dontExecute ( ( ) => { z . list [ 0 ] . optional . bold ; z . list [ 0 ] . optional ?. bold ; } ) ) ; test ( 'args syntax' , dontExecute ( ( ) => { z . argumentSyntax . list [ 0 ] . x ; z . argumentSyntax . list [ 0 ] . optional ?. blink ; z . argumentSyntax . list [ 0 ] . optional . blink ; } ) ) ; } ) ; describe ( 'literals unions' , ( ) => { const req = { literalsUnion : 1 } ; const z = { } as any ; test ( 'literals' , dontExecute ( ( ) => { z . literalsUnion . blink ; z . literalsUnion === 'a' ; z . literalsUnion === 'b' ; z . literalsUnion === 'x' ; } ) ) ; } ) ; describe ( 'literals unions' , ( ) => { const req = { nullableField : { x : 1 , optional : 1 } } ; const z = { } as any ; test ( 'accessible' , dontExecute ( ( ) => { z . nullableField . x ; z . nullableField . optional ?. big ; z . nullableField . optional . big ; } ) ) ; } ) ; test ( 'complex optional type with array' , dontExecute ( ( ) => { interface ForkConnection { edges ? : ( ForkEdge | undefined ) [ ] ; __typename ? : 'ForkConnection' ; } interface ForkEdge { cursor ? : string ; node ? : { x : string ; y : string ; } ; nodes ? : { x ? : string ; y ? : string ; } [ ] ; __typename ? : 'ForkEdge' ; } type X = FieldsSelection < ForkConnection | undefined , { edges ? : { node : { x : 1 ; } ; nodes : { __scalar : 1 ; } ; } ; } > ; const x = { } as any ; x ?. edges ?. [ 0 ] ?. node ?. x ?. toLocaleLowerCase ; x ?. edges ?. [ 0 ] ?. node ?. y ?. toLocaleLowerCase ; x ?. edges ?. [ 0 ] ?. nodes ?. [ 0 ] . x ?. toLocaleLowerCase ; x ?. edges ?. [ 0 ] ?. nodes ?. [ 0 ] . y ?. toLocaleLowerCase ; } ) ) ; function dontExecute ( f ) { return ( ) => { } ; }