From f7c9fe2ee7db171e56966b56cb303145e596f8e7 Mon Sep 17 00:00:00 2001 From: Sergej Nikolaev Date: Tue, 4 Dec 2018 01:47:37 +0300 Subject: [PATCH 1/8] Allow undefined for nullable graphql types --- packages/graphqlgen/src/generators/common.ts | 39 +- packages/graphqlgen/src/source-helper.ts | 11 +- .../flow/__snapshots__/basic.test.ts.snap | 130 +++++-- .../__snapshots__/large-schema.test.ts.snap | 348 +++++++++++------ .../__snapshots__/basic.test.ts.snap | 208 ++++++---- .../__snapshots__/large-schema.test.ts.snap | 356 ++++++++++++------ 6 files changed, 730 insertions(+), 362 deletions(-) diff --git a/packages/graphqlgen/src/generators/common.ts b/packages/graphqlgen/src/generators/common.ts index 6d6ba078..9fef4c9a 100644 --- a/packages/graphqlgen/src/generators/common.ts +++ b/packages/graphqlgen/src/generators/common.ts @@ -193,25 +193,26 @@ export function printFieldLikeType( field: GraphQLTypeField, modelMap: ModelMap, ) { - const isNullable = - field.defaultValue === null || - (!field.type.isRequired && field.defaultValue === undefined) - - if (field.type.isScalar) { - return `${getTypeFromGraphQLType(field.type.name)}${ - field.type.isArray ? '[]' : '' - }${isNullable ? '| null' : ''}` - } - - if (field.type.isInput || field.type.isEnum) { - return `${field.type.name}${field.type.isArray ? '[]' : ''}${ - isNullable ? '| null' : '' - }` - } - - return `${getModelName(field.type, modelMap)}${ - field.type.isArray ? '[]' : '' - }${isNullable ? '| null' : ''}` + const name = field.type.isScalar + ? getTypeFromGraphQLType(field.type.name) + : field.type.isInput || field.type.isEnum + ? field.type.name + : getModelName(field.type, modelMap) + + const isRequired = field.type.isArray + ? field.type.isArrayRequired + : field.type.isRequired + const suffix = isRequired + ? '' + : field.defaultValue === null + ? ' | null' + : field.defaultValue === undefined + ? ' | null | undefined' + : '' + const type = field.type.isArray + ? name + (field.type.isRequired ? '' : ' | null | undefined') + : name + suffix + return field.type.isArray ? `Array<${type}>${suffix}` : type } export function getTypeFromGraphQLType( diff --git a/packages/graphqlgen/src/source-helper.ts b/packages/graphqlgen/src/source-helper.ts index 467541b7..4e14d1fe 100644 --- a/packages/graphqlgen/src/source-helper.ts +++ b/packages/graphqlgen/src/source-helper.ts @@ -46,6 +46,7 @@ type GraphQLTypeDefinition = { export type GraphQLType = GraphQLTypeDefinition & { isArray: boolean + isArrayRequired: boolean isRequired: boolean } @@ -83,6 +84,7 @@ export type GraphQLUnionObject = { interface FinalType { isRequired: boolean isArray: boolean + isArrayRequired: boolean type: GraphQLInputType | GraphQLOutputType } @@ -130,13 +132,15 @@ function extractTypeDefinition( const getFinalType = ( type: GraphQLInputType | GraphQLOutputType, - acc: FinalType = { isArray: false, isRequired: false, type }, + acc: FinalType = { isArray: false, isArrayRequired: false, isRequired: false, type }, ): FinalType => { if (type instanceof GraphQLNonNull) { acc.isRequired = true } if (type instanceof GraphQLList) { acc.isArray = true + acc.isArrayRequired = acc.isRequired + acc.isRequired = false } if (type instanceof GraphQLNonNull || type instanceof GraphQLList) { @@ -157,13 +161,16 @@ function extractTypeLike( type: GraphQLInputType | GraphQLOutputType, ): GraphQLType { const typeLike: GraphQLType = {} as GraphQLType - const { isArray, isRequired, type: finalType } = getFinalType(type) + const { isArray, isArrayRequired, isRequired, type: finalType } = getFinalType(type) if (isRequired) { typeLike.isRequired = true } if (isArray) { typeLike.isArray = true } + if (isArrayRequired) { + typeLike.isArrayRequired = true + } if ( finalType instanceof GraphQLObjectType || finalType instanceof GraphQLInterfaceType || diff --git a/packages/graphqlgen/src/tests/flow/__snapshots__/basic.test.ts.snap b/packages/graphqlgen/src/tests/flow/__snapshots__/basic.test.ts.snap index 124e009d..7d8f2a07 100644 --- a/packages/graphqlgen/src/tests/flow/__snapshots__/basic.test.ts.snap +++ b/packages/graphqlgen/src/tests/flow/__snapshots__/basic.test.ts.snap @@ -24,7 +24,7 @@ export type Query_CreateUser_Resolver = ( args: Query_Args_CreateUser, ctx: Context, info: GraphQLResolveInfo -) => User | null | Promise; +) => User | null | undefined | Promise; export interface Query_Resolvers { createUser: ( @@ -32,7 +32,7 @@ export interface Query_Resolvers { args: Query_Args_CreateUser, ctx: Context, info: GraphQLResolveInfo - ) => User | null | Promise; + ) => User | null | undefined | Promise; } // Types for User @@ -172,7 +172,7 @@ export const Mutation_defaultResolvers = {}; export interface Mutation_AddMemberData { email: string; - projects: string[]; + projects: Array; } export interface Mutation_Args_AddMember { @@ -205,7 +205,7 @@ export type AddMemberPayload_Json_Resolver = ( args: {}, ctx: Context, info: GraphQLResolveInfo -) => string | null | Promise; +) => string | null | undefined | Promise; export interface AddMemberPayload_Resolvers { json: ( @@ -213,7 +213,7 @@ export interface AddMemberPayload_Resolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => string | null | Promise; + ) => string | null | undefined | Promise; } export interface Resolvers { @@ -317,21 +317,27 @@ export type Query_Custom_nullable_Resolver = ( args: {}, ctx: Context, info: GraphQLResolveInfo -) => Number | null | Promise; +) => Number | null | undefined | Promise; export type Query_Custom_array_nullable_Resolver = ( parent: {}, args: {}, ctx: Context, info: GraphQLResolveInfo -) => Number[] | null | Promise; +) => + | Array + | null + | undefined + | Promise | null | undefined>; export type Query_Custom_array_required_Resolver = ( parent: {}, args: {}, ctx: Context, info: GraphQLResolveInfo -) => Number[] | Promise; +) => + | Array + | Promise>; export type Query_Custom_with_arg_Resolver = ( parent: {}, @@ -359,21 +365,27 @@ export type Query_Scalar_nullable_Resolver = ( args: {}, ctx: Context, info: GraphQLResolveInfo -) => boolean | null | Promise; +) => boolean | null | undefined | Promise; export type Query_Scalar_array_nullable_Resolver = ( parent: {}, args: {}, ctx: Context, info: GraphQLResolveInfo -) => boolean[] | null | Promise; +) => + | Array + | null + | undefined + | Promise | null | undefined>; export type Query_Scalar_array_required_Resolver = ( parent: {}, args: {}, ctx: Context, info: GraphQLResolveInfo -) => boolean[] | Promise; +) => + | Array + | Promise>; export type Query_Scalar_with_arg_Resolver = ( parent: {}, @@ -409,21 +421,27 @@ export interface Query_Resolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => Number | null | Promise; + ) => Number | null | undefined | Promise; custom_array_nullable: ( parent: {}, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => Number[] | null | Promise; + ) => + | Array + | null + | undefined + | Promise | null | undefined>; custom_array_required: ( parent: {}, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => Number[] | Promise; + ) => + | Array + | Promise>; custom_with_arg: ( parent: {}, @@ -451,21 +469,27 @@ export interface Query_Resolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => boolean | null | Promise; + ) => boolean | null | undefined | Promise; scalar_array_nullable: ( parent: {}, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => boolean[] | null | Promise; + ) => + | Array + | null + | undefined + | Promise | null | undefined>; scalar_array_required: ( parent: {}, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => boolean[] | Promise; + ) => + | Array + | Promise>; scalar_with_arg: ( parent: {}, @@ -493,14 +517,14 @@ export type Number_Id_Resolver = ( args: {}, ctx: Context, info: GraphQLResolveInfo -) => string | null | Promise; +) => string | null | undefined | Promise; export type Number_Value_Resolver = ( parent: Number, args: {}, ctx: Context, info: GraphQLResolveInfo -) => number | null | Promise; +) => number | null | undefined | Promise; export interface Number_Resolvers { id: ( @@ -508,14 +532,14 @@ export interface Number_Resolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => string | null | Promise; + ) => string | null | undefined | Promise; value: ( parent: Number, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => number | null | Promise; + ) => number | null | undefined | Promise; } export interface Resolvers { @@ -702,7 +726,7 @@ export type Professor_Degree_Resolver = ( args: {}, ctx: Context, info: GraphQLResolveInfo -) => string | null | Promise; +) => string | null | undefined | Promise; export interface Professor_Resolvers { degree: ( @@ -710,7 +734,7 @@ export interface Professor_Resolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => string | null | Promise; + ) => string | null | undefined | Promise; } export interface Resolvers { @@ -802,7 +826,7 @@ export type Query_CreateUser_Resolver = ( args: {}, ctx: Context, info: GraphQLResolveInfo -) => User | null | Promise; +) => User | null | undefined | Promise; export interface Query_Resolvers { createUser: ( @@ -810,7 +834,7 @@ export interface Query_Resolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => User | null | Promise; + ) => User | null | undefined | Promise; } // Types for User @@ -935,21 +959,27 @@ export type Query_Custom_nullable_Resolver = ( args: {}, ctx: Context, info: GraphQLResolveInfo -) => NumberNode | null | Promise; +) => NumberNode | null | undefined | Promise; export type Query_Custom_array_nullable_Resolver = ( parent: {}, args: {}, ctx: Context, info: GraphQLResolveInfo -) => NumberNode[] | null | Promise; +) => + | Array + | null + | undefined + | Promise | null | undefined>; export type Query_Custom_array_required_Resolver = ( parent: {}, args: {}, ctx: Context, info: GraphQLResolveInfo -) => NumberNode[] | Promise; +) => + | Array + | Promise>; export type Query_Custom_with_arg_Resolver = ( parent: {}, @@ -977,21 +1007,27 @@ export type Query_Scalar_nullable_Resolver = ( args: {}, ctx: Context, info: GraphQLResolveInfo -) => boolean | null | Promise; +) => boolean | null | undefined | Promise; export type Query_Scalar_array_nullable_Resolver = ( parent: {}, args: {}, ctx: Context, info: GraphQLResolveInfo -) => boolean[] | null | Promise; +) => + | Array + | null + | undefined + | Promise | null | undefined>; export type Query_Scalar_array_required_Resolver = ( parent: {}, args: {}, ctx: Context, info: GraphQLResolveInfo -) => boolean[] | Promise; +) => + | Array + | Promise>; export type Query_Scalar_with_arg_Resolver = ( parent: {}, @@ -1027,21 +1063,27 @@ export interface Query_Resolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => NumberNode | null | Promise; + ) => NumberNode | null | undefined | Promise; custom_array_nullable: ( parent: {}, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => NumberNode[] | null | Promise; + ) => + | Array + | null + | undefined + | Promise | null | undefined>; custom_array_required: ( parent: {}, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => NumberNode[] | Promise; + ) => + | Array + | Promise>; custom_with_arg: ( parent: {}, @@ -1069,21 +1111,27 @@ export interface Query_Resolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => boolean | null | Promise; + ) => boolean | null | undefined | Promise; scalar_array_nullable: ( parent: {}, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => boolean[] | null | Promise; + ) => + | Array + | null + | undefined + | Promise | null | undefined>; scalar_array_required: ( parent: {}, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => boolean[] | Promise; + ) => + | Array + | Promise>; scalar_with_arg: ( parent: {}, @@ -1111,14 +1159,14 @@ export type Number_Id_Resolver = ( args: {}, ctx: Context, info: GraphQLResolveInfo -) => string | null | Promise; +) => string | null | undefined | Promise; export type Number_Value_Resolver = ( parent: NumberNode, args: {}, ctx: Context, info: GraphQLResolveInfo -) => number | null | Promise; +) => number | null | undefined | Promise; export interface Number_Resolvers { id: ( @@ -1126,14 +1174,14 @@ export interface Number_Resolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => string | null | Promise; + ) => string | null | undefined | Promise; value: ( parent: NumberNode, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => number | null | Promise; + ) => number | null | undefined | Promise; } export interface Resolvers { diff --git a/packages/graphqlgen/src/tests/flow/__snapshots__/large-schema.test.ts.snap b/packages/graphqlgen/src/tests/flow/__snapshots__/large-schema.test.ts.snap index 58d2d337..11acad8b 100644 --- a/packages/graphqlgen/src/tests/flow/__snapshots__/large-schema.test.ts.snap +++ b/packages/graphqlgen/src/tests/flow/__snapshots__/large-schema.test.ts.snap @@ -64,7 +64,7 @@ export interface Query_Args_HomesInPriceRange { } export interface Query_Args_ExperiencesByCity { - cities: string[]; + cities: Array; } export type Query_TopExperiences_Resolver = ( @@ -72,56 +72,56 @@ export type Query_TopExperiences_Resolver = ( args: {}, ctx: Context, info: GraphQLResolveInfo -) => Experience[] | Promise; +) => Array | Promise>; export type Query_TopHomes_Resolver = ( parent: {}, args: {}, ctx: Context, info: GraphQLResolveInfo -) => Home[] | Promise; +) => Array | Promise>; export type Query_HomesInPriceRange_Resolver = ( parent: {}, args: Query_Args_HomesInPriceRange, ctx: Context, info: GraphQLResolveInfo -) => Home[] | Promise; +) => Array | Promise>; export type Query_TopReservations_Resolver = ( parent: {}, args: {}, ctx: Context, info: GraphQLResolveInfo -) => Reservation[] | Promise; +) => Array | Promise>; export type Query_FeaturedDestinations_Resolver = ( parent: {}, args: {}, ctx: Context, info: GraphQLResolveInfo -) => Neighbourhood[] | Promise; +) => Array | Promise>; export type Query_ExperiencesByCity_Resolver = ( parent: {}, args: Query_Args_ExperiencesByCity, ctx: Context, info: GraphQLResolveInfo -) => ExperiencesByCity[] | Promise; +) => Array | Promise>; export type Query_Viewer_Resolver = ( parent: {}, args: {}, ctx: Context, info: GraphQLResolveInfo -) => Viewer | null | Promise; +) => Viewer | null | undefined | Promise; export type Query_MyLocation_Resolver = ( parent: {}, args: {}, ctx: Context, info: GraphQLResolveInfo -) => Location | null | Promise; +) => Location | null | undefined | Promise; export interface Query_Resolvers { topExperiences: ( @@ -129,56 +129,56 @@ export interface Query_Resolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => Experience[] | Promise; + ) => Array | Promise>; topHomes: ( parent: {}, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => Home[] | Promise; + ) => Array | Promise>; homesInPriceRange: ( parent: {}, args: Query_Args_HomesInPriceRange, ctx: Context, info: GraphQLResolveInfo - ) => Home[] | Promise; + ) => Array | Promise>; topReservations: ( parent: {}, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => Reservation[] | Promise; + ) => Array | Promise>; featuredDestinations: ( parent: {}, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => Neighbourhood[] | Promise; + ) => Array | Promise>; experiencesByCity: ( parent: {}, args: Query_Args_ExperiencesByCity, ctx: Context, info: GraphQLResolveInfo - ) => ExperiencesByCity[] | Promise; + ) => Array | Promise>; viewer: ( parent: {}, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => Viewer | null | Promise; + ) => Viewer | null | undefined | Promise; myLocation: ( parent: {}, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => Location | null | Promise; + ) => Location | null | undefined | Promise; } // Types for Experience @@ -206,7 +206,11 @@ export type Experience_Category_Resolver = ( args: {}, ctx: Context, info: GraphQLResolveInfo -) => ExperienceCategory | null | Promise; +) => + | ExperienceCategory + | null + | undefined + | Promise; export type Experience_Title_Resolver = ( parent: Experience, @@ -234,7 +238,7 @@ export type Experience_Reviews_Resolver = ( args: {}, ctx: Context, info: GraphQLResolveInfo -) => Review[] | Promise; +) => Array | Promise>; export type Experience_Preview_Resolver = ( parent: Experience, @@ -263,7 +267,11 @@ export interface Experience_Resolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => ExperienceCategory | null | Promise; + ) => + | ExperienceCategory + | null + | undefined + | Promise; title: ( parent: Experience, @@ -291,7 +299,7 @@ export interface Experience_Resolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => Review[] | Promise; + ) => Array | Promise>; preview: ( parent: Experience, @@ -343,7 +351,7 @@ export type ExperienceCategory_Experience_Resolver = ( args: {}, ctx: Context, info: GraphQLResolveInfo -) => Experience | null | Promise; +) => Experience | null | undefined | Promise; export interface ExperienceCategory_Resolvers { id: ( @@ -372,7 +380,7 @@ export interface ExperienceCategory_Resolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => Experience | null | Promise; + ) => Experience | null | undefined | Promise; } // Types for Location @@ -412,14 +420,14 @@ export type Location_Address_Resolver = ( args: {}, ctx: Context, info: GraphQLResolveInfo -) => string | null | Promise; +) => string | null | undefined | Promise; export type Location_Directions_Resolver = ( parent: Location, args: {}, ctx: Context, info: GraphQLResolveInfo -) => string | null | Promise; +) => string | null | undefined | Promise; export interface Location_Resolvers { id: ( @@ -448,14 +456,14 @@ export interface Location_Resolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => string | null | Promise; + ) => string | null | undefined | Promise; directions: ( parent: Location, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => string | null | Promise; + ) => string | null | undefined | Promise; } // Types for Review @@ -663,7 +671,7 @@ export const Home_defaultResolvers = { }; export interface Home_Args_Pictures { - first: number | null; + first: number | null | undefined; } export type Home_Id_Resolver = ( @@ -678,7 +686,7 @@ export type Home_Name_Resolver = ( args: {}, ctx: Context, info: GraphQLResolveInfo -) => string | null | Promise; +) => string | null | undefined | Promise; export type Home_Description_Resolver = ( parent: Home, @@ -699,14 +707,14 @@ export type Home_AvgRating_Resolver = ( args: {}, ctx: Context, info: GraphQLResolveInfo -) => number | null | Promise; +) => number | null | undefined | Promise; export type Home_Pictures_Resolver = ( parent: Home, args: Home_Args_Pictures, ctx: Context, info: GraphQLResolveInfo -) => Picture[] | Promise; +) => Array | Promise>; export type Home_PerNight_Resolver = ( parent: Home, @@ -728,7 +736,7 @@ export interface Home_Resolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => string | null | Promise; + ) => string | null | undefined | Promise; description: ( parent: Home, @@ -749,14 +757,14 @@ export interface Home_Resolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => number | null | Promise; + ) => number | null | undefined | Promise; pictures: ( parent: Home, args: Home_Args_Pictures, ctx: Context, info: GraphQLResolveInfo - ) => Picture[] | Promise; + ) => Array | Promise>; perNight: ( parent: Home, @@ -804,7 +812,7 @@ export type Reservation_Pictures_Resolver = ( args: {}, ctx: Context, info: GraphQLResolveInfo -) => Picture[] | Promise; +) => Array | Promise>; export type Reservation_Location_Resolver = ( parent: Reservation, @@ -861,7 +869,7 @@ export interface Reservation_Resolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => Picture[] | Promise; + ) => Array | Promise>; location: ( parent: Reservation, @@ -930,7 +938,7 @@ export type Neighbourhood_HomePreview_Resolver = ( args: {}, ctx: Context, info: GraphQLResolveInfo -) => Picture | null | Promise; +) => Picture | null | undefined | Promise; export type Neighbourhood_City_Resolver = ( parent: Neighbourhood, @@ -980,7 +988,7 @@ export interface Neighbourhood_Resolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => Picture | null | Promise; + ) => Picture | null | undefined | Promise; city: ( parent: Neighbourhood, @@ -1051,7 +1059,7 @@ export type ExperiencesByCity_Experiences_Resolver = ( args: {}, ctx: Context, info: GraphQLResolveInfo -) => Experience[] | Promise; +) => Array | Promise>; export type ExperiencesByCity_City_Resolver = ( parent: ExperiencesByCity, @@ -1066,7 +1074,7 @@ export interface ExperiencesByCity_Resolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => Experience[] | Promise; + ) => Array | Promise>; city: ( parent: ExperiencesByCity, @@ -1094,7 +1102,7 @@ export type Viewer_Bookings_Resolver = ( args: {}, ctx: Context, info: GraphQLResolveInfo -) => Booking[] | Promise; +) => Array | Promise>; export interface Viewer_Resolvers { me: ( @@ -1109,7 +1117,7 @@ export interface Viewer_Resolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => Booking[] | Promise; + ) => Array | Promise>; } // Types for User @@ -1141,7 +1149,11 @@ export type User_Bookings_Resolver = ( args: {}, ctx: Context, info: GraphQLResolveInfo -) => Booking[] | Promise; +) => + | Array + | null + | undefined + | Promise | null | undefined>; export type User_CreatedAt_Resolver = ( parent: User, @@ -1169,7 +1181,11 @@ export type User_HostingExperiences_Resolver = ( args: {}, ctx: Context, info: GraphQLResolveInfo -) => Experience[] | Promise; +) => + | Array + | null + | undefined + | Promise | null | undefined>; export type User_Id_Resolver = ( parent: User, @@ -1204,21 +1220,29 @@ export type User_Notifications_Resolver = ( args: {}, ctx: Context, info: GraphQLResolveInfo -) => Notification[] | Promise; +) => + | Array + | null + | undefined + | Promise | null | undefined>; export type User_OwnedPlaces_Resolver = ( parent: User, args: {}, ctx: Context, info: GraphQLResolveInfo -) => Place[] | Promise; +) => Array | null | undefined | Promise | null | undefined>; export type User_PaymentAccount_Resolver = ( parent: User, args: {}, ctx: Context, info: GraphQLResolveInfo -) => PaymentAccount[] | Promise; +) => + | Array + | null + | undefined + | Promise | null | undefined>; export type User_Phone_Resolver = ( parent: User, @@ -1232,35 +1256,43 @@ export type User_ProfilePicture_Resolver = ( args: {}, ctx: Context, info: GraphQLResolveInfo -) => Picture | null | Promise; +) => Picture | null | undefined | Promise; export type User_ReceivedMessages_Resolver = ( parent: User, args: {}, ctx: Context, info: GraphQLResolveInfo -) => Message[] | Promise; +) => + | Array + | null + | undefined + | Promise | null | undefined>; export type User_ResponseRate_Resolver = ( parent: User, args: {}, ctx: Context, info: GraphQLResolveInfo -) => number | null | Promise; +) => number | null | undefined | Promise; export type User_ResponseTime_Resolver = ( parent: User, args: {}, ctx: Context, info: GraphQLResolveInfo -) => number | null | Promise; +) => number | null | undefined | Promise; export type User_SentMessages_Resolver = ( parent: User, args: {}, ctx: Context, info: GraphQLResolveInfo -) => Message[] | Promise; +) => + | Array + | null + | undefined + | Promise | null | undefined>; export type User_UpdatedAt_Resolver = ( parent: User, @@ -1282,7 +1314,11 @@ export interface User_Resolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => Booking[] | Promise; + ) => + | Array + | null + | undefined + | Promise | null | undefined>; createdAt: ( parent: User, @@ -1310,7 +1346,11 @@ export interface User_Resolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => Experience[] | Promise; + ) => + | Array + | null + | undefined + | Promise | null | undefined>; id: ( parent: User, @@ -1345,21 +1385,33 @@ export interface User_Resolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => Notification[] | Promise; + ) => + | Array + | null + | undefined + | Promise | null | undefined>; ownedPlaces: ( parent: User, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => Place[] | Promise; + ) => + | Array + | null + | undefined + | Promise | null | undefined>; paymentAccount: ( parent: User, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => PaymentAccount[] | Promise; + ) => + | Array + | null + | undefined + | Promise | null | undefined>; phone: ( parent: User, @@ -1373,35 +1425,43 @@ export interface User_Resolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => Picture | null | Promise; + ) => Picture | null | undefined | Promise; receivedMessages: ( parent: User, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => Message[] | Promise; + ) => + | Array + | null + | undefined + | Promise | null | undefined>; responseRate: ( parent: User, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => number | null | Promise; + ) => number | null | undefined | Promise; responseTime: ( parent: User, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => number | null | Promise; + ) => number | null | undefined | Promise; sentMessages: ( parent: User, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => Message[] | Promise; + ) => + | Array + | null + | undefined + | Promise | null | undefined>; updatedAt: ( parent: User, @@ -1570,14 +1630,14 @@ export type Place_Name_Resolver = ( args: {}, ctx: Context, info: GraphQLResolveInfo -) => string | null | Promise; +) => string | null | undefined | Promise; export type Place_Size_Resolver = ( parent: Place, args: {}, ctx: Context, info: GraphQLResolveInfo -) => PLACE_SIZES | null | Promise; +) => PLACE_SIZES | null | undefined | Promise; export type Place_ShortDescription_Resolver = ( parent: Place, @@ -1633,7 +1693,7 @@ export type Place_Reviews_Resolver = ( args: {}, ctx: Context, info: GraphQLResolveInfo -) => Review[] | Promise; +) => Array | Promise>; export type Place_Amenities_Resolver = ( parent: Place, @@ -1675,35 +1735,43 @@ export type Place_GuestRequirements_Resolver = ( args: {}, ctx: Context, info: GraphQLResolveInfo -) => GuestRequirements | null | Promise; +) => + | GuestRequirements + | null + | undefined + | Promise; export type Place_Policies_Resolver = ( parent: Place, args: {}, ctx: Context, info: GraphQLResolveInfo -) => Policies | null | Promise; +) => Policies | null | undefined | Promise; export type Place_HouseRules_Resolver = ( parent: Place, args: {}, ctx: Context, info: GraphQLResolveInfo -) => HouseRules | null | Promise; +) => HouseRules | null | undefined | Promise; export type Place_Bookings_Resolver = ( parent: Place, args: {}, ctx: Context, info: GraphQLResolveInfo -) => Booking[] | Promise; +) => Array | Promise>; export type Place_Pictures_Resolver = ( parent: Place, args: {}, ctx: Context, info: GraphQLResolveInfo -) => Picture[] | Promise; +) => + | Array + | null + | undefined + | Promise | null | undefined>; export type Place_Popularity_Resolver = ( parent: Place, @@ -1725,14 +1793,14 @@ export interface Place_Resolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => string | null | Promise; + ) => string | null | undefined | Promise; size: ( parent: Place, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => PLACE_SIZES | null | Promise; + ) => PLACE_SIZES | null | undefined | Promise; shortDescription: ( parent: Place, @@ -1788,7 +1856,7 @@ export interface Place_Resolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => Review[] | Promise; + ) => Array | Promise>; amenities: ( parent: Place, @@ -1830,35 +1898,43 @@ export interface Place_Resolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => GuestRequirements | null | Promise; + ) => + | GuestRequirements + | null + | undefined + | Promise; policies: ( parent: Place, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => Policies | null | Promise; + ) => Policies | null | undefined | Promise; houseRules: ( parent: Place, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => HouseRules | null | Promise; + ) => HouseRules | null | undefined | Promise; bookings: ( parent: Place, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => Booking[] | Promise; + ) => Array | Promise>; pictures: ( parent: Place, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => Picture[] | Promise; + ) => + | Array + | null + | undefined + | Promise | null | undefined>; popularity: ( parent: Place, @@ -2541,21 +2617,21 @@ export type Pricing_CleaningFee_Resolver = ( args: {}, ctx: Context, info: GraphQLResolveInfo -) => number | null | Promise; +) => number | null | undefined | Promise; export type Pricing_Currency_Resolver = ( parent: Pricing, args: {}, ctx: Context, info: GraphQLResolveInfo -) => CURRENCY | null | Promise; +) => CURRENCY | null | undefined | Promise; export type Pricing_ExtraGuests_Resolver = ( parent: Pricing, args: {}, ctx: Context, info: GraphQLResolveInfo -) => number | null | Promise; +) => number | null | undefined | Promise; export type Pricing_Id_Resolver = ( parent: Pricing, @@ -2569,7 +2645,7 @@ export type Pricing_MonthlyDiscount_Resolver = ( args: {}, ctx: Context, info: GraphQLResolveInfo -) => number | null | Promise; +) => number | null | undefined | Promise; export type Pricing_PerNight_Resolver = ( parent: Pricing, @@ -2583,7 +2659,7 @@ export type Pricing_SecurityDeposit_Resolver = ( args: {}, ctx: Context, info: GraphQLResolveInfo -) => number | null | Promise; +) => number | null | undefined | Promise; export type Pricing_SmartPricing_Resolver = ( parent: Pricing, @@ -2597,14 +2673,14 @@ export type Pricing_WeekendPricing_Resolver = ( args: {}, ctx: Context, info: GraphQLResolveInfo -) => number | null | Promise; +) => number | null | undefined | Promise; export type Pricing_WeeklyDiscount_Resolver = ( parent: Pricing, args: {}, ctx: Context, info: GraphQLResolveInfo -) => number | null | Promise; +) => number | null | undefined | Promise; export interface Pricing_Resolvers { averageMonthly: ( @@ -2633,21 +2709,21 @@ export interface Pricing_Resolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => number | null | Promise; + ) => number | null | undefined | Promise; currency: ( parent: Pricing, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => CURRENCY | null | Promise; + ) => CURRENCY | null | undefined | Promise; extraGuests: ( parent: Pricing, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => number | null | Promise; + ) => number | null | undefined | Promise; id: ( parent: Pricing, @@ -2661,7 +2737,7 @@ export interface Pricing_Resolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => number | null | Promise; + ) => number | null | undefined | Promise; perNight: ( parent: Pricing, @@ -2675,7 +2751,7 @@ export interface Pricing_Resolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => number | null | Promise; + ) => number | null | undefined | Promise; smartPricing: ( parent: Pricing, @@ -2689,14 +2765,14 @@ export interface Pricing_Resolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => number | null | Promise; + ) => number | null | undefined | Promise; weeklyDiscount: ( parent: Pricing, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => number | null | Promise; + ) => number | null | undefined | Promise; } // Types for PlaceViews @@ -2927,7 +3003,7 @@ export type HouseRules_AdditionalRules_Resolver = ( args: {}, ctx: Context, info: GraphQLResolveInfo -) => string | null | Promise; +) => string | null | undefined | Promise; export type HouseRules_CreatedAt_Resolver = ( parent: HouseRules, @@ -2948,35 +3024,35 @@ export type HouseRules_PartiesAndEventsAllowed_Resolver = ( args: {}, ctx: Context, info: GraphQLResolveInfo -) => boolean | null | Promise; +) => boolean | null | undefined | Promise; export type HouseRules_PetsAllowed_Resolver = ( parent: HouseRules, args: {}, ctx: Context, info: GraphQLResolveInfo -) => boolean | null | Promise; +) => boolean | null | undefined | Promise; export type HouseRules_SmokingAllowed_Resolver = ( parent: HouseRules, args: {}, ctx: Context, info: GraphQLResolveInfo -) => boolean | null | Promise; +) => boolean | null | undefined | Promise; export type HouseRules_SuitableForChildren_Resolver = ( parent: HouseRules, args: {}, ctx: Context, info: GraphQLResolveInfo -) => boolean | null | Promise; +) => boolean | null | undefined | Promise; export type HouseRules_SuitableForInfants_Resolver = ( parent: HouseRules, args: {}, ctx: Context, info: GraphQLResolveInfo -) => boolean | null | Promise; +) => boolean | null | undefined | Promise; export type HouseRules_UpdatedAt_Resolver = ( parent: HouseRules, @@ -2991,7 +3067,7 @@ export interface HouseRules_Resolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => string | null | Promise; + ) => string | null | undefined | Promise; createdAt: ( parent: HouseRules, @@ -3012,35 +3088,35 @@ export interface HouseRules_Resolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => boolean | null | Promise; + ) => boolean | null | undefined | Promise; petsAllowed: ( parent: HouseRules, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => boolean | null | Promise; + ) => boolean | null | undefined | Promise; smokingAllowed: ( parent: HouseRules, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => boolean | null | Promise; + ) => boolean | null | undefined | Promise; suitableForChildren: ( parent: HouseRules, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => boolean | null | Promise; + ) => boolean | null | undefined | Promise; suitableForInfants: ( parent: HouseRules, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => boolean | null | Promise; + ) => boolean | null | undefined | Promise; updatedAt: ( parent: HouseRules, @@ -3164,7 +3240,11 @@ export type PaymentAccount_Type_Resolver = ( args: {}, ctx: Context, info: GraphQLResolveInfo -) => PAYMENT_PROVIDER | null | Promise; +) => + | PAYMENT_PROVIDER + | null + | undefined + | Promise; export type PaymentAccount_User_Resolver = ( parent: PaymentAccount, @@ -3178,21 +3258,29 @@ export type PaymentAccount_Payments_Resolver = ( args: {}, ctx: Context, info: GraphQLResolveInfo -) => Payment[] | Promise; +) => Array | Promise>; export type PaymentAccount_Paypal_Resolver = ( parent: PaymentAccount, args: {}, ctx: Context, info: GraphQLResolveInfo -) => PaypalInformation | null | Promise; +) => + | PaypalInformation + | null + | undefined + | Promise; export type PaymentAccount_Creditcard_Resolver = ( parent: PaymentAccount, args: {}, ctx: Context, info: GraphQLResolveInfo -) => CreditCardInformation | null | Promise; +) => + | CreditCardInformation + | null + | undefined + | Promise; export interface PaymentAccount_Resolvers { id: ( @@ -3214,7 +3302,11 @@ export interface PaymentAccount_Resolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => PAYMENT_PROVIDER | null | Promise; + ) => + | PAYMENT_PROVIDER + | null + | undefined + | Promise; user: ( parent: PaymentAccount, @@ -3228,21 +3320,29 @@ export interface PaymentAccount_Resolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => Payment[] | Promise; + ) => Array | Promise>; paypal: ( parent: PaymentAccount, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => PaypalInformation | null | Promise; + ) => + | PaypalInformation + | null + | undefined + | Promise; creditcard: ( parent: PaymentAccount, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => CreditCardInformation | null | Promise; + ) => + | CreditCardInformation + | null + | undefined + | Promise; } // Types for PaypalInformation @@ -3388,7 +3488,11 @@ export type CreditCardInformation_PaymentAccount_Resolver = ( args: {}, ctx: Context, info: GraphQLResolveInfo -) => PaymentAccount | null | Promise; +) => + | PaymentAccount + | null + | undefined + | Promise; export type CreditCardInformation_PostalCode_Resolver = ( parent: CreditCardInformation, @@ -3466,7 +3570,11 @@ export interface CreditCardInformation_Resolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => PaymentAccount | null | Promise; + ) => + | PaymentAccount + | null + | undefined + | Promise; postalCode: ( parent: CreditCardInformation, @@ -3527,7 +3635,11 @@ export type Notification_Type_Resolver = ( args: {}, ctx: Context, info: GraphQLResolveInfo -) => NOTIFICATION_TYPE | null | Promise; +) => + | NOTIFICATION_TYPE + | null + | undefined + | Promise; export type Notification_User_Resolver = ( parent: Notification, @@ -3570,7 +3682,11 @@ export interface Notification_Resolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => NOTIFICATION_TYPE | null | Promise; + ) => + | NOTIFICATION_TYPE + | null + | undefined + | Promise; user: ( parent: Notification, diff --git a/packages/graphqlgen/src/tests/typescript/__snapshots__/basic.test.ts.snap b/packages/graphqlgen/src/tests/typescript/__snapshots__/basic.test.ts.snap index b9d6ba47..3f4f187e 100644 --- a/packages/graphqlgen/src/tests/typescript/__snapshots__/basic.test.ts.snap +++ b/packages/graphqlgen/src/tests/typescript/__snapshots__/basic.test.ts.snap @@ -23,7 +23,7 @@ export namespace QueryResolvers { args: ArgsCreateUser, ctx: Context, info: GraphQLResolveInfo - ) => User | null | Promise; + ) => User | null | undefined | Promise; export interface Type { createUser: ( @@ -31,7 +31,7 @@ export namespace QueryResolvers { args: ArgsCreateUser, ctx: Context, info: GraphQLResolveInfo - ) => User | null | Promise; + ) => User | null | undefined | Promise; } } @@ -175,16 +175,16 @@ export namespace MutationResolvers { export interface AddMemberData { email: string; - projects: string[]; - sideProjects: string[] | null; + projects: Array; + sideProjects: Array | null | undefined; profile: ProfileData | null; - phones: PhoneData[]; + phones: Array; isVIP: boolean; } export interface ProfileData { - firstName: string | null; - lastName: string | null; - photo: Photo | null; + firstName: string | null | undefined; + lastName: string | null | undefined; + photo: Photo | null | undefined; } export interface Photo { title: string; @@ -201,7 +201,7 @@ export namespace MutationResolvers { } export interface ArgsAddMembers { - data: AddMemberData[]; + data: Array; } export type AddMemberResolver = ( @@ -245,14 +245,14 @@ export namespace AddMemberPayloadResolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => string | null | Promise; + ) => string | null | undefined | Promise; export type ExistingUserInviteSentResolver = ( parent: AddMemberPayload, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => boolean | null | Promise; + ) => boolean | null | undefined | Promise; export interface Type { newUserId: ( @@ -260,14 +260,14 @@ export namespace AddMemberPayloadResolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => string | null | Promise; + ) => string | null | undefined | Promise; existingUserInviteSent: ( parent: AddMemberPayload, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => boolean | null | Promise; + ) => boolean | null | undefined | Promise; } } @@ -348,7 +348,7 @@ export namespace MutationResolvers { export interface AddMemberData { email: string; - projects: string[]; + projects: Array; } export interface ArgsAddMember { @@ -382,7 +382,7 @@ export namespace AddMemberPayloadResolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => string | null | Promise; + ) => string | null | undefined | Promise; export interface Type { json: ( @@ -390,7 +390,7 @@ export namespace AddMemberPayloadResolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => string | null | Promise; + ) => string | null | undefined | Promise; } } @@ -497,21 +497,27 @@ export namespace QueryResolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => Number | null | Promise; + ) => Number | null | undefined | Promise; export type Custom_array_nullableResolver = ( parent: undefined, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => Number[] | null | Promise; + ) => + | Array + | null + | undefined + | Promise | null | undefined>; export type Custom_array_requiredResolver = ( parent: undefined, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => Number[] | Promise; + ) => + | Array + | Promise>; export type Custom_with_argResolver = ( parent: undefined, @@ -539,21 +545,27 @@ export namespace QueryResolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => boolean | null | Promise; + ) => boolean | null | undefined | Promise; export type Scalar_array_nullableResolver = ( parent: undefined, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => boolean[] | null | Promise; + ) => + | Array + | null + | undefined + | Promise | null | undefined>; export type Scalar_array_requiredResolver = ( parent: undefined, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => boolean[] | Promise; + ) => + | Array + | Promise>; export type Scalar_with_argResolver = ( parent: undefined, @@ -589,21 +601,27 @@ export namespace QueryResolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => Number | null | Promise; + ) => Number | null | undefined | Promise; custom_array_nullable: ( parent: undefined, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => Number[] | null | Promise; + ) => + | Array + | null + | undefined + | Promise | null | undefined>; custom_array_required: ( parent: undefined, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => Number[] | Promise; + ) => + | Array + | Promise>; custom_with_arg: ( parent: undefined, @@ -631,21 +649,27 @@ export namespace QueryResolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => boolean | null | Promise; + ) => boolean | null | undefined | Promise; scalar_array_nullable: ( parent: undefined, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => boolean[] | null | Promise; + ) => + | Array + | null + | undefined + | Promise | null | undefined>; scalar_array_required: ( parent: undefined, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => boolean[] | Promise; + ) => + | Array + | Promise>; scalar_with_arg: ( parent: undefined, @@ -674,14 +698,14 @@ export namespace NumberResolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => string | null | Promise; + ) => string | null | undefined | Promise; export type ValueResolver = ( parent: Number, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => number | null | Promise; + ) => number | null | undefined | Promise; export interface Type { id: ( @@ -689,14 +713,14 @@ export namespace NumberResolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => string | null | Promise; + ) => string | null | undefined | Promise; value: ( parent: Number, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => number | null | Promise; + ) => number | null | undefined | Promise; } } @@ -884,7 +908,7 @@ export namespace ProfessorResolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => string | null | Promise; + ) => string | null | undefined | Promise; export interface Type { degree: ( @@ -892,7 +916,7 @@ export namespace ProfessorResolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => string | null | Promise; + ) => string | null | undefined | Promise; } } @@ -986,7 +1010,7 @@ export namespace QueryResolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => User | null | Promise; + ) => User | null | undefined | Promise; export interface Type { createUser: ( @@ -994,7 +1018,7 @@ export namespace QueryResolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => User | null | Promise; + ) => User | null | undefined | Promise; } } @@ -1123,21 +1147,27 @@ export namespace QueryResolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => NumberNode | null | Promise; + ) => NumberNode | null | undefined | Promise; export type Custom_array_nullableResolver = ( parent: undefined, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => NumberNode[] | null | Promise; + ) => + | Array + | null + | undefined + | Promise | null | undefined>; export type Custom_array_requiredResolver = ( parent: undefined, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => NumberNode[] | Promise; + ) => + | Array + | Promise>; export type Custom_with_argResolver = ( parent: undefined, @@ -1165,21 +1195,27 @@ export namespace QueryResolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => boolean | null | Promise; + ) => boolean | null | undefined | Promise; export type Scalar_array_nullableResolver = ( parent: undefined, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => boolean[] | null | Promise; + ) => + | Array + | null + | undefined + | Promise | null | undefined>; export type Scalar_array_requiredResolver = ( parent: undefined, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => boolean[] | Promise; + ) => + | Array + | Promise>; export type Scalar_with_argResolver = ( parent: undefined, @@ -1215,21 +1251,27 @@ export namespace QueryResolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => NumberNode | null | Promise; + ) => NumberNode | null | undefined | Promise; custom_array_nullable: ( parent: undefined, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => NumberNode[] | null | Promise; + ) => + | Array + | null + | undefined + | Promise | null | undefined>; custom_array_required: ( parent: undefined, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => NumberNode[] | Promise; + ) => + | Array + | Promise>; custom_with_arg: ( parent: undefined, @@ -1257,21 +1299,27 @@ export namespace QueryResolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => boolean | null | Promise; + ) => boolean | null | undefined | Promise; scalar_array_nullable: ( parent: undefined, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => boolean[] | null | Promise; + ) => + | Array + | null + | undefined + | Promise | null | undefined>; scalar_array_required: ( parent: undefined, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => boolean[] | Promise; + ) => + | Array + | Promise>; scalar_with_arg: ( parent: undefined, @@ -1300,14 +1348,14 @@ export namespace NumberResolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => string | null | Promise; + ) => string | null | undefined | Promise; export type ValueResolver = ( parent: NumberNode, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => number | null | Promise; + ) => number | null | undefined | Promise; export interface Type { id: ( @@ -1315,14 +1363,14 @@ export namespace NumberResolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => string | null | Promise; + ) => string | null | undefined | Promise; value: ( parent: NumberNode, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => number | null | Promise; + ) => number | null | undefined | Promise; } } @@ -1465,21 +1513,27 @@ export namespace QueryResolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => Number | null | Promise; + ) => Number | null | undefined | Promise; export type Custom_array_nullableResolver = ( parent: undefined, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => Number[] | null | Promise; + ) => + | Array + | null + | undefined + | Promise | null | undefined>; export type Custom_array_requiredResolver = ( parent: undefined, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => Number[] | Promise; + ) => + | Array + | Promise>; export type Custom_with_argResolver = ( parent: undefined, @@ -1507,21 +1561,27 @@ export namespace QueryResolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => boolean | null | Promise; + ) => boolean | null | undefined | Promise; export type Scalar_array_nullableResolver = ( parent: undefined, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => boolean[] | null | Promise; + ) => + | Array + | null + | undefined + | Promise | null | undefined>; export type Scalar_array_requiredResolver = ( parent: undefined, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => boolean[] | Promise; + ) => + | Array + | Promise>; export type Scalar_with_argResolver = ( parent: undefined, @@ -1557,21 +1617,27 @@ export namespace QueryResolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => Number | null | Promise; + ) => Number | null | undefined | Promise; custom_array_nullable: ( parent: undefined, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => Number[] | null | Promise; + ) => + | Array + | null + | undefined + | Promise | null | undefined>; custom_array_required: ( parent: undefined, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => Number[] | Promise; + ) => + | Array + | Promise>; custom_with_arg: ( parent: undefined, @@ -1599,21 +1665,27 @@ export namespace QueryResolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => boolean | null | Promise; + ) => boolean | null | undefined | Promise; scalar_array_nullable: ( parent: undefined, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => boolean[] | null | Promise; + ) => + | Array + | null + | undefined + | Promise | null | undefined>; scalar_array_required: ( parent: undefined, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => boolean[] | Promise; + ) => + | Array + | Promise>; scalar_with_arg: ( parent: undefined, @@ -1642,14 +1714,14 @@ export namespace NumberResolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => string | null | Promise; + ) => string | null | undefined | Promise; export type ValueResolver = ( parent: Number, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => number | null | Promise; + ) => number | null | undefined | Promise; export interface Type { id: ( @@ -1657,14 +1729,14 @@ export namespace NumberResolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => string | null | Promise; + ) => string | null | undefined | Promise; value: ( parent: Number, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => number | null | Promise; + ) => number | null | undefined | Promise; } } diff --git a/packages/graphqlgen/src/tests/typescript/__snapshots__/large-schema.test.ts.snap b/packages/graphqlgen/src/tests/typescript/__snapshots__/large-schema.test.ts.snap index a217cfa8..8189423a 100644 --- a/packages/graphqlgen/src/tests/typescript/__snapshots__/large-schema.test.ts.snap +++ b/packages/graphqlgen/src/tests/typescript/__snapshots__/large-schema.test.ts.snap @@ -63,7 +63,7 @@ export namespace QueryResolvers { } export interface ArgsExperiencesByCity { - cities: string[]; + cities: Array; } export type TopExperiencesResolver = ( @@ -71,56 +71,56 @@ export namespace QueryResolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => Experience[] | Promise; + ) => Array | Promise>; export type TopHomesResolver = ( parent: undefined, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => Home[] | Promise; + ) => Array | Promise>; export type HomesInPriceRangeResolver = ( parent: undefined, args: ArgsHomesInPriceRange, ctx: Context, info: GraphQLResolveInfo - ) => Home[] | Promise; + ) => Array | Promise>; export type TopReservationsResolver = ( parent: undefined, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => Reservation[] | Promise; + ) => Array | Promise>; export type FeaturedDestinationsResolver = ( parent: undefined, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => Neighbourhood[] | Promise; + ) => Array | Promise>; export type ExperiencesByCityResolver = ( parent: undefined, args: ArgsExperiencesByCity, ctx: Context, info: GraphQLResolveInfo - ) => ExperiencesByCity[] | Promise; + ) => Array | Promise>; export type ViewerResolver = ( parent: undefined, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => Viewer | null | Promise; + ) => Viewer | null | undefined | Promise; export type MyLocationResolver = ( parent: undefined, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => Location | null | Promise; + ) => Location | null | undefined | Promise; export interface Type { topExperiences: ( @@ -128,56 +128,56 @@ export namespace QueryResolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => Experience[] | Promise; + ) => Array | Promise>; topHomes: ( parent: undefined, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => Home[] | Promise; + ) => Array | Promise>; homesInPriceRange: ( parent: undefined, args: ArgsHomesInPriceRange, ctx: Context, info: GraphQLResolveInfo - ) => Home[] | Promise; + ) => Array | Promise>; topReservations: ( parent: undefined, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => Reservation[] | Promise; + ) => Array | Promise>; featuredDestinations: ( parent: undefined, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => Neighbourhood[] | Promise; + ) => Array | Promise>; experiencesByCity: ( parent: undefined, args: ArgsExperiencesByCity, ctx: Context, info: GraphQLResolveInfo - ) => ExperiencesByCity[] | Promise; + ) => Array | Promise>; viewer: ( parent: undefined, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => Viewer | null | Promise; + ) => Viewer | null | undefined | Promise; myLocation: ( parent: undefined, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => Location | null | Promise; + ) => Location | null | undefined | Promise; } } @@ -206,7 +206,11 @@ export namespace ExperienceResolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => ExperienceCategory | null | Promise; + ) => + | ExperienceCategory + | null + | undefined + | Promise; export type TitleResolver = ( parent: Experience, @@ -234,7 +238,7 @@ export namespace ExperienceResolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => Review[] | Promise; + ) => Array | Promise>; export type PreviewResolver = ( parent: Experience, @@ -263,7 +267,11 @@ export namespace ExperienceResolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => ExperienceCategory | null | Promise; + ) => + | ExperienceCategory + | null + | undefined + | Promise; title: ( parent: Experience, @@ -291,7 +299,7 @@ export namespace ExperienceResolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => Review[] | Promise; + ) => Array | Promise>; preview: ( parent: Experience, @@ -344,7 +352,7 @@ export namespace ExperienceCategoryResolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => Experience | null | Promise; + ) => Experience | null | undefined | Promise; export interface Type { id: ( @@ -373,7 +381,7 @@ export namespace ExperienceCategoryResolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => Experience | null | Promise; + ) => Experience | null | undefined | Promise; } } @@ -414,14 +422,14 @@ export namespace LocationResolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => string | null | Promise; + ) => string | null | undefined | Promise; export type DirectionsResolver = ( parent: Location, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => string | null | Promise; + ) => string | null | undefined | Promise; export interface Type { id: ( @@ -450,14 +458,14 @@ export namespace LocationResolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => string | null | Promise; + ) => string | null | undefined | Promise; directions: ( parent: Location, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => string | null | Promise; + ) => string | null | undefined | Promise; } } @@ -668,7 +676,7 @@ export namespace HomeResolvers { }; export interface ArgsPictures { - first: number | null; + first: number | null | undefined; } export type IdResolver = ( @@ -683,7 +691,7 @@ export namespace HomeResolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => string | null | Promise; + ) => string | null | undefined | Promise; export type DescriptionResolver = ( parent: Home, @@ -704,14 +712,14 @@ export namespace HomeResolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => number | null | Promise; + ) => number | null | undefined | Promise; export type PicturesResolver = ( parent: Home, args: ArgsPictures, ctx: Context, info: GraphQLResolveInfo - ) => Picture[] | Promise; + ) => Array | Promise>; export type PerNightResolver = ( parent: Home, @@ -733,7 +741,7 @@ export namespace HomeResolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => string | null | Promise; + ) => string | null | undefined | Promise; description: ( parent: Home, @@ -754,14 +762,14 @@ export namespace HomeResolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => number | null | Promise; + ) => number | null | undefined | Promise; pictures: ( parent: Home, args: ArgsPictures, ctx: Context, info: GraphQLResolveInfo - ) => Picture[] | Promise; + ) => Array | Promise>; perNight: ( parent: Home, @@ -810,7 +818,7 @@ export namespace ReservationResolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => Picture[] | Promise; + ) => Array | Promise>; export type LocationResolver = ( parent: Reservation, @@ -867,7 +875,7 @@ export namespace ReservationResolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => Picture[] | Promise; + ) => Array | Promise>; location: ( parent: Reservation, @@ -937,7 +945,7 @@ export namespace NeighbourhoodResolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => Picture | null | Promise; + ) => Picture | null | undefined | Promise; export type CityResolver = ( parent: Neighbourhood, @@ -987,7 +995,7 @@ export namespace NeighbourhoodResolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => Picture | null | Promise; + ) => Picture | null | undefined | Promise; city: ( parent: Neighbourhood, @@ -1060,7 +1068,7 @@ export namespace ExperiencesByCityResolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => Experience[] | Promise; + ) => Array | Promise>; export type CityResolver = ( parent: ExperiencesByCity, @@ -1075,7 +1083,7 @@ export namespace ExperiencesByCityResolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => Experience[] | Promise; + ) => Array | Promise>; city: ( parent: ExperiencesByCity, @@ -1104,7 +1112,7 @@ export namespace ViewerResolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => Booking[] | Promise; + ) => Array | Promise>; export interface Type { me: ( @@ -1119,7 +1127,7 @@ export namespace ViewerResolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => Booking[] | Promise; + ) => Array | Promise>; } } @@ -1152,7 +1160,11 @@ export namespace UserResolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => Booking[] | Promise; + ) => + | Array + | null + | undefined + | Promise | null | undefined>; export type CreatedAtResolver = ( parent: User, @@ -1180,7 +1192,11 @@ export namespace UserResolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => Experience[] | Promise; + ) => + | Array + | null + | undefined + | Promise | null | undefined>; export type IdResolver = ( parent: User, @@ -1215,21 +1231,33 @@ export namespace UserResolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => Notification[] | Promise; + ) => + | Array + | null + | undefined + | Promise | null | undefined>; export type OwnedPlacesResolver = ( parent: User, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => Place[] | Promise; + ) => + | Array + | null + | undefined + | Promise | null | undefined>; export type PaymentAccountResolver = ( parent: User, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => PaymentAccount[] | Promise; + ) => + | Array + | null + | undefined + | Promise | null | undefined>; export type PhoneResolver = ( parent: User, @@ -1243,35 +1271,43 @@ export namespace UserResolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => Picture | null | Promise; + ) => Picture | null | undefined | Promise; export type ReceivedMessagesResolver = ( parent: User, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => Message[] | Promise; + ) => + | Array + | null + | undefined + | Promise | null | undefined>; export type ResponseRateResolver = ( parent: User, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => number | null | Promise; + ) => number | null | undefined | Promise; export type ResponseTimeResolver = ( parent: User, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => number | null | Promise; + ) => number | null | undefined | Promise; export type SentMessagesResolver = ( parent: User, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => Message[] | Promise; + ) => + | Array + | null + | undefined + | Promise | null | undefined>; export type UpdatedAtResolver = ( parent: User, @@ -1293,7 +1329,11 @@ export namespace UserResolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => Booking[] | Promise; + ) => + | Array + | null + | undefined + | Promise | null | undefined>; createdAt: ( parent: User, @@ -1321,7 +1361,11 @@ export namespace UserResolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => Experience[] | Promise; + ) => + | Array + | null + | undefined + | Promise | null | undefined>; id: ( parent: User, @@ -1356,21 +1400,33 @@ export namespace UserResolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => Notification[] | Promise; + ) => + | Array + | null + | undefined + | Promise | null | undefined>; ownedPlaces: ( parent: User, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => Place[] | Promise; + ) => + | Array + | null + | undefined + | Promise | null | undefined>; paymentAccount: ( parent: User, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => PaymentAccount[] | Promise; + ) => + | Array + | null + | undefined + | Promise | null | undefined>; phone: ( parent: User, @@ -1384,35 +1440,43 @@ export namespace UserResolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => Picture | null | Promise; + ) => Picture | null | undefined | Promise; receivedMessages: ( parent: User, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => Message[] | Promise; + ) => + | Array + | null + | undefined + | Promise | null | undefined>; responseRate: ( parent: User, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => number | null | Promise; + ) => number | null | undefined | Promise; responseTime: ( parent: User, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => number | null | Promise; + ) => number | null | undefined | Promise; sentMessages: ( parent: User, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => Message[] | Promise; + ) => + | Array + | null + | undefined + | Promise | null | undefined>; updatedAt: ( parent: User, @@ -1583,14 +1647,14 @@ export namespace PlaceResolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => string | null | Promise; + ) => string | null | undefined | Promise; export type SizeResolver = ( parent: Place, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => PLACE_SIZES | null | Promise; + ) => PLACE_SIZES | null | undefined | Promise; export type ShortDescriptionResolver = ( parent: Place, @@ -1646,7 +1710,7 @@ export namespace PlaceResolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => Review[] | Promise; + ) => Array | Promise>; export type AmenitiesResolver = ( parent: Place, @@ -1688,35 +1752,43 @@ export namespace PlaceResolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => GuestRequirements | null | Promise; + ) => + | GuestRequirements + | null + | undefined + | Promise; export type PoliciesResolver = ( parent: Place, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => Policies | null | Promise; + ) => Policies | null | undefined | Promise; export type HouseRulesResolver = ( parent: Place, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => HouseRules | null | Promise; + ) => HouseRules | null | undefined | Promise; export type BookingsResolver = ( parent: Place, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => Booking[] | Promise; + ) => Array | Promise>; export type PicturesResolver = ( parent: Place, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => Picture[] | Promise; + ) => + | Array + | null + | undefined + | Promise | null | undefined>; export type PopularityResolver = ( parent: Place, @@ -1738,14 +1810,18 @@ export namespace PlaceResolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => string | null | Promise; + ) => string | null | undefined | Promise; size: ( parent: Place, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => PLACE_SIZES | null | Promise; + ) => + | PLACE_SIZES + | null + | undefined + | Promise; shortDescription: ( parent: Place, @@ -1801,7 +1877,7 @@ export namespace PlaceResolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => Review[] | Promise; + ) => Array | Promise>; amenities: ( parent: Place, @@ -1843,35 +1919,43 @@ export namespace PlaceResolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => GuestRequirements | null | Promise; + ) => + | GuestRequirements + | null + | undefined + | Promise; policies: ( parent: Place, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => Policies | null | Promise; + ) => Policies | null | undefined | Promise; houseRules: ( parent: Place, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => HouseRules | null | Promise; + ) => HouseRules | null | undefined | Promise; bookings: ( parent: Place, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => Booking[] | Promise; + ) => Array | Promise>; pictures: ( parent: Place, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => Picture[] | Promise; + ) => + | Array + | null + | undefined + | Promise | null | undefined>; popularity: ( parent: Place, @@ -2558,21 +2642,21 @@ export namespace PricingResolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => number | null | Promise; + ) => number | null | undefined | Promise; export type CurrencyResolver = ( parent: Pricing, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => CURRENCY | null | Promise; + ) => CURRENCY | null | undefined | Promise; export type ExtraGuestsResolver = ( parent: Pricing, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => number | null | Promise; + ) => number | null | undefined | Promise; export type IdResolver = ( parent: Pricing, @@ -2586,7 +2670,7 @@ export namespace PricingResolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => number | null | Promise; + ) => number | null | undefined | Promise; export type PerNightResolver = ( parent: Pricing, @@ -2600,7 +2684,7 @@ export namespace PricingResolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => number | null | Promise; + ) => number | null | undefined | Promise; export type SmartPricingResolver = ( parent: Pricing, @@ -2614,14 +2698,14 @@ export namespace PricingResolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => number | null | Promise; + ) => number | null | undefined | Promise; export type WeeklyDiscountResolver = ( parent: Pricing, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => number | null | Promise; + ) => number | null | undefined | Promise; export interface Type { averageMonthly: ( @@ -2650,21 +2734,21 @@ export namespace PricingResolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => number | null | Promise; + ) => number | null | undefined | Promise; currency: ( parent: Pricing, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => CURRENCY | null | Promise; + ) => CURRENCY | null | undefined | Promise; extraGuests: ( parent: Pricing, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => number | null | Promise; + ) => number | null | undefined | Promise; id: ( parent: Pricing, @@ -2678,7 +2762,7 @@ export namespace PricingResolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => number | null | Promise; + ) => number | null | undefined | Promise; perNight: ( parent: Pricing, @@ -2692,7 +2776,7 @@ export namespace PricingResolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => number | null | Promise; + ) => number | null | undefined | Promise; smartPricing: ( parent: Pricing, @@ -2706,14 +2790,14 @@ export namespace PricingResolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => number | null | Promise; + ) => number | null | undefined | Promise; weeklyDiscount: ( parent: Pricing, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => number | null | Promise; + ) => number | null | undefined | Promise; } } @@ -2950,7 +3034,7 @@ export namespace HouseRulesResolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => string | null | Promise; + ) => string | null | undefined | Promise; export type CreatedAtResolver = ( parent: HouseRules, @@ -2971,35 +3055,35 @@ export namespace HouseRulesResolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => boolean | null | Promise; + ) => boolean | null | undefined | Promise; export type PetsAllowedResolver = ( parent: HouseRules, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => boolean | null | Promise; + ) => boolean | null | undefined | Promise; export type SmokingAllowedResolver = ( parent: HouseRules, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => boolean | null | Promise; + ) => boolean | null | undefined | Promise; export type SuitableForChildrenResolver = ( parent: HouseRules, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => boolean | null | Promise; + ) => boolean | null | undefined | Promise; export type SuitableForInfantsResolver = ( parent: HouseRules, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => boolean | null | Promise; + ) => boolean | null | undefined | Promise; export type UpdatedAtResolver = ( parent: HouseRules, @@ -3014,7 +3098,7 @@ export namespace HouseRulesResolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => string | null | Promise; + ) => string | null | undefined | Promise; createdAt: ( parent: HouseRules, @@ -3035,35 +3119,35 @@ export namespace HouseRulesResolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => boolean | null | Promise; + ) => boolean | null | undefined | Promise; petsAllowed: ( parent: HouseRules, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => boolean | null | Promise; + ) => boolean | null | undefined | Promise; smokingAllowed: ( parent: HouseRules, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => boolean | null | Promise; + ) => boolean | null | undefined | Promise; suitableForChildren: ( parent: HouseRules, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => boolean | null | Promise; + ) => boolean | null | undefined | Promise; suitableForInfants: ( parent: HouseRules, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => boolean | null | Promise; + ) => boolean | null | undefined | Promise; updatedAt: ( parent: HouseRules, @@ -3189,7 +3273,11 @@ export namespace PaymentAccountResolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => PAYMENT_PROVIDER | null | Promise; + ) => + | PAYMENT_PROVIDER + | null + | undefined + | Promise; export type UserResolver = ( parent: PaymentAccount, @@ -3203,21 +3291,29 @@ export namespace PaymentAccountResolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => Payment[] | Promise; + ) => Array | Promise>; export type PaypalResolver = ( parent: PaymentAccount, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => PaypalInformation | null | Promise; + ) => + | PaypalInformation + | null + | undefined + | Promise; export type CreditcardResolver = ( parent: PaymentAccount, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => CreditCardInformation | null | Promise; + ) => + | CreditCardInformation + | null + | undefined + | Promise; export interface Type { id: ( @@ -3239,7 +3335,11 @@ export namespace PaymentAccountResolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => PAYMENT_PROVIDER | null | Promise; + ) => + | PAYMENT_PROVIDER + | null + | undefined + | Promise; user: ( parent: PaymentAccount, @@ -3253,21 +3353,29 @@ export namespace PaymentAccountResolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => Payment[] | Promise; + ) => Array | Promise>; paypal: ( parent: PaymentAccount, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => PaypalInformation | null | Promise; + ) => + | PaypalInformation + | null + | undefined + | Promise; creditcard: ( parent: PaymentAccount, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => CreditCardInformation | null | Promise; + ) => + | CreditCardInformation + | null + | undefined + | Promise; } } @@ -3415,7 +3523,11 @@ export namespace CreditCardInformationResolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => PaymentAccount | null | Promise; + ) => + | PaymentAccount + | null + | undefined + | Promise; export type PostalCodeResolver = ( parent: CreditCardInformation, @@ -3493,7 +3605,11 @@ export namespace CreditCardInformationResolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => PaymentAccount | null | Promise; + ) => + | PaymentAccount + | null + | undefined + | Promise; postalCode: ( parent: CreditCardInformation, @@ -3555,7 +3671,11 @@ export namespace NotificationResolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => NOTIFICATION_TYPE | null | Promise; + ) => + | NOTIFICATION_TYPE + | null + | undefined + | Promise; export type UserResolver = ( parent: Notification, @@ -3598,7 +3718,11 @@ export namespace NotificationResolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => NOTIFICATION_TYPE | null | Promise; + ) => + | NOTIFICATION_TYPE + | null + | undefined + | Promise; user: ( parent: Notification, From 5db2c8685e9555136c6469208afd933c108cf8c9 Mon Sep 17 00:00:00 2001 From: Jason Kuhrt Date: Wed, 2 Jan 2019 21:27:43 -0500 Subject: [PATCH 2/8] chore: formatting --- packages/graphqlgen/src/generators/common.ts | 3 +++ packages/graphqlgen/src/source-helper.ts | 14 ++++++++++++-- 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/packages/graphqlgen/src/generators/common.ts b/packages/graphqlgen/src/generators/common.ts index 9ab32353..6d084f49 100644 --- a/packages/graphqlgen/src/generators/common.ts +++ b/packages/graphqlgen/src/generators/common.ts @@ -201,6 +201,7 @@ export function printFieldLikeType( const isRequired = field.type.isArray ? field.type.isArrayRequired : field.type.isRequired + const suffix = isRequired ? '' : field.defaultValue === null @@ -208,9 +209,11 @@ export function printFieldLikeType( : field.defaultValue === undefined ? ' | null | undefined' : '' + const type = field.type.isArray ? name + (field.type.isRequired ? '' : ' | null | undefined') : name + suffix + return field.type.isArray ? `Array<${type}>${suffix}` : type } diff --git a/packages/graphqlgen/src/source-helper.ts b/packages/graphqlgen/src/source-helper.ts index bf953606..e383f663 100644 --- a/packages/graphqlgen/src/source-helper.ts +++ b/packages/graphqlgen/src/source-helper.ts @@ -132,7 +132,12 @@ function extractTypeDefinition( const getFinalType = ( type: GraphQLInputType | GraphQLOutputType, - acc: FinalType = { isArray: false, isArrayRequired: false, isRequired: false, type }, + acc: FinalType = { + isArray: false, + isArrayRequired: false, + isRequired: false, + type, + }, ): FinalType => { if (type instanceof GraphQLNonNull) { acc.isRequired = true @@ -161,7 +166,12 @@ function extractTypeLike( type: GraphQLInputType | GraphQLOutputType, ): GraphQLType { const typeLike: GraphQLType = {} as GraphQLType - const { isArray, isArrayRequired, isRequired, type: finalType } = getFinalType(type) + const { + isArray, + isArrayRequired, + isRequired, + type: finalType, + } = getFinalType(type) if (isRequired) { typeLike.isRequired = true } From 5316bbee54e8be87c995ab3455754f4f9da48633 Mon Sep 17 00:00:00 2001 From: Jason Kuhrt Date: Wed, 2 Jan 2019 22:12:07 -0500 Subject: [PATCH 3/8] feat: do not allow undefined in resolver return types --- .../graphqlgen/src/generators/common.spec.ts | 5 + packages/graphqlgen/src/generators/common.ts | 58 ++++ .../src/generators/flow-generator.ts | 12 +- .../graphqlgen/src/generators/ts-generator.ts | 4 +- .../flow/__snapshots__/basic.test.ts.snap | 128 ++++---- .../__snapshots__/large-schema.test.ts.snap | 274 ++++++------------ .../__snapshots__/basic.test.ts.snap | 95 ++---- .../__snapshots__/large-schema.test.ts.snap | 146 +++------- 8 files changed, 291 insertions(+), 431 deletions(-) diff --git a/packages/graphqlgen/src/generators/common.spec.ts b/packages/graphqlgen/src/generators/common.spec.ts index 03ccadcc..7935b95e 100644 --- a/packages/graphqlgen/src/generators/common.spec.ts +++ b/packages/graphqlgen/src/generators/common.spec.ts @@ -41,6 +41,7 @@ it('getDistinctInputTypes', () => { isUnion: false, isRequired: false, isArray: false, + isArrayRequired: false, }, }, { @@ -56,6 +57,7 @@ it('getDistinctInputTypes', () => { isUnion: false, isRequired: false, isArray: false, + isArrayRequired: false, }, }, ], @@ -85,6 +87,7 @@ it('getDistinctInputTypes', () => { isUnion: false, isRequired: false, isArray: false, + isArrayRequired: false, }, }, ], @@ -114,6 +117,7 @@ it('getDistinctInputTypes', () => { isUnion: false, isRequired: false, isArray: false, + isArrayRequired: false, }, }, ], @@ -143,6 +147,7 @@ it('getDistinctInputTypes', () => { isUnion: false, isRequired: false, isArray: false, + isArrayRequired: false, }, }, ], diff --git a/packages/graphqlgen/src/generators/common.ts b/packages/graphqlgen/src/generators/common.ts index 6d084f49..bf781ac4 100644 --- a/packages/graphqlgen/src/generators/common.ts +++ b/packages/graphqlgen/src/generators/common.ts @@ -217,6 +217,64 @@ export function printFieldLikeType( return field.type.isArray ? `Array<${type}>${suffix}` : type } +export function printFieldLikeFlowType( + field: GraphQLTypeField, + modelMap: ModelMap, +) { + const name = field.type.isScalar + ? getTypeFromGraphQLType(field.type.name) + : field.type.isInput || field.type.isEnum + ? field.type.name + : getModelName(field.type, modelMap) + + const isRequired = field.type.isArray + ? field.type.isArrayRequired + : field.type.isRequired + + const suffix = isRequired + ? '' + : field.defaultValue === null + ? ' | null' + : field.defaultValue === undefined + ? ' | null | void' + : '' + + const type = field.type.isArray + ? name + (field.type.isRequired ? '' : ' | null | void') + : name + suffix + + return field.type.isArray ? `Array<${type}>${suffix}` : type +} + +export function printFieldLikeReturnType( + field: GraphQLTypeField, + modelMap: ModelMap, +) { + const name = field.type.isScalar + ? getTypeFromGraphQLType(field.type.name) + : field.type.isInput || field.type.isEnum + ? field.type.name + : getModelName(field.type, modelMap) + + const isRequired = field.type.isArray + ? field.type.isArrayRequired + : field.type.isRequired + + const suffix = isRequired + ? '' + : field.defaultValue === null + ? ' | null' + : field.defaultValue === undefined + ? ' | null' + : '' + + const type = field.type.isArray + ? name + (field.type.isRequired ? '' : ' | null') + : name + suffix + + return field.type.isArray ? `Array<${type}>${suffix}` : type +} + export function getTypeFromGraphQLType( type: string, ): SpecificGraphQLScalarType { diff --git a/packages/graphqlgen/src/generators/flow-generator.ts b/packages/graphqlgen/src/generators/flow-generator.ts index 3c733b7c..6226c8e0 100644 --- a/packages/graphqlgen/src/generators/flow-generator.ts +++ b/packages/graphqlgen/src/generators/flow-generator.ts @@ -14,7 +14,8 @@ import { getModelName, groupModelsNameByImportPath, InputTypesMap, - printFieldLikeType, + printFieldLikeFlowType, + printFieldLikeReturnType, renderDefaultResolvers, renderEnums, TypeToInputTypeAssociation, @@ -171,7 +172,7 @@ function renderInputTypeInterfaces( inputTypesMap[typeAssociation].name, )} { ${inputTypesMap[typeAssociation].fields.map( - field => `${field.name}: ${printFieldLikeType(field, modelMap)}`, + field => `${field.name}: ${printFieldLikeFlowType(field, modelMap)}`, )} }` }) @@ -201,7 +202,7 @@ function renderInputArgInterface( ${field.arguments .map( arg => - `${arg.name}: ${getArgTypePrefix(type, arg)}${printFieldLikeType( + `${arg.name}: ${getArgTypePrefix(type, arg)}${printFieldLikeFlowType( arg as GraphQLTypeField, modelMap, )}`, @@ -254,7 +255,8 @@ function renderResolverFunctionInterface( info: GraphQLResolveInfo, ) ` - const returnType = printFieldLikeType(field, modelMap) + + const returnType = printFieldLikeReturnType(field, modelMap) if (type.name === 'Subscription') { return ` @@ -299,7 +301,7 @@ function renderResolverTypeInterfaceFunction( ctx: ${getContextName(context)}, info: GraphQLResolveInfo, )` - const returnType = printFieldLikeType(field, modelMap) + const returnType = printFieldLikeFlowType(field, modelMap) if (type.name === 'Subscription') { return ` diff --git a/packages/graphqlgen/src/generators/ts-generator.ts b/packages/graphqlgen/src/generators/ts-generator.ts index 02ff90b7..0fa3f2f3 100644 --- a/packages/graphqlgen/src/generators/ts-generator.ts +++ b/packages/graphqlgen/src/generators/ts-generator.ts @@ -10,6 +10,7 @@ import { TypeToInputTypeAssociation, InputTypesMap, printFieldLikeType, + printFieldLikeReturnType, getDistinctInputTypes, renderEnums, groupModelsNameByImportPath, @@ -263,7 +264,8 @@ function renderResolverFunctionInterface( info: GraphQLResolveInfo, ) ` - const returnType = printFieldLikeType(field, modelMap) + + const returnType = printFieldLikeReturnType(field, modelMap) if (type.name === 'Subscription') { return ` diff --git a/packages/graphqlgen/src/tests/flow/__snapshots__/basic.test.ts.snap b/packages/graphqlgen/src/tests/flow/__snapshots__/basic.test.ts.snap index a462ac6a..fba90ebf 100644 --- a/packages/graphqlgen/src/tests/flow/__snapshots__/basic.test.ts.snap +++ b/packages/graphqlgen/src/tests/flow/__snapshots__/basic.test.ts.snap @@ -24,7 +24,7 @@ export type Query_CreateUser_Resolver = ( args: Query_Args_CreateUser, ctx: Context, info: GraphQLResolveInfo -) => User | null | undefined | Promise; +) => User | null | Promise; export interface Query_Resolvers { createUser: ( @@ -32,7 +32,7 @@ export interface Query_Resolvers { args: Query_Args_CreateUser, ctx: Context, info: GraphQLResolveInfo - ) => User | null | undefined | Promise; + ) => User | null | void | Promise; } // Types for User @@ -205,7 +205,7 @@ export type AddMemberPayload_Json_Resolver = ( args: {}, ctx: Context, info: GraphQLResolveInfo -) => string | null | undefined | Promise; +) => string | null | Promise; export interface AddMemberPayload_Resolvers { json: ( @@ -213,7 +213,7 @@ export interface AddMemberPayload_Resolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => string | null | undefined | Promise; + ) => string | null | void | Promise; } export interface Resolvers { @@ -317,27 +317,21 @@ export type Query_Custom_nullable_Resolver = ( args: {}, ctx: Context, info: GraphQLResolveInfo -) => Number | null | undefined | Promise; +) => Number | null | Promise; export type Query_Custom_array_nullable_Resolver = ( parent: {}, args: {}, ctx: Context, info: GraphQLResolveInfo -) => - | Array - | null - | undefined - | Promise | null | undefined>; +) => Array | null | Promise | null>; export type Query_Custom_array_required_Resolver = ( parent: {}, args: {}, ctx: Context, info: GraphQLResolveInfo -) => - | Array - | Promise>; +) => Array | Promise>; export type Query_Custom_with_arg_Resolver = ( parent: {}, @@ -365,27 +359,21 @@ export type Query_Scalar_nullable_Resolver = ( args: {}, ctx: Context, info: GraphQLResolveInfo -) => boolean | null | undefined | Promise; +) => boolean | null | Promise; export type Query_Scalar_array_nullable_Resolver = ( parent: {}, args: {}, ctx: Context, info: GraphQLResolveInfo -) => - | Array - | null - | undefined - | Promise | null | undefined>; +) => Array | null | Promise | null>; export type Query_Scalar_array_required_Resolver = ( parent: {}, args: {}, ctx: Context, info: GraphQLResolveInfo -) => - | Array - | Promise>; +) => Array | Promise>; export type Query_Scalar_with_arg_Resolver = ( parent: {}, @@ -421,7 +409,7 @@ export interface Query_Resolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => Number | null | undefined | Promise; + ) => Number | null | void | Promise; custom_array_nullable: ( parent: {}, @@ -429,19 +417,17 @@ export interface Query_Resolvers { ctx: Context, info: GraphQLResolveInfo ) => - | Array + | Array | null - | undefined - | Promise | null | undefined>; + | void + | Promise | null | void>; custom_array_required: ( parent: {}, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => - | Array - | Promise>; + ) => Array | Promise>; custom_with_arg: ( parent: {}, @@ -469,7 +455,7 @@ export interface Query_Resolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => boolean | null | undefined | Promise; + ) => boolean | null | void | Promise; scalar_array_nullable: ( parent: {}, @@ -477,19 +463,17 @@ export interface Query_Resolvers { ctx: Context, info: GraphQLResolveInfo ) => - | Array + | Array | null - | undefined - | Promise | null | undefined>; + | void + | Promise | null | void>; scalar_array_required: ( parent: {}, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => - | Array - | Promise>; + ) => Array | Promise>; scalar_with_arg: ( parent: {}, @@ -517,14 +501,14 @@ export type Number_Id_Resolver = ( args: {}, ctx: Context, info: GraphQLResolveInfo -) => string | null | undefined | Promise; +) => string | null | Promise; export type Number_Value_Resolver = ( parent: Number, args: {}, ctx: Context, info: GraphQLResolveInfo -) => number | null | undefined | Promise; +) => number | null | Promise; export interface Number_Resolvers { id: ( @@ -532,14 +516,14 @@ export interface Number_Resolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => string | null | undefined | Promise; + ) => string | null | void | Promise; value: ( parent: Number, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => number | null | undefined | Promise; + ) => number | null | void | Promise; } export interface Resolvers { @@ -722,7 +706,7 @@ export type Professor_Degree_Resolver = ( args: {}, ctx: Context, info: GraphQLResolveInfo -) => string | null | undefined | Promise; +) => string | null | Promise; export interface Professor_Resolvers { degree: ( @@ -730,7 +714,7 @@ export interface Professor_Resolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => string | null | undefined | Promise; + ) => string | null | void | Promise; } export interface Resolvers { @@ -822,7 +806,7 @@ export type Query_CreateUser_Resolver = ( args: {}, ctx: Context, info: GraphQLResolveInfo -) => User | null | undefined | Promise; +) => User | null | Promise; export interface Query_Resolvers { createUser: ( @@ -830,7 +814,7 @@ export interface Query_Resolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => User | null | undefined | Promise; + ) => User | null | void | Promise; } // Types for User @@ -955,27 +939,21 @@ export type Query_Custom_nullable_Resolver = ( args: {}, ctx: Context, info: GraphQLResolveInfo -) => NumberNode | null | undefined | Promise; +) => NumberNode | null | Promise; export type Query_Custom_array_nullable_Resolver = ( parent: {}, args: {}, ctx: Context, info: GraphQLResolveInfo -) => - | Array - | null - | undefined - | Promise | null | undefined>; +) => Array | null | Promise | null>; export type Query_Custom_array_required_Resolver = ( parent: {}, args: {}, ctx: Context, info: GraphQLResolveInfo -) => - | Array - | Promise>; +) => Array | Promise>; export type Query_Custom_with_arg_Resolver = ( parent: {}, @@ -1003,27 +981,21 @@ export type Query_Scalar_nullable_Resolver = ( args: {}, ctx: Context, info: GraphQLResolveInfo -) => boolean | null | undefined | Promise; +) => boolean | null | Promise; export type Query_Scalar_array_nullable_Resolver = ( parent: {}, args: {}, ctx: Context, info: GraphQLResolveInfo -) => - | Array - | null - | undefined - | Promise | null | undefined>; +) => Array | null | Promise | null>; export type Query_Scalar_array_required_Resolver = ( parent: {}, args: {}, ctx: Context, info: GraphQLResolveInfo -) => - | Array - | Promise>; +) => Array | Promise>; export type Query_Scalar_with_arg_Resolver = ( parent: {}, @@ -1059,7 +1031,7 @@ export interface Query_Resolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => NumberNode | null | undefined | Promise; + ) => NumberNode | null | void | Promise; custom_array_nullable: ( parent: {}, @@ -1067,10 +1039,10 @@ export interface Query_Resolvers { ctx: Context, info: GraphQLResolveInfo ) => - | Array + | Array | null - | undefined - | Promise | null | undefined>; + | void + | Promise | null | void>; custom_array_required: ( parent: {}, @@ -1078,8 +1050,8 @@ export interface Query_Resolvers { ctx: Context, info: GraphQLResolveInfo ) => - | Array - | Promise>; + | Array + | Promise>; custom_with_arg: ( parent: {}, @@ -1107,7 +1079,7 @@ export interface Query_Resolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => boolean | null | undefined | Promise; + ) => boolean | null | void | Promise; scalar_array_nullable: ( parent: {}, @@ -1115,19 +1087,17 @@ export interface Query_Resolvers { ctx: Context, info: GraphQLResolveInfo ) => - | Array + | Array | null - | undefined - | Promise | null | undefined>; + | void + | Promise | null | void>; scalar_array_required: ( parent: {}, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => - | Array - | Promise>; + ) => Array | Promise>; scalar_with_arg: ( parent: {}, @@ -1155,14 +1125,14 @@ export type Number_Id_Resolver = ( args: {}, ctx: Context, info: GraphQLResolveInfo -) => string | null | undefined | Promise; +) => string | null | Promise; export type Number_Value_Resolver = ( parent: NumberNode, args: {}, ctx: Context, info: GraphQLResolveInfo -) => number | null | undefined | Promise; +) => number | null | Promise; export interface Number_Resolvers { id: ( @@ -1170,14 +1140,14 @@ export interface Number_Resolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => string | null | undefined | Promise; + ) => string | null | void | Promise; value: ( parent: NumberNode, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => number | null | undefined | Promise; + ) => number | null | void | Promise; } export interface Resolvers { diff --git a/packages/graphqlgen/src/tests/flow/__snapshots__/large-schema.test.ts.snap b/packages/graphqlgen/src/tests/flow/__snapshots__/large-schema.test.ts.snap index 16657ca1..ca8e370d 100644 --- a/packages/graphqlgen/src/tests/flow/__snapshots__/large-schema.test.ts.snap +++ b/packages/graphqlgen/src/tests/flow/__snapshots__/large-schema.test.ts.snap @@ -114,14 +114,14 @@ export type Query_Viewer_Resolver = ( args: {}, ctx: Context, info: GraphQLResolveInfo -) => Viewer | null | undefined | Promise; +) => Viewer | null | Promise; export type Query_MyLocation_Resolver = ( parent: {}, args: {}, ctx: Context, info: GraphQLResolveInfo -) => Location | null | undefined | Promise; +) => Location | null | Promise; export interface Query_Resolvers { topExperiences: ( @@ -171,14 +171,14 @@ export interface Query_Resolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => Viewer | null | undefined | Promise; + ) => Viewer | null | void | Promise; myLocation: ( parent: {}, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => Location | null | undefined | Promise; + ) => Location | null | void | Promise; } // Types for Experience @@ -206,11 +206,7 @@ export type Experience_Category_Resolver = ( args: {}, ctx: Context, info: GraphQLResolveInfo -) => - | ExperienceCategory - | null - | undefined - | Promise; +) => ExperienceCategory | null | Promise; export type Experience_Title_Resolver = ( parent: Experience, @@ -270,8 +266,8 @@ export interface Experience_Resolvers { ) => | ExperienceCategory | null - | undefined - | Promise; + | void + | Promise; title: ( parent: Experience, @@ -351,7 +347,7 @@ export type ExperienceCategory_Experience_Resolver = ( args: {}, ctx: Context, info: GraphQLResolveInfo -) => Experience | null | undefined | Promise; +) => Experience | null | Promise; export interface ExperienceCategory_Resolvers { id: ( @@ -380,7 +376,7 @@ export interface ExperienceCategory_Resolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => Experience | null | undefined | Promise; + ) => Experience | null | void | Promise; } // Types for Location @@ -420,14 +416,14 @@ export type Location_Address_Resolver = ( args: {}, ctx: Context, info: GraphQLResolveInfo -) => string | null | undefined | Promise; +) => string | null | Promise; export type Location_Directions_Resolver = ( parent: Location, args: {}, ctx: Context, info: GraphQLResolveInfo -) => string | null | undefined | Promise; +) => string | null | Promise; export interface Location_Resolvers { id: ( @@ -456,14 +452,14 @@ export interface Location_Resolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => string | null | undefined | Promise; + ) => string | null | void | Promise; directions: ( parent: Location, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => string | null | undefined | Promise; + ) => string | null | void | Promise; } // Types for Review @@ -671,7 +667,7 @@ export const Home_defaultResolvers = { }; export interface Home_Args_Pictures { - first: number | null | undefined; + first: number | null | void; } export type Home_Id_Resolver = ( @@ -686,7 +682,7 @@ export type Home_Name_Resolver = ( args: {}, ctx: Context, info: GraphQLResolveInfo -) => string | null | undefined | Promise; +) => string | null | Promise; export type Home_Description_Resolver = ( parent: Home, @@ -707,7 +703,7 @@ export type Home_AvgRating_Resolver = ( args: {}, ctx: Context, info: GraphQLResolveInfo -) => number | null | undefined | Promise; +) => number | null | Promise; export type Home_Pictures_Resolver = ( parent: Home, @@ -736,7 +732,7 @@ export interface Home_Resolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => string | null | undefined | Promise; + ) => string | null | void | Promise; description: ( parent: Home, @@ -757,7 +753,7 @@ export interface Home_Resolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => number | null | undefined | Promise; + ) => number | null | void | Promise; pictures: ( parent: Home, @@ -938,7 +934,7 @@ export type Neighbourhood_HomePreview_Resolver = ( args: {}, ctx: Context, info: GraphQLResolveInfo -) => Picture | null | undefined | Promise; +) => Picture | null | Promise; export type Neighbourhood_City_Resolver = ( parent: Neighbourhood, @@ -988,7 +984,7 @@ export interface Neighbourhood_Resolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => Picture | null | undefined | Promise; + ) => Picture | null | void | Promise; city: ( parent: Neighbourhood, @@ -1149,11 +1145,7 @@ export type User_Bookings_Resolver = ( args: {}, ctx: Context, info: GraphQLResolveInfo -) => - | Array - | null - | undefined - | Promise | null | undefined>; +) => Array | null | Promise | null>; export type User_CreatedAt_Resolver = ( parent: User, @@ -1181,11 +1173,7 @@ export type User_HostingExperiences_Resolver = ( args: {}, ctx: Context, info: GraphQLResolveInfo -) => - | Array - | null - | undefined - | Promise | null | undefined>; +) => Array | null | Promise | null>; export type User_Id_Resolver = ( parent: User, @@ -1220,29 +1208,21 @@ export type User_Notifications_Resolver = ( args: {}, ctx: Context, info: GraphQLResolveInfo -) => - | Array - | null - | undefined - | Promise | null | undefined>; +) => Array | null | Promise | null>; export type User_OwnedPlaces_Resolver = ( parent: User, args: {}, ctx: Context, info: GraphQLResolveInfo -) => Array | null | undefined | Promise | null | undefined>; +) => Array | null | Promise | null>; export type User_PaymentAccount_Resolver = ( parent: User, args: {}, ctx: Context, info: GraphQLResolveInfo -) => - | Array - | null - | undefined - | Promise | null | undefined>; +) => Array | null | Promise | null>; export type User_Phone_Resolver = ( parent: User, @@ -1256,43 +1236,35 @@ export type User_ProfilePicture_Resolver = ( args: {}, ctx: Context, info: GraphQLResolveInfo -) => Picture | null | undefined | Promise; +) => Picture | null | Promise; export type User_ReceivedMessages_Resolver = ( parent: User, args: {}, ctx: Context, info: GraphQLResolveInfo -) => - | Array - | null - | undefined - | Promise | null | undefined>; +) => Array | null | Promise | null>; export type User_ResponseRate_Resolver = ( parent: User, args: {}, ctx: Context, info: GraphQLResolveInfo -) => number | null | undefined | Promise; +) => number | null | Promise; export type User_ResponseTime_Resolver = ( parent: User, args: {}, ctx: Context, info: GraphQLResolveInfo -) => number | null | undefined | Promise; +) => number | null | Promise; export type User_SentMessages_Resolver = ( parent: User, args: {}, ctx: Context, info: GraphQLResolveInfo -) => - | Array - | null - | undefined - | Promise | null | undefined>; +) => Array | null | Promise | null>; export type User_UpdatedAt_Resolver = ( parent: User, @@ -1314,11 +1286,7 @@ export interface User_Resolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => - | Array - | null - | undefined - | Promise | null | undefined>; + ) => Array | null | void | Promise | null | void>; createdAt: ( parent: User, @@ -1349,8 +1317,8 @@ export interface User_Resolvers { ) => | Array | null - | undefined - | Promise | null | undefined>; + | void + | Promise | null | void>; id: ( parent: User, @@ -1388,19 +1356,15 @@ export interface User_Resolvers { ) => | Array | null - | undefined - | Promise | null | undefined>; + | void + | Promise | null | void>; ownedPlaces: ( parent: User, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => - | Array - | null - | undefined - | Promise | null | undefined>; + ) => Array | null | void | Promise | null | void>; paymentAccount: ( parent: User, @@ -1410,8 +1374,8 @@ export interface User_Resolvers { ) => | Array | null - | undefined - | Promise | null | undefined>; + | void + | Promise | null | void>; phone: ( parent: User, @@ -1425,43 +1389,35 @@ export interface User_Resolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => Picture | null | undefined | Promise; + ) => Picture | null | void | Promise; receivedMessages: ( parent: User, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => - | Array - | null - | undefined - | Promise | null | undefined>; + ) => Array | null | void | Promise | null | void>; responseRate: ( parent: User, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => number | null | undefined | Promise; + ) => number | null | void | Promise; responseTime: ( parent: User, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => number | null | undefined | Promise; + ) => number | null | void | Promise; sentMessages: ( parent: User, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => - | Array - | null - | undefined - | Promise | null | undefined>; + ) => Array | null | void | Promise | null | void>; updatedAt: ( parent: User, @@ -1630,14 +1586,14 @@ export type Place_Name_Resolver = ( args: {}, ctx: Context, info: GraphQLResolveInfo -) => string | null | undefined | Promise; +) => string | null | Promise; export type Place_Size_Resolver = ( parent: Place, args: {}, ctx: Context, info: GraphQLResolveInfo -) => PLACE_SIZES | null | undefined | Promise; +) => PLACE_SIZES | null | Promise; export type Place_ShortDescription_Resolver = ( parent: Place, @@ -1735,25 +1691,21 @@ export type Place_GuestRequirements_Resolver = ( args: {}, ctx: Context, info: GraphQLResolveInfo -) => - | GuestRequirements - | null - | undefined - | Promise; +) => GuestRequirements | null | Promise; export type Place_Policies_Resolver = ( parent: Place, args: {}, ctx: Context, info: GraphQLResolveInfo -) => Policies | null | undefined | Promise; +) => Policies | null | Promise; export type Place_HouseRules_Resolver = ( parent: Place, args: {}, ctx: Context, info: GraphQLResolveInfo -) => HouseRules | null | undefined | Promise; +) => HouseRules | null | Promise; export type Place_Bookings_Resolver = ( parent: Place, @@ -1767,11 +1719,7 @@ export type Place_Pictures_Resolver = ( args: {}, ctx: Context, info: GraphQLResolveInfo -) => - | Array - | null - | undefined - | Promise | null | undefined>; +) => Array | null | Promise | null>; export type Place_Popularity_Resolver = ( parent: Place, @@ -1793,14 +1741,14 @@ export interface Place_Resolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => string | null | undefined | Promise; + ) => string | null | void | Promise; size: ( parent: Place, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => PLACE_SIZES | null | undefined | Promise; + ) => PLACE_SIZES | null | void | Promise; shortDescription: ( parent: Place, @@ -1901,22 +1849,22 @@ export interface Place_Resolvers { ) => | GuestRequirements | null - | undefined - | Promise; + | void + | Promise; policies: ( parent: Place, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => Policies | null | undefined | Promise; + ) => Policies | null | void | Promise; houseRules: ( parent: Place, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => HouseRules | null | undefined | Promise; + ) => HouseRules | null | void | Promise; bookings: ( parent: Place, @@ -1930,11 +1878,7 @@ export interface Place_Resolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => - | Array - | null - | undefined - | Promise | null | undefined>; + ) => Array | null | void | Promise | null | void>; popularity: ( parent: Place, @@ -2617,21 +2561,21 @@ export type Pricing_CleaningFee_Resolver = ( args: {}, ctx: Context, info: GraphQLResolveInfo -) => number | null | undefined | Promise; +) => number | null | Promise; export type Pricing_Currency_Resolver = ( parent: Pricing, args: {}, ctx: Context, info: GraphQLResolveInfo -) => CURRENCY | null | undefined | Promise; +) => CURRENCY | null | Promise; export type Pricing_ExtraGuests_Resolver = ( parent: Pricing, args: {}, ctx: Context, info: GraphQLResolveInfo -) => number | null | undefined | Promise; +) => number | null | Promise; export type Pricing_Id_Resolver = ( parent: Pricing, @@ -2645,7 +2589,7 @@ export type Pricing_MonthlyDiscount_Resolver = ( args: {}, ctx: Context, info: GraphQLResolveInfo -) => number | null | undefined | Promise; +) => number | null | Promise; export type Pricing_PerNight_Resolver = ( parent: Pricing, @@ -2659,7 +2603,7 @@ export type Pricing_SecurityDeposit_Resolver = ( args: {}, ctx: Context, info: GraphQLResolveInfo -) => number | null | undefined | Promise; +) => number | null | Promise; export type Pricing_SmartPricing_Resolver = ( parent: Pricing, @@ -2673,14 +2617,14 @@ export type Pricing_WeekendPricing_Resolver = ( args: {}, ctx: Context, info: GraphQLResolveInfo -) => number | null | undefined | Promise; +) => number | null | Promise; export type Pricing_WeeklyDiscount_Resolver = ( parent: Pricing, args: {}, ctx: Context, info: GraphQLResolveInfo -) => number | null | undefined | Promise; +) => number | null | Promise; export interface Pricing_Resolvers { averageMonthly: ( @@ -2709,21 +2653,21 @@ export interface Pricing_Resolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => number | null | undefined | Promise; + ) => number | null | void | Promise; currency: ( parent: Pricing, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => CURRENCY | null | undefined | Promise; + ) => CURRENCY | null | void | Promise; extraGuests: ( parent: Pricing, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => number | null | undefined | Promise; + ) => number | null | void | Promise; id: ( parent: Pricing, @@ -2737,7 +2681,7 @@ export interface Pricing_Resolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => number | null | undefined | Promise; + ) => number | null | void | Promise; perNight: ( parent: Pricing, @@ -2751,7 +2695,7 @@ export interface Pricing_Resolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => number | null | undefined | Promise; + ) => number | null | void | Promise; smartPricing: ( parent: Pricing, @@ -2765,14 +2709,14 @@ export interface Pricing_Resolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => number | null | undefined | Promise; + ) => number | null | void | Promise; weeklyDiscount: ( parent: Pricing, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => number | null | undefined | Promise; + ) => number | null | void | Promise; } // Types for PlaceViews @@ -3003,7 +2947,7 @@ export type HouseRules_AdditionalRules_Resolver = ( args: {}, ctx: Context, info: GraphQLResolveInfo -) => string | null | undefined | Promise; +) => string | null | Promise; export type HouseRules_CreatedAt_Resolver = ( parent: HouseRules, @@ -3024,35 +2968,35 @@ export type HouseRules_PartiesAndEventsAllowed_Resolver = ( args: {}, ctx: Context, info: GraphQLResolveInfo -) => boolean | null | undefined | Promise; +) => boolean | null | Promise; export type HouseRules_PetsAllowed_Resolver = ( parent: HouseRules, args: {}, ctx: Context, info: GraphQLResolveInfo -) => boolean | null | undefined | Promise; +) => boolean | null | Promise; export type HouseRules_SmokingAllowed_Resolver = ( parent: HouseRules, args: {}, ctx: Context, info: GraphQLResolveInfo -) => boolean | null | undefined | Promise; +) => boolean | null | Promise; export type HouseRules_SuitableForChildren_Resolver = ( parent: HouseRules, args: {}, ctx: Context, info: GraphQLResolveInfo -) => boolean | null | undefined | Promise; +) => boolean | null | Promise; export type HouseRules_SuitableForInfants_Resolver = ( parent: HouseRules, args: {}, ctx: Context, info: GraphQLResolveInfo -) => boolean | null | undefined | Promise; +) => boolean | null | Promise; export type HouseRules_UpdatedAt_Resolver = ( parent: HouseRules, @@ -3067,7 +3011,7 @@ export interface HouseRules_Resolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => string | null | undefined | Promise; + ) => string | null | void | Promise; createdAt: ( parent: HouseRules, @@ -3088,35 +3032,35 @@ export interface HouseRules_Resolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => boolean | null | undefined | Promise; + ) => boolean | null | void | Promise; petsAllowed: ( parent: HouseRules, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => boolean | null | undefined | Promise; + ) => boolean | null | void | Promise; smokingAllowed: ( parent: HouseRules, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => boolean | null | undefined | Promise; + ) => boolean | null | void | Promise; suitableForChildren: ( parent: HouseRules, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => boolean | null | undefined | Promise; + ) => boolean | null | void | Promise; suitableForInfants: ( parent: HouseRules, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => boolean | null | undefined | Promise; + ) => boolean | null | void | Promise; updatedAt: ( parent: HouseRules, @@ -3240,11 +3184,7 @@ export type PaymentAccount_Type_Resolver = ( args: {}, ctx: Context, info: GraphQLResolveInfo -) => - | PAYMENT_PROVIDER - | null - | undefined - | Promise; +) => PAYMENT_PROVIDER | null | Promise; export type PaymentAccount_User_Resolver = ( parent: PaymentAccount, @@ -3265,22 +3205,14 @@ export type PaymentAccount_Paypal_Resolver = ( args: {}, ctx: Context, info: GraphQLResolveInfo -) => - | PaypalInformation - | null - | undefined - | Promise; +) => PaypalInformation | null | Promise; export type PaymentAccount_Creditcard_Resolver = ( parent: PaymentAccount, args: {}, ctx: Context, info: GraphQLResolveInfo -) => - | CreditCardInformation - | null - | undefined - | Promise; +) => CreditCardInformation | null | Promise; export interface PaymentAccount_Resolvers { id: ( @@ -3302,11 +3234,7 @@ export interface PaymentAccount_Resolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => - | PAYMENT_PROVIDER - | null - | undefined - | Promise; + ) => PAYMENT_PROVIDER | null | void | Promise; user: ( parent: PaymentAccount, @@ -3330,8 +3258,8 @@ export interface PaymentAccount_Resolvers { ) => | PaypalInformation | null - | undefined - | Promise; + | void + | Promise; creditcard: ( parent: PaymentAccount, @@ -3341,8 +3269,8 @@ export interface PaymentAccount_Resolvers { ) => | CreditCardInformation | null - | undefined - | Promise; + | void + | Promise; } // Types for PaypalInformation @@ -3488,11 +3416,7 @@ export type CreditCardInformation_PaymentAccount_Resolver = ( args: {}, ctx: Context, info: GraphQLResolveInfo -) => - | PaymentAccount - | null - | undefined - | Promise; +) => PaymentAccount | null | Promise; export type CreditCardInformation_PostalCode_Resolver = ( parent: CreditCardInformation, @@ -3570,11 +3494,7 @@ export interface CreditCardInformation_Resolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => - | PaymentAccount - | null - | undefined - | Promise; + ) => PaymentAccount | null | void | Promise; postalCode: ( parent: CreditCardInformation, @@ -3635,11 +3555,7 @@ export type Notification_Type_Resolver = ( args: {}, ctx: Context, info: GraphQLResolveInfo -) => - | NOTIFICATION_TYPE - | null - | undefined - | Promise; +) => NOTIFICATION_TYPE | null | Promise; export type Notification_User_Resolver = ( parent: Notification, @@ -3685,8 +3601,8 @@ export interface Notification_Resolvers { ) => | NOTIFICATION_TYPE | null - | undefined - | Promise; + | void + | Promise; user: ( parent: Notification, diff --git a/packages/graphqlgen/src/tests/typescript/__snapshots__/basic.test.ts.snap b/packages/graphqlgen/src/tests/typescript/__snapshots__/basic.test.ts.snap index f86bf004..4a4e8e5b 100644 --- a/packages/graphqlgen/src/tests/typescript/__snapshots__/basic.test.ts.snap +++ b/packages/graphqlgen/src/tests/typescript/__snapshots__/basic.test.ts.snap @@ -23,7 +23,7 @@ export namespace QueryResolvers { args: ArgsCreateUser, ctx: Context, info: GraphQLResolveInfo - ) => User | null | undefined | Promise; + ) => User | null | Promise; export interface Type { createUser: ( @@ -245,14 +245,14 @@ export namespace AddMemberPayloadResolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => string | null | undefined | Promise; + ) => string | null | Promise; export type ExistingUserInviteSentResolver = ( parent: AddMemberPayload, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => boolean | null | undefined | Promise; + ) => boolean | null | Promise; export interface Type { newUserId: ( @@ -382,7 +382,7 @@ export namespace AddMemberPayloadResolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => string | null | undefined | Promise; + ) => string | null | Promise; export interface Type { json: ( @@ -497,27 +497,21 @@ export namespace QueryResolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => Number | null | undefined | Promise; + ) => Number | null | Promise; export type Custom_array_nullableResolver = ( parent: undefined, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => - | Array - | null - | undefined - | Promise | null | undefined>; + ) => Array | null | Promise | null>; export type Custom_array_requiredResolver = ( parent: undefined, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => - | Array - | Promise>; + ) => Array | Promise>; export type Custom_with_argResolver = ( parent: undefined, @@ -545,27 +539,21 @@ export namespace QueryResolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => boolean | null | undefined | Promise; + ) => boolean | null | Promise; export type Scalar_array_nullableResolver = ( parent: undefined, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => - | Array - | null - | undefined - | Promise | null | undefined>; + ) => Array | null | Promise | null>; export type Scalar_array_requiredResolver = ( parent: undefined, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => - | Array - | Promise>; + ) => Array | Promise>; export type Scalar_with_argResolver = ( parent: undefined, @@ -698,14 +686,14 @@ export namespace NumberResolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => string | null | undefined | Promise; + ) => string | null | Promise; export type ValueResolver = ( parent: Number, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => number | null | undefined | Promise; + ) => number | null | Promise; export interface Type { id: ( @@ -908,7 +896,7 @@ export namespace ProfessorResolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => string | null | undefined | Promise; + ) => string | null | Promise; export interface Type { degree: ( @@ -1009,7 +997,7 @@ export namespace QueryResolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => User | null | undefined | Promise; + ) => User | null | Promise; export interface Type { createUser: ( @@ -1146,7 +1134,7 @@ export namespace QueryResolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => NumberNode | null | undefined | Promise; + ) => NumberNode | null | Promise; export type Custom_array_nullableResolver = ( parent: undefined, @@ -1154,19 +1142,16 @@ export namespace QueryResolvers { ctx: Context, info: GraphQLResolveInfo ) => - | Array + | Array | null - | undefined - | Promise | null | undefined>; + | Promise | null>; export type Custom_array_requiredResolver = ( parent: undefined, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => - | Array - | Promise>; + ) => Array | Promise>; export type Custom_with_argResolver = ( parent: undefined, @@ -1194,27 +1179,21 @@ export namespace QueryResolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => boolean | null | undefined | Promise; + ) => boolean | null | Promise; export type Scalar_array_nullableResolver = ( parent: undefined, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => - | Array - | null - | undefined - | Promise | null | undefined>; + ) => Array | null | Promise | null>; export type Scalar_array_requiredResolver = ( parent: undefined, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => - | Array - | Promise>; + ) => Array | Promise>; export type Scalar_with_argResolver = ( parent: undefined, @@ -1347,14 +1326,14 @@ export namespace NumberResolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => string | null | undefined | Promise; + ) => string | null | Promise; export type ValueResolver = ( parent: NumberNode, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => number | null | undefined | Promise; + ) => number | null | Promise; export interface Type { id: ( @@ -1512,27 +1491,21 @@ export namespace QueryResolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => Number | null | undefined | Promise; + ) => Number | null | Promise; export type Custom_array_nullableResolver = ( parent: undefined, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => - | Array - | null - | undefined - | Promise | null | undefined>; + ) => Array | null | Promise | null>; export type Custom_array_requiredResolver = ( parent: undefined, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => - | Array - | Promise>; + ) => Array | Promise>; export type Custom_with_argResolver = ( parent: undefined, @@ -1560,27 +1533,21 @@ export namespace QueryResolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => boolean | null | undefined | Promise; + ) => boolean | null | Promise; export type Scalar_array_nullableResolver = ( parent: undefined, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => - | Array - | null - | undefined - | Promise | null | undefined>; + ) => Array | null | Promise | null>; export type Scalar_array_requiredResolver = ( parent: undefined, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => - | Array - | Promise>; + ) => Array | Promise>; export type Scalar_with_argResolver = ( parent: undefined, @@ -1713,14 +1680,14 @@ export namespace NumberResolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => string | null | undefined | Promise; + ) => string | null | Promise; export type ValueResolver = ( parent: Number, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => number | null | undefined | Promise; + ) => number | null | Promise; export interface Type { id: ( diff --git a/packages/graphqlgen/src/tests/typescript/__snapshots__/large-schema.test.ts.snap b/packages/graphqlgen/src/tests/typescript/__snapshots__/large-schema.test.ts.snap index e15e8669..e992ff4a 100644 --- a/packages/graphqlgen/src/tests/typescript/__snapshots__/large-schema.test.ts.snap +++ b/packages/graphqlgen/src/tests/typescript/__snapshots__/large-schema.test.ts.snap @@ -113,14 +113,14 @@ export namespace QueryResolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => Viewer | null | undefined | Promise; + ) => Viewer | null | Promise; export type MyLocationResolver = ( parent: undefined, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => Location | null | undefined | Promise; + ) => Location | null | Promise; export interface Type { topExperiences: ( @@ -206,11 +206,7 @@ export namespace ExperienceResolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => - | ExperienceCategory - | null - | undefined - | Promise; + ) => ExperienceCategory | null | Promise; export type TitleResolver = ( parent: Experience, @@ -352,7 +348,7 @@ export namespace ExperienceCategoryResolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => Experience | null | undefined | Promise; + ) => Experience | null | Promise; export interface Type { id: ( @@ -422,14 +418,14 @@ export namespace LocationResolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => string | null | undefined | Promise; + ) => string | null | Promise; export type DirectionsResolver = ( parent: Location, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => string | null | undefined | Promise; + ) => string | null | Promise; export interface Type { id: ( @@ -691,7 +687,7 @@ export namespace HomeResolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => string | null | undefined | Promise; + ) => string | null | Promise; export type DescriptionResolver = ( parent: Home, @@ -712,7 +708,7 @@ export namespace HomeResolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => number | null | undefined | Promise; + ) => number | null | Promise; export type PicturesResolver = ( parent: Home, @@ -945,7 +941,7 @@ export namespace NeighbourhoodResolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => Picture | null | undefined | Promise; + ) => Picture | null | Promise; export type CityResolver = ( parent: Neighbourhood, @@ -1160,11 +1156,7 @@ export namespace UserResolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => - | Array - | null - | undefined - | Promise | null | undefined>; + ) => Array | null | Promise | null>; export type CreatedAtResolver = ( parent: User, @@ -1192,11 +1184,7 @@ export namespace UserResolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => - | Array - | null - | undefined - | Promise | null | undefined>; + ) => Array | null | Promise | null>; export type IdResolver = ( parent: User, @@ -1231,33 +1219,21 @@ export namespace UserResolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => - | Array - | null - | undefined - | Promise | null | undefined>; + ) => Array | null | Promise | null>; export type OwnedPlacesResolver = ( parent: User, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => - | Array - | null - | undefined - | Promise | null | undefined>; + ) => Array | null | Promise | null>; export type PaymentAccountResolver = ( parent: User, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => - | Array - | null - | undefined - | Promise | null | undefined>; + ) => Array | null | Promise | null>; export type PhoneResolver = ( parent: User, @@ -1271,43 +1247,35 @@ export namespace UserResolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => Picture | null | undefined | Promise; + ) => Picture | null | Promise; export type ReceivedMessagesResolver = ( parent: User, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => - | Array - | null - | undefined - | Promise | null | undefined>; + ) => Array | null | Promise | null>; export type ResponseRateResolver = ( parent: User, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => number | null | undefined | Promise; + ) => number | null | Promise; export type ResponseTimeResolver = ( parent: User, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => number | null | undefined | Promise; + ) => number | null | Promise; export type SentMessagesResolver = ( parent: User, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => - | Array - | null - | undefined - | Promise | null | undefined>; + ) => Array | null | Promise | null>; export type UpdatedAtResolver = ( parent: User, @@ -1647,14 +1615,14 @@ export namespace PlaceResolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => string | null | undefined | Promise; + ) => string | null | Promise; export type SizeResolver = ( parent: Place, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => PLACE_SIZES | null | undefined | Promise; + ) => PLACE_SIZES | null | Promise; export type ShortDescriptionResolver = ( parent: Place, @@ -1752,25 +1720,21 @@ export namespace PlaceResolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => - | GuestRequirements - | null - | undefined - | Promise; + ) => GuestRequirements | null | Promise; export type PoliciesResolver = ( parent: Place, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => Policies | null | undefined | Promise; + ) => Policies | null | Promise; export type HouseRulesResolver = ( parent: Place, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => HouseRules | null | undefined | Promise; + ) => HouseRules | null | Promise; export type BookingsResolver = ( parent: Place, @@ -1784,11 +1748,7 @@ export namespace PlaceResolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => - | Array - | null - | undefined - | Promise | null | undefined>; + ) => Array | null | Promise | null>; export type PopularityResolver = ( parent: Place, @@ -2642,21 +2602,21 @@ export namespace PricingResolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => number | null | undefined | Promise; + ) => number | null | Promise; export type CurrencyResolver = ( parent: Pricing, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => CURRENCY | null | undefined | Promise; + ) => CURRENCY | null | Promise; export type ExtraGuestsResolver = ( parent: Pricing, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => number | null | undefined | Promise; + ) => number | null | Promise; export type IdResolver = ( parent: Pricing, @@ -2670,7 +2630,7 @@ export namespace PricingResolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => number | null | undefined | Promise; + ) => number | null | Promise; export type PerNightResolver = ( parent: Pricing, @@ -2684,7 +2644,7 @@ export namespace PricingResolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => number | null | undefined | Promise; + ) => number | null | Promise; export type SmartPricingResolver = ( parent: Pricing, @@ -2698,14 +2658,14 @@ export namespace PricingResolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => number | null | undefined | Promise; + ) => number | null | Promise; export type WeeklyDiscountResolver = ( parent: Pricing, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => number | null | undefined | Promise; + ) => number | null | Promise; export interface Type { averageMonthly: ( @@ -3034,7 +2994,7 @@ export namespace HouseRulesResolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => string | null | undefined | Promise; + ) => string | null | Promise; export type CreatedAtResolver = ( parent: HouseRules, @@ -3055,35 +3015,35 @@ export namespace HouseRulesResolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => boolean | null | undefined | Promise; + ) => boolean | null | Promise; export type PetsAllowedResolver = ( parent: HouseRules, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => boolean | null | undefined | Promise; + ) => boolean | null | Promise; export type SmokingAllowedResolver = ( parent: HouseRules, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => boolean | null | undefined | Promise; + ) => boolean | null | Promise; export type SuitableForChildrenResolver = ( parent: HouseRules, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => boolean | null | undefined | Promise; + ) => boolean | null | Promise; export type SuitableForInfantsResolver = ( parent: HouseRules, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => boolean | null | undefined | Promise; + ) => boolean | null | Promise; export type UpdatedAtResolver = ( parent: HouseRules, @@ -3273,11 +3233,7 @@ export namespace PaymentAccountResolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => - | PAYMENT_PROVIDER - | null - | undefined - | Promise; + ) => PAYMENT_PROVIDER | null | Promise; export type UserResolver = ( parent: PaymentAccount, @@ -3298,22 +3254,14 @@ export namespace PaymentAccountResolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => - | PaypalInformation - | null - | undefined - | Promise; + ) => PaypalInformation | null | Promise; export type CreditcardResolver = ( parent: PaymentAccount, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => - | CreditCardInformation - | null - | undefined - | Promise; + ) => CreditCardInformation | null | Promise; export interface Type { id: ( @@ -3523,11 +3471,7 @@ export namespace CreditCardInformationResolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => - | PaymentAccount - | null - | undefined - | Promise; + ) => PaymentAccount | null | Promise; export type PostalCodeResolver = ( parent: CreditCardInformation, @@ -3671,11 +3615,7 @@ export namespace NotificationResolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => - | NOTIFICATION_TYPE - | null - | undefined - | Promise; + ) => NOTIFICATION_TYPE | null | Promise; export type UserResolver = ( parent: Notification, From 4dadf861384235914fd7bdcd36a7682c994f1f36 Mon Sep 17 00:00:00 2001 From: Jason Kuhrt Date: Wed, 2 Jan 2019 22:56:09 -0500 Subject: [PATCH 4/8] fix: other case of return type field generation --- .../src/generators/flow-generator.ts | 2 +- .../graphqlgen/src/generators/ts-generator.ts | 2 +- .../flow/__snapshots__/basic.test.ts.snap | 57 +++---- .../__snapshots__/large-schema.test.ts.snap | 118 +++++--------- .../__snapshots__/basic.test.ts.snap | 95 ++++------- .../__snapshots__/large-schema.test.ts.snap | 150 +++++------------- 6 files changed, 140 insertions(+), 284 deletions(-) diff --git a/packages/graphqlgen/src/generators/flow-generator.ts b/packages/graphqlgen/src/generators/flow-generator.ts index 6226c8e0..1d05495d 100644 --- a/packages/graphqlgen/src/generators/flow-generator.ts +++ b/packages/graphqlgen/src/generators/flow-generator.ts @@ -301,7 +301,7 @@ function renderResolverTypeInterfaceFunction( ctx: ${getContextName(context)}, info: GraphQLResolveInfo, )` - const returnType = printFieldLikeFlowType(field, modelMap) + const returnType = printFieldLikeReturnType(field, modelMap) if (type.name === 'Subscription') { return ` diff --git a/packages/graphqlgen/src/generators/ts-generator.ts b/packages/graphqlgen/src/generators/ts-generator.ts index 0fa3f2f3..3f7448ea 100644 --- a/packages/graphqlgen/src/generators/ts-generator.ts +++ b/packages/graphqlgen/src/generators/ts-generator.ts @@ -313,7 +313,7 @@ function renderResolverTypeInterfaceFunction( info: GraphQLResolveInfo, ) ` - const returnType = printFieldLikeType(field, modelMap) + const returnType = printFieldLikeReturnType(field, modelMap) if (type.name === 'Subscription') { return ` diff --git a/packages/graphqlgen/src/tests/flow/__snapshots__/basic.test.ts.snap b/packages/graphqlgen/src/tests/flow/__snapshots__/basic.test.ts.snap index fba90ebf..8f2ffc59 100644 --- a/packages/graphqlgen/src/tests/flow/__snapshots__/basic.test.ts.snap +++ b/packages/graphqlgen/src/tests/flow/__snapshots__/basic.test.ts.snap @@ -32,7 +32,7 @@ export interface Query_Resolvers { args: Query_Args_CreateUser, ctx: Context, info: GraphQLResolveInfo - ) => User | null | void | Promise; + ) => User | null | Promise; } // Types for User @@ -213,7 +213,7 @@ export interface AddMemberPayload_Resolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => string | null | void | Promise; + ) => string | null | Promise; } export interface Resolvers { @@ -409,25 +409,21 @@ export interface Query_Resolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => Number | null | void | Promise; + ) => Number | null | Promise; custom_array_nullable: ( parent: {}, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => - | Array - | null - | void - | Promise | null | void>; + ) => Array | null | Promise | null>; custom_array_required: ( parent: {}, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => Array | Promise>; + ) => Array | Promise>; custom_with_arg: ( parent: {}, @@ -455,25 +451,21 @@ export interface Query_Resolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => boolean | null | void | Promise; + ) => boolean | null | Promise; scalar_array_nullable: ( parent: {}, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => - | Array - | null - | void - | Promise | null | void>; + ) => Array | null | Promise | null>; scalar_array_required: ( parent: {}, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => Array | Promise>; + ) => Array | Promise>; scalar_with_arg: ( parent: {}, @@ -516,14 +508,14 @@ export interface Number_Resolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => string | null | void | Promise; + ) => string | null | Promise; value: ( parent: Number, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => number | null | void | Promise; + ) => number | null | Promise; } export interface Resolvers { @@ -714,7 +706,7 @@ export interface Professor_Resolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => string | null | void | Promise; + ) => string | null | Promise; } export interface Resolvers { @@ -814,7 +806,7 @@ export interface Query_Resolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => User | null | void | Promise; + ) => User | null | Promise; } // Types for User @@ -1031,7 +1023,7 @@ export interface Query_Resolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => NumberNode | null | void | Promise; + ) => NumberNode | null | Promise; custom_array_nullable: ( parent: {}, @@ -1039,19 +1031,16 @@ export interface Query_Resolvers { ctx: Context, info: GraphQLResolveInfo ) => - | Array + | Array | null - | void - | Promise | null | void>; + | Promise | null>; custom_array_required: ( parent: {}, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => - | Array - | Promise>; + ) => Array | Promise>; custom_with_arg: ( parent: {}, @@ -1079,25 +1068,21 @@ export interface Query_Resolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => boolean | null | void | Promise; + ) => boolean | null | Promise; scalar_array_nullable: ( parent: {}, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => - | Array - | null - | void - | Promise | null | void>; + ) => Array | null | Promise | null>; scalar_array_required: ( parent: {}, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => Array | Promise>; + ) => Array | Promise>; scalar_with_arg: ( parent: {}, @@ -1140,14 +1125,14 @@ export interface Number_Resolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => string | null | void | Promise; + ) => string | null | Promise; value: ( parent: NumberNode, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => number | null | void | Promise; + ) => number | null | Promise; } export interface Resolvers { diff --git a/packages/graphqlgen/src/tests/flow/__snapshots__/large-schema.test.ts.snap b/packages/graphqlgen/src/tests/flow/__snapshots__/large-schema.test.ts.snap index ca8e370d..28b78d34 100644 --- a/packages/graphqlgen/src/tests/flow/__snapshots__/large-schema.test.ts.snap +++ b/packages/graphqlgen/src/tests/flow/__snapshots__/large-schema.test.ts.snap @@ -171,14 +171,14 @@ export interface Query_Resolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => Viewer | null | void | Promise; + ) => Viewer | null | Promise; myLocation: ( parent: {}, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => Location | null | void | Promise; + ) => Location | null | Promise; } // Types for Experience @@ -263,11 +263,7 @@ export interface Experience_Resolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => - | ExperienceCategory - | null - | void - | Promise; + ) => ExperienceCategory | null | Promise; title: ( parent: Experience, @@ -376,7 +372,7 @@ export interface ExperienceCategory_Resolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => Experience | null | void | Promise; + ) => Experience | null | Promise; } // Types for Location @@ -452,14 +448,14 @@ export interface Location_Resolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => string | null | void | Promise; + ) => string | null | Promise; directions: ( parent: Location, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => string | null | void | Promise; + ) => string | null | Promise; } // Types for Review @@ -732,7 +728,7 @@ export interface Home_Resolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => string | null | void | Promise; + ) => string | null | Promise; description: ( parent: Home, @@ -753,7 +749,7 @@ export interface Home_Resolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => number | null | void | Promise; + ) => number | null | Promise; pictures: ( parent: Home, @@ -984,7 +980,7 @@ export interface Neighbourhood_Resolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => Picture | null | void | Promise; + ) => Picture | null | Promise; city: ( parent: Neighbourhood, @@ -1286,7 +1282,7 @@ export interface User_Resolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => Array | null | void | Promise | null | void>; + ) => Array | null | Promise | null>; createdAt: ( parent: User, @@ -1314,11 +1310,7 @@ export interface User_Resolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => - | Array - | null - | void - | Promise | null | void>; + ) => Array | null | Promise | null>; id: ( parent: User, @@ -1353,29 +1345,21 @@ export interface User_Resolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => - | Array - | null - | void - | Promise | null | void>; + ) => Array | null | Promise | null>; ownedPlaces: ( parent: User, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => Array | null | void | Promise | null | void>; + ) => Array | null | Promise | null>; paymentAccount: ( parent: User, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => - | Array - | null - | void - | Promise | null | void>; + ) => Array | null | Promise | null>; phone: ( parent: User, @@ -1389,35 +1373,35 @@ export interface User_Resolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => Picture | null | void | Promise; + ) => Picture | null | Promise; receivedMessages: ( parent: User, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => Array | null | void | Promise | null | void>; + ) => Array | null | Promise | null>; responseRate: ( parent: User, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => number | null | void | Promise; + ) => number | null | Promise; responseTime: ( parent: User, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => number | null | void | Promise; + ) => number | null | Promise; sentMessages: ( parent: User, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => Array | null | void | Promise | null | void>; + ) => Array | null | Promise | null>; updatedAt: ( parent: User, @@ -1741,14 +1725,14 @@ export interface Place_Resolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => string | null | void | Promise; + ) => string | null | Promise; size: ( parent: Place, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => PLACE_SIZES | null | void | Promise; + ) => PLACE_SIZES | null | Promise; shortDescription: ( parent: Place, @@ -1846,25 +1830,21 @@ export interface Place_Resolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => - | GuestRequirements - | null - | void - | Promise; + ) => GuestRequirements | null | Promise; policies: ( parent: Place, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => Policies | null | void | Promise; + ) => Policies | null | Promise; houseRules: ( parent: Place, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => HouseRules | null | void | Promise; + ) => HouseRules | null | Promise; bookings: ( parent: Place, @@ -1878,7 +1858,7 @@ export interface Place_Resolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => Array | null | void | Promise | null | void>; + ) => Array | null | Promise | null>; popularity: ( parent: Place, @@ -2653,21 +2633,21 @@ export interface Pricing_Resolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => number | null | void | Promise; + ) => number | null | Promise; currency: ( parent: Pricing, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => CURRENCY | null | void | Promise; + ) => CURRENCY | null | Promise; extraGuests: ( parent: Pricing, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => number | null | void | Promise; + ) => number | null | Promise; id: ( parent: Pricing, @@ -2681,7 +2661,7 @@ export interface Pricing_Resolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => number | null | void | Promise; + ) => number | null | Promise; perNight: ( parent: Pricing, @@ -2695,7 +2675,7 @@ export interface Pricing_Resolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => number | null | void | Promise; + ) => number | null | Promise; smartPricing: ( parent: Pricing, @@ -2709,14 +2689,14 @@ export interface Pricing_Resolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => number | null | void | Promise; + ) => number | null | Promise; weeklyDiscount: ( parent: Pricing, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => number | null | void | Promise; + ) => number | null | Promise; } // Types for PlaceViews @@ -3011,7 +2991,7 @@ export interface HouseRules_Resolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => string | null | void | Promise; + ) => string | null | Promise; createdAt: ( parent: HouseRules, @@ -3032,35 +3012,35 @@ export interface HouseRules_Resolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => boolean | null | void | Promise; + ) => boolean | null | Promise; petsAllowed: ( parent: HouseRules, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => boolean | null | void | Promise; + ) => boolean | null | Promise; smokingAllowed: ( parent: HouseRules, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => boolean | null | void | Promise; + ) => boolean | null | Promise; suitableForChildren: ( parent: HouseRules, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => boolean | null | void | Promise; + ) => boolean | null | Promise; suitableForInfants: ( parent: HouseRules, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => boolean | null | void | Promise; + ) => boolean | null | Promise; updatedAt: ( parent: HouseRules, @@ -3234,7 +3214,7 @@ export interface PaymentAccount_Resolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => PAYMENT_PROVIDER | null | void | Promise; + ) => PAYMENT_PROVIDER | null | Promise; user: ( parent: PaymentAccount, @@ -3255,22 +3235,14 @@ export interface PaymentAccount_Resolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => - | PaypalInformation - | null - | void - | Promise; + ) => PaypalInformation | null | Promise; creditcard: ( parent: PaymentAccount, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => - | CreditCardInformation - | null - | void - | Promise; + ) => CreditCardInformation | null | Promise; } // Types for PaypalInformation @@ -3494,7 +3466,7 @@ export interface CreditCardInformation_Resolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => PaymentAccount | null | void | Promise; + ) => PaymentAccount | null | Promise; postalCode: ( parent: CreditCardInformation, @@ -3598,11 +3570,7 @@ export interface Notification_Resolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => - | NOTIFICATION_TYPE - | null - | void - | Promise; + ) => NOTIFICATION_TYPE | null | Promise; user: ( parent: Notification, diff --git a/packages/graphqlgen/src/tests/typescript/__snapshots__/basic.test.ts.snap b/packages/graphqlgen/src/tests/typescript/__snapshots__/basic.test.ts.snap index 4a4e8e5b..a98aa78e 100644 --- a/packages/graphqlgen/src/tests/typescript/__snapshots__/basic.test.ts.snap +++ b/packages/graphqlgen/src/tests/typescript/__snapshots__/basic.test.ts.snap @@ -31,7 +31,7 @@ export namespace QueryResolvers { args: ArgsCreateUser, ctx: Context, info: GraphQLResolveInfo - ) => User | null | undefined | Promise; + ) => User | null | Promise; } } @@ -260,14 +260,14 @@ export namespace AddMemberPayloadResolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => string | null | undefined | Promise; + ) => string | null | Promise; existingUserInviteSent: ( parent: AddMemberPayload, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => boolean | null | undefined | Promise; + ) => boolean | null | Promise; } } @@ -390,7 +390,7 @@ export namespace AddMemberPayloadResolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => string | null | undefined | Promise; + ) => string | null | Promise; } } @@ -589,27 +589,21 @@ export namespace QueryResolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => Number | null | undefined | Promise; + ) => Number | null | Promise; custom_array_nullable: ( parent: undefined, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => - | Array - | null - | undefined - | Promise | null | undefined>; + ) => Array | null | Promise | null>; custom_array_required: ( parent: undefined, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => - | Array - | Promise>; + ) => Array | Promise>; custom_with_arg: ( parent: undefined, @@ -637,27 +631,21 @@ export namespace QueryResolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => boolean | null | undefined | Promise; + ) => boolean | null | Promise; scalar_array_nullable: ( parent: undefined, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => - | Array - | null - | undefined - | Promise | null | undefined>; + ) => Array | null | Promise | null>; scalar_array_required: ( parent: undefined, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => - | Array - | Promise>; + ) => Array | Promise>; scalar_with_arg: ( parent: undefined, @@ -701,14 +689,14 @@ export namespace NumberResolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => string | null | undefined | Promise; + ) => string | null | Promise; value: ( parent: Number, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => number | null | undefined | Promise; + ) => number | null | Promise; } } @@ -904,7 +892,7 @@ export namespace ProfessorResolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => string | null | undefined | Promise; + ) => string | null | Promise; } } @@ -1005,7 +993,7 @@ export namespace QueryResolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => User | null | undefined | Promise; + ) => User | null | Promise; } } @@ -1229,7 +1217,7 @@ export namespace QueryResolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => NumberNode | null | undefined | Promise; + ) => NumberNode | null | Promise; custom_array_nullable: ( parent: undefined, @@ -1237,19 +1225,16 @@ export namespace QueryResolvers { ctx: Context, info: GraphQLResolveInfo ) => - | Array + | Array | null - | undefined - | Promise | null | undefined>; + | Promise | null>; custom_array_required: ( parent: undefined, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => - | Array - | Promise>; + ) => Array | Promise>; custom_with_arg: ( parent: undefined, @@ -1277,27 +1262,21 @@ export namespace QueryResolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => boolean | null | undefined | Promise; + ) => boolean | null | Promise; scalar_array_nullable: ( parent: undefined, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => - | Array - | null - | undefined - | Promise | null | undefined>; + ) => Array | null | Promise | null>; scalar_array_required: ( parent: undefined, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => - | Array - | Promise>; + ) => Array | Promise>; scalar_with_arg: ( parent: undefined, @@ -1341,14 +1320,14 @@ export namespace NumberResolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => string | null | undefined | Promise; + ) => string | null | Promise; value: ( parent: NumberNode, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => number | null | undefined | Promise; + ) => number | null | Promise; } } @@ -1583,27 +1562,21 @@ export namespace QueryResolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => Number | null | undefined | Promise; + ) => Number | null | Promise; custom_array_nullable: ( parent: undefined, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => - | Array - | null - | undefined - | Promise | null | undefined>; + ) => Array | null | Promise | null>; custom_array_required: ( parent: undefined, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => - | Array - | Promise>; + ) => Array | Promise>; custom_with_arg: ( parent: undefined, @@ -1631,27 +1604,21 @@ export namespace QueryResolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => boolean | null | undefined | Promise; + ) => boolean | null | Promise; scalar_array_nullable: ( parent: undefined, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => - | Array - | null - | undefined - | Promise | null | undefined>; + ) => Array | null | Promise | null>; scalar_array_required: ( parent: undefined, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => - | Array - | Promise>; + ) => Array | Promise>; scalar_with_arg: ( parent: undefined, @@ -1695,14 +1662,14 @@ export namespace NumberResolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => string | null | undefined | Promise; + ) => string | null | Promise; value: ( parent: Number, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => number | null | undefined | Promise; + ) => number | null | Promise; } } diff --git a/packages/graphqlgen/src/tests/typescript/__snapshots__/large-schema.test.ts.snap b/packages/graphqlgen/src/tests/typescript/__snapshots__/large-schema.test.ts.snap index e992ff4a..129c286c 100644 --- a/packages/graphqlgen/src/tests/typescript/__snapshots__/large-schema.test.ts.snap +++ b/packages/graphqlgen/src/tests/typescript/__snapshots__/large-schema.test.ts.snap @@ -170,14 +170,14 @@ export namespace QueryResolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => Viewer | null | undefined | Promise; + ) => Viewer | null | Promise; myLocation: ( parent: undefined, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => Location | null | undefined | Promise; + ) => Location | null | Promise; } } @@ -263,11 +263,7 @@ export namespace ExperienceResolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => - | ExperienceCategory - | null - | undefined - | Promise; + ) => ExperienceCategory | null | Promise; title: ( parent: Experience, @@ -377,7 +373,7 @@ export namespace ExperienceCategoryResolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => Experience | null | undefined | Promise; + ) => Experience | null | Promise; } } @@ -454,14 +450,14 @@ export namespace LocationResolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => string | null | undefined | Promise; + ) => string | null | Promise; directions: ( parent: Location, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => string | null | undefined | Promise; + ) => string | null | Promise; } } @@ -737,7 +733,7 @@ export namespace HomeResolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => string | null | undefined | Promise; + ) => string | null | Promise; description: ( parent: Home, @@ -758,7 +754,7 @@ export namespace HomeResolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => number | null | undefined | Promise; + ) => number | null | Promise; pictures: ( parent: Home, @@ -991,7 +987,7 @@ export namespace NeighbourhoodResolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => Picture | null | undefined | Promise; + ) => Picture | null | Promise; city: ( parent: Neighbourhood, @@ -1297,11 +1293,7 @@ export namespace UserResolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => - | Array - | null - | undefined - | Promise | null | undefined>; + ) => Array | null | Promise | null>; createdAt: ( parent: User, @@ -1329,11 +1321,7 @@ export namespace UserResolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => - | Array - | null - | undefined - | Promise | null | undefined>; + ) => Array | null | Promise | null>; id: ( parent: User, @@ -1368,33 +1356,21 @@ export namespace UserResolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => - | Array - | null - | undefined - | Promise | null | undefined>; + ) => Array | null | Promise | null>; ownedPlaces: ( parent: User, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => - | Array - | null - | undefined - | Promise | null | undefined>; + ) => Array | null | Promise | null>; paymentAccount: ( parent: User, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => - | Array - | null - | undefined - | Promise | null | undefined>; + ) => Array | null | Promise | null>; phone: ( parent: User, @@ -1408,43 +1384,35 @@ export namespace UserResolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => Picture | null | undefined | Promise; + ) => Picture | null | Promise; receivedMessages: ( parent: User, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => - | Array - | null - | undefined - | Promise | null | undefined>; + ) => Array | null | Promise | null>; responseRate: ( parent: User, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => number | null | undefined | Promise; + ) => number | null | Promise; responseTime: ( parent: User, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => number | null | undefined | Promise; + ) => number | null | Promise; sentMessages: ( parent: User, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => - | Array - | null - | undefined - | Promise | null | undefined>; + ) => Array | null | Promise | null>; updatedAt: ( parent: User, @@ -1770,18 +1738,14 @@ export namespace PlaceResolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => string | null | undefined | Promise; + ) => string | null | Promise; size: ( parent: Place, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => - | PLACE_SIZES - | null - | undefined - | Promise; + ) => PLACE_SIZES | null | Promise; shortDescription: ( parent: Place, @@ -1879,25 +1843,21 @@ export namespace PlaceResolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => - | GuestRequirements - | null - | undefined - | Promise; + ) => GuestRequirements | null | Promise; policies: ( parent: Place, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => Policies | null | undefined | Promise; + ) => Policies | null | Promise; houseRules: ( parent: Place, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => HouseRules | null | undefined | Promise; + ) => HouseRules | null | Promise; bookings: ( parent: Place, @@ -1911,11 +1871,7 @@ export namespace PlaceResolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => - | Array - | null - | undefined - | Promise | null | undefined>; + ) => Array | null | Promise | null>; popularity: ( parent: Place, @@ -2694,21 +2650,21 @@ export namespace PricingResolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => number | null | undefined | Promise; + ) => number | null | Promise; currency: ( parent: Pricing, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => CURRENCY | null | undefined | Promise; + ) => CURRENCY | null | Promise; extraGuests: ( parent: Pricing, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => number | null | undefined | Promise; + ) => number | null | Promise; id: ( parent: Pricing, @@ -2722,7 +2678,7 @@ export namespace PricingResolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => number | null | undefined | Promise; + ) => number | null | Promise; perNight: ( parent: Pricing, @@ -2736,7 +2692,7 @@ export namespace PricingResolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => number | null | undefined | Promise; + ) => number | null | Promise; smartPricing: ( parent: Pricing, @@ -2750,14 +2706,14 @@ export namespace PricingResolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => number | null | undefined | Promise; + ) => number | null | Promise; weeklyDiscount: ( parent: Pricing, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => number | null | undefined | Promise; + ) => number | null | Promise; } } @@ -3058,7 +3014,7 @@ export namespace HouseRulesResolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => string | null | undefined | Promise; + ) => string | null | Promise; createdAt: ( parent: HouseRules, @@ -3079,35 +3035,35 @@ export namespace HouseRulesResolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => boolean | null | undefined | Promise; + ) => boolean | null | Promise; petsAllowed: ( parent: HouseRules, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => boolean | null | undefined | Promise; + ) => boolean | null | Promise; smokingAllowed: ( parent: HouseRules, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => boolean | null | undefined | Promise; + ) => boolean | null | Promise; suitableForChildren: ( parent: HouseRules, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => boolean | null | undefined | Promise; + ) => boolean | null | Promise; suitableForInfants: ( parent: HouseRules, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => boolean | null | undefined | Promise; + ) => boolean | null | Promise; updatedAt: ( parent: HouseRules, @@ -3283,11 +3239,7 @@ export namespace PaymentAccountResolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => - | PAYMENT_PROVIDER - | null - | undefined - | Promise; + ) => PAYMENT_PROVIDER | null | Promise; user: ( parent: PaymentAccount, @@ -3308,22 +3260,14 @@ export namespace PaymentAccountResolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => - | PaypalInformation - | null - | undefined - | Promise; + ) => PaypalInformation | null | Promise; creditcard: ( parent: PaymentAccount, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => - | CreditCardInformation - | null - | undefined - | Promise; + ) => CreditCardInformation | null | Promise; } } @@ -3549,11 +3493,7 @@ export namespace CreditCardInformationResolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => - | PaymentAccount - | null - | undefined - | Promise; + ) => PaymentAccount | null | Promise; postalCode: ( parent: CreditCardInformation, @@ -3658,11 +3598,7 @@ export namespace NotificationResolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => - | NOTIFICATION_TYPE - | null - | undefined - | Promise; + ) => NOTIFICATION_TYPE | null | Promise; user: ( parent: Notification, From 825054fc1d2009589b7ecdd7cd21eeeb83475393 Mon Sep 17 00:00:00 2001 From: Jason Kuhrt Date: Wed, 2 Jan 2019 23:13:19 -0500 Subject: [PATCH 5/8] void is not possible within array members --- packages/graphqlgen/src/generators/common.ts | 55 ++++++++++++------- .../__snapshots__/basic.test.ts.snap | 4 +- 2 files changed, 38 insertions(+), 21 deletions(-) diff --git a/packages/graphqlgen/src/generators/common.ts b/packages/graphqlgen/src/generators/common.ts index bf781ac4..a00fd0c7 100644 --- a/packages/graphqlgen/src/generators/common.ts +++ b/packages/graphqlgen/src/generators/common.ts @@ -188,33 +188,50 @@ export function shouldScaffoldFieldResolver( return !shouldRenderDefaultResolver(graphQLField, modelField, args) } -export function printFieldLikeType( +const voidable = (type: string): string => { + return `${type} | null | undefined` +} + +const nullable = (type: string): string => { + return `${type} | null` +} + +export const printFieldLikeType = ( field: GraphQLTypeField, modelMap: ModelMap, -) { +): string => { const name = field.type.isScalar ? getTypeFromGraphQLType(field.type.name) : field.type.isInput || field.type.isEnum ? field.type.name : getModelName(field.type, modelMap) - const isRequired = field.type.isArray - ? field.type.isArrayRequired - : field.type.isRequired - - const suffix = isRequired - ? '' - : field.defaultValue === null - ? ' | null' - : field.defaultValue === undefined - ? ' | null | undefined' - : '' - - const type = field.type.isArray - ? name + (field.type.isRequired ? '' : ' | null | undefined') - : name + suffix - - return field.type.isArray ? `Array<${type}>${suffix}` : type + if (field.type.isArray) { + // A void array member is not possible + const innerTypeRendering = field.type.isRequired ? name : nullable(name) + + const typeRendering = field.type.isArrayRequired + ? `Array<${innerTypeRendering}>` + : field.defaultValue === null + ? nullable(`Array<${innerTypeRendering}>`) + : field.defaultValue === undefined + ? voidable(`Array<${innerTypeRendering}>`) + : // field.defaultValue has has been set to non-null in the schema + `Array<${innerTypeRendering}>` + + return typeRendering + } else { + const typeRendering = field.type.isRequired + ? name + : field.defaultValue === null + ? nullable(name) + : field.defaultValue === undefined + ? voidable(name) + : // field.defaultValue has has been set to non-null in the schema + name + + return typeRendering + } } export function printFieldLikeFlowType( diff --git a/packages/graphqlgen/src/tests/typescript/__snapshots__/basic.test.ts.snap b/packages/graphqlgen/src/tests/typescript/__snapshots__/basic.test.ts.snap index a98aa78e..312f5d45 100644 --- a/packages/graphqlgen/src/tests/typescript/__snapshots__/basic.test.ts.snap +++ b/packages/graphqlgen/src/tests/typescript/__snapshots__/basic.test.ts.snap @@ -176,9 +176,9 @@ export namespace MutationResolvers { export interface AddMemberData { email: string; projects: Array; - sideProjects: Array | null | undefined; + sideProjects: Array | null | undefined; profile: ProfileData | null; - phones: Array; + phones: Array; isVIP: boolean; } export interface ProfileData { From ec94881318a5074c3f8c2f18b1819e0d5ef9e8c3 Mon Sep 17 00:00:00 2001 From: Jason Kuhrt Date: Wed, 2 Jan 2019 23:23:42 -0500 Subject: [PATCH 6/8] refactor --- packages/graphqlgen/src/generators/common.ts | 82 +++++-------------- .../src/generators/flow-generator.ts | 21 +++-- .../graphqlgen/src/generators/ts-generator.ts | 5 +- 3 files changed, 37 insertions(+), 71 deletions(-) diff --git a/packages/graphqlgen/src/generators/common.ts b/packages/graphqlgen/src/generators/common.ts index a00fd0c7..ee507fae 100644 --- a/packages/graphqlgen/src/generators/common.ts +++ b/packages/graphqlgen/src/generators/common.ts @@ -188,8 +188,9 @@ export function shouldScaffoldFieldResolver( return !shouldRenderDefaultResolver(graphQLField, modelField, args) } -const voidable = (type: string): string => { - return `${type} | null | undefined` +const voidable = (type: string, isFlowtype: boolean = false): string => { + const voidType = isFlowtype ? 'void' : 'undefined' + return `${type} | null | ${voidType}` } const nullable = (type: string): string => { @@ -199,6 +200,13 @@ const nullable = (type: string): string => { export const printFieldLikeType = ( field: GraphQLTypeField, modelMap: ModelMap, + options: { + isReturn?: boolean + isFlowtype?: boolean + } = { + isReturn: false, + isFlowtype: false, + }, ): string => { const name = field.type.isScalar ? getTypeFromGraphQLType(field.type.name) @@ -215,7 +223,11 @@ export const printFieldLikeType = ( : field.defaultValue === null ? nullable(`Array<${innerTypeRendering}>`) : field.defaultValue === undefined - ? voidable(`Array<${innerTypeRendering}>`) + ? // return type doesn't permit void return since that would allow + // resolvers to e.g. forget to return anything and that be considered OK. + options.isReturn + ? nullable(`Array<${innerTypeRendering}>`) + : voidable(`Array<${innerTypeRendering}>`, options.isFlowtype) : // field.defaultValue has has been set to non-null in the schema `Array<${innerTypeRendering}>` @@ -226,7 +238,11 @@ export const printFieldLikeType = ( : field.defaultValue === null ? nullable(name) : field.defaultValue === undefined - ? voidable(name) + ? // return type doesn't permit void return since that would allow + // resolvers to e.g. forget to return anything and that be considered OK. + options.isReturn + ? nullable(name) + : voidable(name, options.isFlowtype) : // field.defaultValue has has been set to non-null in the schema name @@ -234,64 +250,6 @@ export const printFieldLikeType = ( } } -export function printFieldLikeFlowType( - field: GraphQLTypeField, - modelMap: ModelMap, -) { - const name = field.type.isScalar - ? getTypeFromGraphQLType(field.type.name) - : field.type.isInput || field.type.isEnum - ? field.type.name - : getModelName(field.type, modelMap) - - const isRequired = field.type.isArray - ? field.type.isArrayRequired - : field.type.isRequired - - const suffix = isRequired - ? '' - : field.defaultValue === null - ? ' | null' - : field.defaultValue === undefined - ? ' | null | void' - : '' - - const type = field.type.isArray - ? name + (field.type.isRequired ? '' : ' | null | void') - : name + suffix - - return field.type.isArray ? `Array<${type}>${suffix}` : type -} - -export function printFieldLikeReturnType( - field: GraphQLTypeField, - modelMap: ModelMap, -) { - const name = field.type.isScalar - ? getTypeFromGraphQLType(field.type.name) - : field.type.isInput || field.type.isEnum - ? field.type.name - : getModelName(field.type, modelMap) - - const isRequired = field.type.isArray - ? field.type.isArrayRequired - : field.type.isRequired - - const suffix = isRequired - ? '' - : field.defaultValue === null - ? ' | null' - : field.defaultValue === undefined - ? ' | null' - : '' - - const type = field.type.isArray - ? name + (field.type.isRequired ? '' : ' | null') - : name + suffix - - return field.type.isArray ? `Array<${type}>${suffix}` : type -} - export function getTypeFromGraphQLType( type: string, ): SpecificGraphQLScalarType { diff --git a/packages/graphqlgen/src/generators/flow-generator.ts b/packages/graphqlgen/src/generators/flow-generator.ts index 1d05495d..bacdd4af 100644 --- a/packages/graphqlgen/src/generators/flow-generator.ts +++ b/packages/graphqlgen/src/generators/flow-generator.ts @@ -14,8 +14,7 @@ import { getModelName, groupModelsNameByImportPath, InputTypesMap, - printFieldLikeFlowType, - printFieldLikeReturnType, + printFieldLikeType, renderDefaultResolvers, renderEnums, TypeToInputTypeAssociation, @@ -172,7 +171,10 @@ function renderInputTypeInterfaces( inputTypesMap[typeAssociation].name, )} { ${inputTypesMap[typeAssociation].fields.map( - field => `${field.name}: ${printFieldLikeFlowType(field, modelMap)}`, + field => + `${field.name}: ${printFieldLikeType(field, modelMap, { + isFlowtype: true, + })}`, )} }` }) @@ -202,9 +204,10 @@ function renderInputArgInterface( ${field.arguments .map( arg => - `${arg.name}: ${getArgTypePrefix(type, arg)}${printFieldLikeFlowType( + `${arg.name}: ${getArgTypePrefix(type, arg)}${printFieldLikeType( arg as GraphQLTypeField, modelMap, + { isFlowtype: true }, )}`, ) .join(',' + os.EOL)} @@ -256,7 +259,10 @@ function renderResolverFunctionInterface( ) ` - const returnType = printFieldLikeReturnType(field, modelMap) + const returnType = printFieldLikeType(field, modelMap, { + isFlowtype: true, + isReturn: true, + }) if (type.name === 'Subscription') { return ` @@ -301,7 +307,10 @@ function renderResolverTypeInterfaceFunction( ctx: ${getContextName(context)}, info: GraphQLResolveInfo, )` - const returnType = printFieldLikeReturnType(field, modelMap) + const returnType = printFieldLikeType(field, modelMap, { + isFlowtype: true, + isReturn: true, + }) if (type.name === 'Subscription') { return ` diff --git a/packages/graphqlgen/src/generators/ts-generator.ts b/packages/graphqlgen/src/generators/ts-generator.ts index 3f7448ea..f61825d8 100644 --- a/packages/graphqlgen/src/generators/ts-generator.ts +++ b/packages/graphqlgen/src/generators/ts-generator.ts @@ -10,7 +10,6 @@ import { TypeToInputTypeAssociation, InputTypesMap, printFieldLikeType, - printFieldLikeReturnType, getDistinctInputTypes, renderEnums, groupModelsNameByImportPath, @@ -265,7 +264,7 @@ function renderResolverFunctionInterface( ) ` - const returnType = printFieldLikeReturnType(field, modelMap) + const returnType = printFieldLikeType(field, modelMap, { isReturn: true }) if (type.name === 'Subscription') { return ` @@ -313,7 +312,7 @@ function renderResolverTypeInterfaceFunction( info: GraphQLResolveInfo, ) ` - const returnType = printFieldLikeReturnType(field, modelMap) + const returnType = printFieldLikeType(field, modelMap, { isReturn: true }) if (type.name === 'Subscription') { return ` From b9d714d6f124b97ec8aa12bc2a9d420533b9e932 Mon Sep 17 00:00:00 2001 From: Jason Kuhrt Date: Wed, 2 Jan 2019 23:57:52 -0500 Subject: [PATCH 7/8] more idiomatic array rendering --- packages/graphqlgen/src/generators/common.ts | 36 ++++---- .../flow/__snapshots__/basic.test.ts.snap | 2 +- .../__snapshots__/large-schema.test.ts.snap | 90 +++++++++---------- .../__snapshots__/basic.test.ts.snap | 6 +- .../__snapshots__/large-schema.test.ts.snap | 90 +++++++++---------- 5 files changed, 115 insertions(+), 109 deletions(-) diff --git a/packages/graphqlgen/src/generators/common.ts b/packages/graphqlgen/src/generators/common.ts index ee507fae..6f5f6420 100644 --- a/packages/graphqlgen/src/generators/common.ts +++ b/packages/graphqlgen/src/generators/common.ts @@ -197,6 +197,10 @@ const nullable = (type: string): string => { return `${type} | null` } +const array = (innerType: string, config: { innerUnion?: boolean } = {}) => { + return config.innerUnion ? `${innerType}[]` : `Array<${innerType}>` +} + export const printFieldLikeType = ( field: GraphQLTypeField, modelMap: ModelMap, @@ -214,22 +218,27 @@ export const printFieldLikeType = ( ? field.type.name : getModelName(field.type, modelMap) + /** + * 1. Return type doesn't permit void return since that would allow + * resolvers to e.g. forget to return anything and that be considered OK. + */ if (field.type.isArray) { - // A void array member is not possible + const innerUnion = field.type.isRequired + // Not voidable here because a void array member is not possible const innerTypeRendering = field.type.isRequired ? name : nullable(name) const typeRendering = field.type.isArrayRequired - ? `Array<${innerTypeRendering}>` + ? array(innerTypeRendering, { innerUnion }) : field.defaultValue === null - ? nullable(`Array<${innerTypeRendering}>`) + ? nullable(array(innerTypeRendering, { innerUnion })) : field.defaultValue === undefined - ? // return type doesn't permit void return since that would allow - // resolvers to e.g. forget to return anything and that be considered OK. - options.isReturn - ? nullable(`Array<${innerTypeRendering}>`) - : voidable(`Array<${innerTypeRendering}>`, options.isFlowtype) - : // field.defaultValue has has been set to non-null in the schema - `Array<${innerTypeRendering}>` + ? options.isReturn // [1] + ? nullable(array(innerTypeRendering, { innerUnion })) + : voidable( + array(innerTypeRendering, { innerUnion }), + options.isFlowtype, + ) + : array(innerTypeRendering, { innerUnion }) // schema has non-null default set return typeRendering } else { @@ -238,13 +247,10 @@ export const printFieldLikeType = ( : field.defaultValue === null ? nullable(name) : field.defaultValue === undefined - ? // return type doesn't permit void return since that would allow - // resolvers to e.g. forget to return anything and that be considered OK. - options.isReturn + ? options.isReturn // [1] ? nullable(name) : voidable(name, options.isFlowtype) - : // field.defaultValue has has been set to non-null in the schema - name + : name // schema has non-null default set return typeRendering } diff --git a/packages/graphqlgen/src/tests/flow/__snapshots__/basic.test.ts.snap b/packages/graphqlgen/src/tests/flow/__snapshots__/basic.test.ts.snap index 8f2ffc59..c8554af3 100644 --- a/packages/graphqlgen/src/tests/flow/__snapshots__/basic.test.ts.snap +++ b/packages/graphqlgen/src/tests/flow/__snapshots__/basic.test.ts.snap @@ -172,7 +172,7 @@ export const Mutation_defaultResolvers = {}; export interface Mutation_AddMemberData { email: string; - projects: Array; + projects: string[]; } export interface Mutation_Args_AddMember { diff --git a/packages/graphqlgen/src/tests/flow/__snapshots__/large-schema.test.ts.snap b/packages/graphqlgen/src/tests/flow/__snapshots__/large-schema.test.ts.snap index 28b78d34..b3ec0170 100644 --- a/packages/graphqlgen/src/tests/flow/__snapshots__/large-schema.test.ts.snap +++ b/packages/graphqlgen/src/tests/flow/__snapshots__/large-schema.test.ts.snap @@ -64,7 +64,7 @@ export interface Query_Args_HomesInPriceRange { } export interface Query_Args_ExperiencesByCity { - cities: Array; + cities: string[]; } export type Query_TopExperiences_Resolver = ( @@ -72,42 +72,42 @@ export type Query_TopExperiences_Resolver = ( args: {}, ctx: Context, info: GraphQLResolveInfo -) => Array | Promise>; +) => Experience[] | Promise; export type Query_TopHomes_Resolver = ( parent: {}, args: {}, ctx: Context, info: GraphQLResolveInfo -) => Array | Promise>; +) => Home[] | Promise; export type Query_HomesInPriceRange_Resolver = ( parent: {}, args: Query_Args_HomesInPriceRange, ctx: Context, info: GraphQLResolveInfo -) => Array | Promise>; +) => Home[] | Promise; export type Query_TopReservations_Resolver = ( parent: {}, args: {}, ctx: Context, info: GraphQLResolveInfo -) => Array | Promise>; +) => Reservation[] | Promise; export type Query_FeaturedDestinations_Resolver = ( parent: {}, args: {}, ctx: Context, info: GraphQLResolveInfo -) => Array | Promise>; +) => Neighbourhood[] | Promise; export type Query_ExperiencesByCity_Resolver = ( parent: {}, args: Query_Args_ExperiencesByCity, ctx: Context, info: GraphQLResolveInfo -) => Array | Promise>; +) => ExperiencesByCity[] | Promise; export type Query_Viewer_Resolver = ( parent: {}, @@ -129,42 +129,42 @@ export interface Query_Resolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => Array | Promise>; + ) => Experience[] | Promise; topHomes: ( parent: {}, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => Array | Promise>; + ) => Home[] | Promise; homesInPriceRange: ( parent: {}, args: Query_Args_HomesInPriceRange, ctx: Context, info: GraphQLResolveInfo - ) => Array | Promise>; + ) => Home[] | Promise; topReservations: ( parent: {}, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => Array | Promise>; + ) => Reservation[] | Promise; featuredDestinations: ( parent: {}, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => Array | Promise>; + ) => Neighbourhood[] | Promise; experiencesByCity: ( parent: {}, args: Query_Args_ExperiencesByCity, ctx: Context, info: GraphQLResolveInfo - ) => Array | Promise>; + ) => ExperiencesByCity[] | Promise; viewer: ( parent: {}, @@ -234,7 +234,7 @@ export type Experience_Reviews_Resolver = ( args: {}, ctx: Context, info: GraphQLResolveInfo -) => Array | Promise>; +) => Review[] | Promise; export type Experience_Preview_Resolver = ( parent: Experience, @@ -291,7 +291,7 @@ export interface Experience_Resolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => Array | Promise>; + ) => Review[] | Promise; preview: ( parent: Experience, @@ -706,7 +706,7 @@ export type Home_Pictures_Resolver = ( args: Home_Args_Pictures, ctx: Context, info: GraphQLResolveInfo -) => Array | Promise>; +) => Picture[] | Promise; export type Home_PerNight_Resolver = ( parent: Home, @@ -756,7 +756,7 @@ export interface Home_Resolvers { args: Home_Args_Pictures, ctx: Context, info: GraphQLResolveInfo - ) => Array | Promise>; + ) => Picture[] | Promise; perNight: ( parent: Home, @@ -804,7 +804,7 @@ export type Reservation_Pictures_Resolver = ( args: {}, ctx: Context, info: GraphQLResolveInfo -) => Array | Promise>; +) => Picture[] | Promise; export type Reservation_Location_Resolver = ( parent: Reservation, @@ -861,7 +861,7 @@ export interface Reservation_Resolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => Array | Promise>; + ) => Picture[] | Promise; location: ( parent: Reservation, @@ -1051,7 +1051,7 @@ export type ExperiencesByCity_Experiences_Resolver = ( args: {}, ctx: Context, info: GraphQLResolveInfo -) => Array | Promise>; +) => Experience[] | Promise; export type ExperiencesByCity_City_Resolver = ( parent: ExperiencesByCity, @@ -1066,7 +1066,7 @@ export interface ExperiencesByCity_Resolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => Array | Promise>; + ) => Experience[] | Promise; city: ( parent: ExperiencesByCity, @@ -1094,7 +1094,7 @@ export type Viewer_Bookings_Resolver = ( args: {}, ctx: Context, info: GraphQLResolveInfo -) => Array | Promise>; +) => Booking[] | Promise; export interface Viewer_Resolvers { me: ( @@ -1109,7 +1109,7 @@ export interface Viewer_Resolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => Array | Promise>; + ) => Booking[] | Promise; } // Types for User @@ -1141,7 +1141,7 @@ export type User_Bookings_Resolver = ( args: {}, ctx: Context, info: GraphQLResolveInfo -) => Array | null | Promise | null>; +) => Booking[] | null | Promise; export type User_CreatedAt_Resolver = ( parent: User, @@ -1169,7 +1169,7 @@ export type User_HostingExperiences_Resolver = ( args: {}, ctx: Context, info: GraphQLResolveInfo -) => Array | null | Promise | null>; +) => Experience[] | null | Promise; export type User_Id_Resolver = ( parent: User, @@ -1204,21 +1204,21 @@ export type User_Notifications_Resolver = ( args: {}, ctx: Context, info: GraphQLResolveInfo -) => Array | null | Promise | null>; +) => Notification[] | null | Promise; export type User_OwnedPlaces_Resolver = ( parent: User, args: {}, ctx: Context, info: GraphQLResolveInfo -) => Array | null | Promise | null>; +) => Place[] | null | Promise; export type User_PaymentAccount_Resolver = ( parent: User, args: {}, ctx: Context, info: GraphQLResolveInfo -) => Array | null | Promise | null>; +) => PaymentAccount[] | null | Promise; export type User_Phone_Resolver = ( parent: User, @@ -1239,7 +1239,7 @@ export type User_ReceivedMessages_Resolver = ( args: {}, ctx: Context, info: GraphQLResolveInfo -) => Array | null | Promise | null>; +) => Message[] | null | Promise; export type User_ResponseRate_Resolver = ( parent: User, @@ -1260,7 +1260,7 @@ export type User_SentMessages_Resolver = ( args: {}, ctx: Context, info: GraphQLResolveInfo -) => Array | null | Promise | null>; +) => Message[] | null | Promise; export type User_UpdatedAt_Resolver = ( parent: User, @@ -1282,7 +1282,7 @@ export interface User_Resolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => Array | null | Promise | null>; + ) => Booking[] | null | Promise; createdAt: ( parent: User, @@ -1310,7 +1310,7 @@ export interface User_Resolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => Array | null | Promise | null>; + ) => Experience[] | null | Promise; id: ( parent: User, @@ -1345,21 +1345,21 @@ export interface User_Resolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => Array | null | Promise | null>; + ) => Notification[] | null | Promise; ownedPlaces: ( parent: User, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => Array | null | Promise | null>; + ) => Place[] | null | Promise; paymentAccount: ( parent: User, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => Array | null | Promise | null>; + ) => PaymentAccount[] | null | Promise; phone: ( parent: User, @@ -1380,7 +1380,7 @@ export interface User_Resolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => Array | null | Promise | null>; + ) => Message[] | null | Promise; responseRate: ( parent: User, @@ -1401,7 +1401,7 @@ export interface User_Resolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => Array | null | Promise | null>; + ) => Message[] | null | Promise; updatedAt: ( parent: User, @@ -1633,7 +1633,7 @@ export type Place_Reviews_Resolver = ( args: {}, ctx: Context, info: GraphQLResolveInfo -) => Array | Promise>; +) => Review[] | Promise; export type Place_Amenities_Resolver = ( parent: Place, @@ -1696,14 +1696,14 @@ export type Place_Bookings_Resolver = ( args: {}, ctx: Context, info: GraphQLResolveInfo -) => Array | Promise>; +) => Booking[] | Promise; export type Place_Pictures_Resolver = ( parent: Place, args: {}, ctx: Context, info: GraphQLResolveInfo -) => Array | null | Promise | null>; +) => Picture[] | null | Promise; export type Place_Popularity_Resolver = ( parent: Place, @@ -1788,7 +1788,7 @@ export interface Place_Resolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => Array | Promise>; + ) => Review[] | Promise; amenities: ( parent: Place, @@ -1851,14 +1851,14 @@ export interface Place_Resolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => Array | Promise>; + ) => Booking[] | Promise; pictures: ( parent: Place, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => Array | null | Promise | null>; + ) => Picture[] | null | Promise; popularity: ( parent: Place, @@ -3178,7 +3178,7 @@ export type PaymentAccount_Payments_Resolver = ( args: {}, ctx: Context, info: GraphQLResolveInfo -) => Array | Promise>; +) => Payment[] | Promise; export type PaymentAccount_Paypal_Resolver = ( parent: PaymentAccount, @@ -3228,7 +3228,7 @@ export interface PaymentAccount_Resolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => Array | Promise>; + ) => Payment[] | Promise; paypal: ( parent: PaymentAccount, diff --git a/packages/graphqlgen/src/tests/typescript/__snapshots__/basic.test.ts.snap b/packages/graphqlgen/src/tests/typescript/__snapshots__/basic.test.ts.snap index 312f5d45..01cd59ce 100644 --- a/packages/graphqlgen/src/tests/typescript/__snapshots__/basic.test.ts.snap +++ b/packages/graphqlgen/src/tests/typescript/__snapshots__/basic.test.ts.snap @@ -175,7 +175,7 @@ export namespace MutationResolvers { export interface AddMemberData { email: string; - projects: Array; + projects: string[]; sideProjects: Array | null | undefined; profile: ProfileData | null; phones: Array; @@ -201,7 +201,7 @@ export namespace MutationResolvers { } export interface ArgsAddMembers { - data: Array; + data: AddMemberData[]; } export type AddMemberResolver = ( @@ -348,7 +348,7 @@ export namespace MutationResolvers { export interface AddMemberData { email: string; - projects: Array; + projects: string[]; } export interface ArgsAddMember { diff --git a/packages/graphqlgen/src/tests/typescript/__snapshots__/large-schema.test.ts.snap b/packages/graphqlgen/src/tests/typescript/__snapshots__/large-schema.test.ts.snap index 129c286c..304d7ed3 100644 --- a/packages/graphqlgen/src/tests/typescript/__snapshots__/large-schema.test.ts.snap +++ b/packages/graphqlgen/src/tests/typescript/__snapshots__/large-schema.test.ts.snap @@ -63,7 +63,7 @@ export namespace QueryResolvers { } export interface ArgsExperiencesByCity { - cities: Array; + cities: string[]; } export type TopExperiencesResolver = ( @@ -71,42 +71,42 @@ export namespace QueryResolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => Array | Promise>; + ) => Experience[] | Promise; export type TopHomesResolver = ( parent: undefined, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => Array | Promise>; + ) => Home[] | Promise; export type HomesInPriceRangeResolver = ( parent: undefined, args: ArgsHomesInPriceRange, ctx: Context, info: GraphQLResolveInfo - ) => Array | Promise>; + ) => Home[] | Promise; export type TopReservationsResolver = ( parent: undefined, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => Array | Promise>; + ) => Reservation[] | Promise; export type FeaturedDestinationsResolver = ( parent: undefined, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => Array | Promise>; + ) => Neighbourhood[] | Promise; export type ExperiencesByCityResolver = ( parent: undefined, args: ArgsExperiencesByCity, ctx: Context, info: GraphQLResolveInfo - ) => Array | Promise>; + ) => ExperiencesByCity[] | Promise; export type ViewerResolver = ( parent: undefined, @@ -128,42 +128,42 @@ export namespace QueryResolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => Array | Promise>; + ) => Experience[] | Promise; topHomes: ( parent: undefined, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => Array | Promise>; + ) => Home[] | Promise; homesInPriceRange: ( parent: undefined, args: ArgsHomesInPriceRange, ctx: Context, info: GraphQLResolveInfo - ) => Array | Promise>; + ) => Home[] | Promise; topReservations: ( parent: undefined, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => Array | Promise>; + ) => Reservation[] | Promise; featuredDestinations: ( parent: undefined, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => Array | Promise>; + ) => Neighbourhood[] | Promise; experiencesByCity: ( parent: undefined, args: ArgsExperiencesByCity, ctx: Context, info: GraphQLResolveInfo - ) => Array | Promise>; + ) => ExperiencesByCity[] | Promise; viewer: ( parent: undefined, @@ -234,7 +234,7 @@ export namespace ExperienceResolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => Array | Promise>; + ) => Review[] | Promise; export type PreviewResolver = ( parent: Experience, @@ -291,7 +291,7 @@ export namespace ExperienceResolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => Array | Promise>; + ) => Review[] | Promise; preview: ( parent: Experience, @@ -711,7 +711,7 @@ export namespace HomeResolvers { args: ArgsPictures, ctx: Context, info: GraphQLResolveInfo - ) => Array | Promise>; + ) => Picture[] | Promise; export type PerNightResolver = ( parent: Home, @@ -761,7 +761,7 @@ export namespace HomeResolvers { args: ArgsPictures, ctx: Context, info: GraphQLResolveInfo - ) => Array | Promise>; + ) => Picture[] | Promise; perNight: ( parent: Home, @@ -810,7 +810,7 @@ export namespace ReservationResolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => Array | Promise>; + ) => Picture[] | Promise; export type LocationResolver = ( parent: Reservation, @@ -867,7 +867,7 @@ export namespace ReservationResolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => Array | Promise>; + ) => Picture[] | Promise; location: ( parent: Reservation, @@ -1060,7 +1060,7 @@ export namespace ExperiencesByCityResolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => Array | Promise>; + ) => Experience[] | Promise; export type CityResolver = ( parent: ExperiencesByCity, @@ -1075,7 +1075,7 @@ export namespace ExperiencesByCityResolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => Array | Promise>; + ) => Experience[] | Promise; city: ( parent: ExperiencesByCity, @@ -1104,7 +1104,7 @@ export namespace ViewerResolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => Array | Promise>; + ) => Booking[] | Promise; export interface Type { me: ( @@ -1119,7 +1119,7 @@ export namespace ViewerResolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => Array | Promise>; + ) => Booking[] | Promise; } } @@ -1152,7 +1152,7 @@ export namespace UserResolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => Array | null | Promise | null>; + ) => Booking[] | null | Promise; export type CreatedAtResolver = ( parent: User, @@ -1180,7 +1180,7 @@ export namespace UserResolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => Array | null | Promise | null>; + ) => Experience[] | null | Promise; export type IdResolver = ( parent: User, @@ -1215,21 +1215,21 @@ export namespace UserResolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => Array | null | Promise | null>; + ) => Notification[] | null | Promise; export type OwnedPlacesResolver = ( parent: User, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => Array | null | Promise | null>; + ) => Place[] | null | Promise; export type PaymentAccountResolver = ( parent: User, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => Array | null | Promise | null>; + ) => PaymentAccount[] | null | Promise; export type PhoneResolver = ( parent: User, @@ -1250,7 +1250,7 @@ export namespace UserResolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => Array | null | Promise | null>; + ) => Message[] | null | Promise; export type ResponseRateResolver = ( parent: User, @@ -1271,7 +1271,7 @@ export namespace UserResolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => Array | null | Promise | null>; + ) => Message[] | null | Promise; export type UpdatedAtResolver = ( parent: User, @@ -1293,7 +1293,7 @@ export namespace UserResolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => Array | null | Promise | null>; + ) => Booking[] | null | Promise; createdAt: ( parent: User, @@ -1321,7 +1321,7 @@ export namespace UserResolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => Array | null | Promise | null>; + ) => Experience[] | null | Promise; id: ( parent: User, @@ -1356,21 +1356,21 @@ export namespace UserResolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => Array | null | Promise | null>; + ) => Notification[] | null | Promise; ownedPlaces: ( parent: User, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => Array | null | Promise | null>; + ) => Place[] | null | Promise; paymentAccount: ( parent: User, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => Array | null | Promise | null>; + ) => PaymentAccount[] | null | Promise; phone: ( parent: User, @@ -1391,7 +1391,7 @@ export namespace UserResolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => Array | null | Promise | null>; + ) => Message[] | null | Promise; responseRate: ( parent: User, @@ -1412,7 +1412,7 @@ export namespace UserResolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => Array | null | Promise | null>; + ) => Message[] | null | Promise; updatedAt: ( parent: User, @@ -1646,7 +1646,7 @@ export namespace PlaceResolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => Array | Promise>; + ) => Review[] | Promise; export type AmenitiesResolver = ( parent: Place, @@ -1709,14 +1709,14 @@ export namespace PlaceResolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => Array | Promise>; + ) => Booking[] | Promise; export type PicturesResolver = ( parent: Place, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => Array | null | Promise | null>; + ) => Picture[] | null | Promise; export type PopularityResolver = ( parent: Place, @@ -1801,7 +1801,7 @@ export namespace PlaceResolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => Array | Promise>; + ) => Review[] | Promise; amenities: ( parent: Place, @@ -1864,14 +1864,14 @@ export namespace PlaceResolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => Array | Promise>; + ) => Booking[] | Promise; pictures: ( parent: Place, args: {}, ctx: Context, info: GraphQLResolveInfo - ) => Array | null | Promise | null>; + ) => Picture[] | null | Promise; popularity: ( parent: Place, @@ -3203,7 +3203,7 @@ export namespace PaymentAccountResolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => Array | Promise>; + ) => Payment[] | Promise; export type PaypalResolver = ( parent: PaymentAccount, @@ -3253,7 +3253,7 @@ export namespace PaymentAccountResolvers { args: {}, ctx: Context, info: GraphQLResolveInfo - ) => Array | Promise>; + ) => Payment[] | Promise; paypal: ( parent: PaymentAccount, From 7093f56d4bccfd2bd92228b1b79163be3cf3a353 Mon Sep 17 00:00:00 2001 From: Jason Kuhrt Date: Fri, 4 Jan 2019 22:33:10 -0500 Subject: [PATCH 8/8] mark fields as possibly not there instead of union void --- packages/graphqlgen/src/generators/common.ts | 92 +++++++++++-------- .../src/generators/flow-generator.ts | 21 ++--- .../graphqlgen/src/generators/ts-generator.ts | 12 +-- .../__snapshots__/large-schema.test.ts.snap | 2 +- .../__snapshots__/basic.test.ts.snap | 8 +- .../__snapshots__/large-schema.test.ts.snap | 2 +- 6 files changed, 70 insertions(+), 67 deletions(-) diff --git a/packages/graphqlgen/src/generators/common.ts b/packages/graphqlgen/src/generators/common.ts index 6f5f6420..6b9cea88 100644 --- a/packages/graphqlgen/src/generators/common.ts +++ b/packages/graphqlgen/src/generators/common.ts @@ -188,28 +188,31 @@ export function shouldScaffoldFieldResolver( return !shouldRenderDefaultResolver(graphQLField, modelField, args) } -const voidable = (type: string, isFlowtype: boolean = false): string => { - const voidType = isFlowtype ? 'void' : 'undefined' - return `${type} | null | ${voidType}` -} - const nullable = (type: string): string => { return `${type} | null` } +const kv = ( + key: string, + value: string, + isOptional: boolean = false, +): string => { + return `${key}${isOptional ? '?' : ''}: ${value}` +} + const array = (innerType: string, config: { innerUnion?: boolean } = {}) => { return config.innerUnion ? `${innerType}[]` : `Array<${innerType}>` } +type FieldPrintOptions = { + isReturn?: boolean +} + export const printFieldLikeType = ( field: GraphQLTypeField, modelMap: ModelMap, - options: { - isReturn?: boolean - isFlowtype?: boolean - } = { + options: FieldPrintOptions = { isReturn: false, - isFlowtype: false, }, ): string => { const name = field.type.isScalar @@ -219,40 +222,53 @@ export const printFieldLikeType = ( : getModelName(field.type, modelMap) /** + * Considerable difference between types in array versus not, such as what + * default value means, isRequired, ..., lead to forking the rendering paths. + * + * Regarding voidable, note how it can only show up in the k:v rendering e.g.: + * + * foo?: null | string + * + * but not for return style e.g.: + * + * undefined | null | string + * + * given footnote 1 below. + * * 1. Return type doesn't permit void return since that would allow * resolvers to e.g. forget to return anything and that be considered OK. */ + if (field.type.isArray) { const innerUnion = field.type.isRequired - // Not voidable here because a void array member is not possible - const innerTypeRendering = field.type.isRequired ? name : nullable(name) - - const typeRendering = field.type.isArrayRequired - ? array(innerTypeRendering, { innerUnion }) - : field.defaultValue === null - ? nullable(array(innerTypeRendering, { innerUnion })) - : field.defaultValue === undefined - ? options.isReturn // [1] - ? nullable(array(innerTypeRendering, { innerUnion })) - : voidable( - array(innerTypeRendering, { innerUnion }), - options.isFlowtype, - ) - : array(innerTypeRendering, { innerUnion }) // schema has non-null default set - - return typeRendering + + // - Not voidable here because a void array member is not possible + // - For arrays default value does not apply to inner value + const valueInnerType = field.type.isRequired ? name : nullable(name) + + const isArrayNullable = + !field.type.isArrayRequired && + (field.defaultValue === undefined || field.defaultValue === null) + + const isArrayVoidable = isArrayNullable && field.defaultValue === undefined + + const valueType = isArrayNullable + ? nullable(array(valueInnerType, { innerUnion })) // [1] + : array(valueInnerType, { innerUnion }) + + return options.isReturn + ? valueType + : kv(field.name, valueType, isArrayVoidable) } else { - const typeRendering = field.type.isRequired - ? name - : field.defaultValue === null - ? nullable(name) - : field.defaultValue === undefined - ? options.isReturn // [1] - ? nullable(name) - : voidable(name, options.isFlowtype) - : name // schema has non-null default set - - return typeRendering + const isNullable = + !field.type.isRequired && + (field.defaultValue === undefined || field.defaultValue === null) + + const isVoidable = isNullable && field.defaultValue === undefined + + const valueType = isNullable ? nullable(name) : name // [1] + + return options.isReturn ? valueType : kv(field.name, valueType, isVoidable) } } diff --git a/packages/graphqlgen/src/generators/flow-generator.ts b/packages/graphqlgen/src/generators/flow-generator.ts index bacdd4af..fed9c3bf 100644 --- a/packages/graphqlgen/src/generators/flow-generator.ts +++ b/packages/graphqlgen/src/generators/flow-generator.ts @@ -170,11 +170,8 @@ function renderInputTypeInterfaces( return `export interface ${upperFirst(type.name)}_${upperFirst( inputTypesMap[typeAssociation].name, )} { - ${inputTypesMap[typeAssociation].fields.map( - field => - `${field.name}: ${printFieldLikeType(field, modelMap, { - isFlowtype: true, - })}`, + ${inputTypesMap[typeAssociation].fields.map(field => + printFieldLikeType(field, modelMap), )} }` }) @@ -202,13 +199,11 @@ function renderInputArgInterface( return ` export interface ${getInputArgName(type, field)} { ${field.arguments - .map( - arg => - `${arg.name}: ${getArgTypePrefix(type, arg)}${printFieldLikeType( - arg as GraphQLTypeField, - modelMap, - { isFlowtype: true }, - )}`, + .map(arg => + printFieldLikeType(arg as GraphQLTypeField, modelMap).replace( + ': ', + `: ${getArgTypePrefix(type, arg)}`, + ), ) .join(',' + os.EOL)} } @@ -260,7 +255,6 @@ function renderResolverFunctionInterface( ` const returnType = printFieldLikeType(field, modelMap, { - isFlowtype: true, isReturn: true, }) @@ -308,7 +302,6 @@ function renderResolverTypeInterfaceFunction( info: GraphQLResolveInfo, )` const returnType = printFieldLikeType(field, modelMap, { - isFlowtype: true, isReturn: true, }) diff --git a/packages/graphqlgen/src/generators/ts-generator.ts b/packages/graphqlgen/src/generators/ts-generator.ts index f61825d8..ff234d94 100644 --- a/packages/graphqlgen/src/generators/ts-generator.ts +++ b/packages/graphqlgen/src/generators/ts-generator.ts @@ -194,8 +194,8 @@ function renderInputTypeInterfaces( return getDistinctInputTypes(type, typeToInputTypeAssociation, inputTypesMap) .map(typeAssociation => { return `export interface ${inputTypesMap[typeAssociation].name} { - ${inputTypesMap[typeAssociation].fields.map( - field => `${field.name}: ${printFieldLikeType(field, modelMap)}`, + ${inputTypesMap[typeAssociation].fields.map(field => + printFieldLikeType(field, modelMap), )} }` }) @@ -222,13 +222,7 @@ function renderInputArgInterface( return ` export interface Args${upperFirst(field.name)} { ${field.arguments - .map( - arg => - `${arg.name}: ${printFieldLikeType( - arg as GraphQLTypeField, - modelMap, - )}`, - ) + .map(arg => printFieldLikeType(arg as GraphQLTypeField, modelMap)) .join(os.EOL)} } ` diff --git a/packages/graphqlgen/src/tests/flow/__snapshots__/large-schema.test.ts.snap b/packages/graphqlgen/src/tests/flow/__snapshots__/large-schema.test.ts.snap index b3ec0170..1f359f8e 100644 --- a/packages/graphqlgen/src/tests/flow/__snapshots__/large-schema.test.ts.snap +++ b/packages/graphqlgen/src/tests/flow/__snapshots__/large-schema.test.ts.snap @@ -663,7 +663,7 @@ export const Home_defaultResolvers = { }; export interface Home_Args_Pictures { - first: number | null | void; + first?: number | null; } export type Home_Id_Resolver = ( diff --git a/packages/graphqlgen/src/tests/typescript/__snapshots__/basic.test.ts.snap b/packages/graphqlgen/src/tests/typescript/__snapshots__/basic.test.ts.snap index 01cd59ce..ed59ad95 100644 --- a/packages/graphqlgen/src/tests/typescript/__snapshots__/basic.test.ts.snap +++ b/packages/graphqlgen/src/tests/typescript/__snapshots__/basic.test.ts.snap @@ -176,15 +176,15 @@ export namespace MutationResolvers { export interface AddMemberData { email: string; projects: string[]; - sideProjects: Array | null | undefined; + sideProjects?: Array | null; profile: ProfileData | null; phones: Array; isVIP: boolean; } export interface ProfileData { - firstName: string | null | undefined; - lastName: string | null | undefined; - photo: Photo | null | undefined; + firstName?: string | null; + lastName?: string | null; + photo?: Photo | null; } export interface PhoneData { number: string; diff --git a/packages/graphqlgen/src/tests/typescript/__snapshots__/large-schema.test.ts.snap b/packages/graphqlgen/src/tests/typescript/__snapshots__/large-schema.test.ts.snap index 304d7ed3..2fa30eeb 100644 --- a/packages/graphqlgen/src/tests/typescript/__snapshots__/large-schema.test.ts.snap +++ b/packages/graphqlgen/src/tests/typescript/__snapshots__/large-schema.test.ts.snap @@ -668,7 +668,7 @@ export namespace HomeResolvers { }; export interface ArgsPictures { - first: number | null | undefined; + first?: number | null; } export type IdResolver = (