Skip to content

Commit

Permalink
Merge pull request #465 from kamilkisiela/fix/parent-generic-resolver
Browse files Browse the repository at this point in the history
Parent of resolver should always be any; Use Resolver or SubscriptionResolver directly on field
  • Loading branch information
kamilkisiela committed Aug 7, 2018
2 parents 14f3a4c + 1f1963a commit caf3e98
Show file tree
Hide file tree
Showing 28 changed files with 1,158 additions and 1,203 deletions.
158 changes: 73 additions & 85 deletions dev-test/githunt/types.avoidOptionals.ts

Large diffs are not rendered by default.

158 changes: 73 additions & 85 deletions dev-test/githunt/types.d.ts

Large diffs are not rendered by default.

158 changes: 73 additions & 85 deletions dev-test/githunt/types.immutableTypes.ts

Large diffs are not rendered by default.

158 changes: 75 additions & 83 deletions dev-test/githunt/types.noNamespaces.ts

Large diffs are not rendered by default.

158 changes: 73 additions & 85 deletions dev-test/githunt/types.reactApollo.ts

Large diffs are not rendered by default.

158 changes: 73 additions & 85 deletions dev-test/githunt/types.ts

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
Expand Up @@ -35,11 +35,11 @@ export namespace HeroParentTypeDependentField {
};

export type _Friends = {
__typename?: __HumanInlineFragment['__typename'];
__typename?: _HumanInlineFragment['__typename'];
name: string;
} & (__HumanInlineFragment);
} & (_HumanInlineFragment);

export type __HumanInlineFragment = {
export type _HumanInlineFragment = {
__typename?: 'Human';
height?: number | null;
};
Expand Down
197 changes: 87 additions & 110 deletions dev-test/star-wars/types.avoidOptionals.ts

Large diffs are not rendered by default.

197 changes: 87 additions & 110 deletions dev-test/star-wars/types.d.ts

Large diffs are not rendered by default.

213 changes: 91 additions & 122 deletions dev-test/star-wars/types.immutableTypes.ts

Large diffs are not rendered by default.

222 changes: 95 additions & 127 deletions dev-test/star-wars/types.noNamespaces.ts

Large diffs are not rendered by default.

6 changes: 3 additions & 3 deletions dev-test/star-wars/types.skipSchema.ts
Original file line number Diff line number Diff line change
Expand Up @@ -204,11 +204,11 @@ export namespace HeroParentTypeDependentField {
};

export type _Friends = {
__typename?: __HumanInlineFragment['__typename'];
__typename?: _HumanInlineFragment['__typename'];
name: string;
} & (__HumanInlineFragment);
} & (_HumanInlineFragment);

export type __HumanInlineFragment = {
export type _HumanInlineFragment = {
__typename?: 'Human';
height?: number | null;
};
Expand Down
197 changes: 87 additions & 110 deletions dev-test/star-wars/types.ts

Large diffs are not rendered by default.

30 changes: 13 additions & 17 deletions dev-test/test-schema/typings.avoidOptionals.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
/* tslint:disable */
import { GraphQLResolveInfo } from 'graphql';

export type QueryResolver<Result, Parent = any, Context = any, Args = any> = (
export type Resolver<Result, Parent = any, Context = any, Args = any> = (
parent?: Parent,
args?: Args,
context?: Context,
Expand All @@ -23,10 +23,6 @@ export type SubscriptionResolver<Result, Parent = any, Context = any, Args = any
): R | Result | Promise<R | Result>;
};

export type Resolver<Result, Parent = any, Context = any, Args = any> =
| QueryResolver<Result, Parent, Context, Args>
| SubscriptionResolver<Result, Parent, Context, Args>;

export interface Query {
allUsers: (User | null)[];
userById: User | null;
Expand All @@ -42,13 +38,13 @@ export interface UserByIdQueryArgs {
}

export namespace QueryResolvers {
export interface Resolvers<Context = any, Parent = Query> {
allUsers?: AllUsersResolver<(User | null)[], Parent, Context>;
userById?: UserByIdResolver<User | null, Parent, Context>;
export interface Resolvers<Context = any> {
allUsers?: AllUsersResolver<(User | null)[], any, Context>;
userById?: UserByIdResolver<User | null, any, Context>;
}

export type AllUsersResolver<R = (User | null)[], Parent = Query, Context = any> = Resolver<R, Parent, Context>;
export type UserByIdResolver<R = User | null, Parent = Query, Context = any> = Resolver<
export type AllUsersResolver<R = (User | null)[], Parent = any, Context = any> = Resolver<R, Parent, Context>;
export type UserByIdResolver<R = User | null, Parent = any, Context = any> = Resolver<
R,
Parent,
Context,
Expand All @@ -60,13 +56,13 @@ export namespace QueryResolvers {
}

export namespace UserResolvers {
export interface Resolvers<Context = any, Parent = User> {
id?: IdResolver<number, Parent, Context>;
name?: NameResolver<string, Parent, Context>;
email?: EmailResolver<string, Parent, Context>;
export interface Resolvers<Context = any> {
id?: IdResolver<number, any, Context>;
name?: NameResolver<string, any, Context>;
email?: EmailResolver<string, any, Context>;
}

export type IdResolver<R = number, Parent = User, Context = any> = Resolver<R, Parent, Context>;
export type NameResolver<R = string, Parent = User, Context = any> = Resolver<R, Parent, Context>;
export type EmailResolver<R = string, Parent = User, Context = any> = Resolver<R, Parent, Context>;
export type IdResolver<R = number, Parent = any, Context = any> = Resolver<R, Parent, Context>;
export type NameResolver<R = string, Parent = any, Context = any> = Resolver<R, Parent, Context>;
export type EmailResolver<R = string, Parent = any, Context = any> = Resolver<R, Parent, Context>;
}
30 changes: 13 additions & 17 deletions dev-test/test-schema/typings.immutableTypes.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
/* tslint:disable */
import { GraphQLResolveInfo } from 'graphql';

export type QueryResolver<Result, Parent = any, Context = any, Args = any> = (
export type Resolver<Result, Parent = any, Context = any, Args = any> = (
parent?: Parent,
args?: Args,
context?: Context,
Expand All @@ -23,10 +23,6 @@ export type SubscriptionResolver<Result, Parent = any, Context = any, Args = any
): R | Result | Promise<R | Result>;
};

export type Resolver<Result, Parent = any, Context = any, Args = any> =
| QueryResolver<Result, Parent, Context, Args>
| SubscriptionResolver<Result, Parent, Context, Args>;

export interface Query {
readonly allUsers: ReadonlyArray<User | null>;
readonly userById?: User | null;
Expand All @@ -42,17 +38,17 @@ export interface UserByIdQueryArgs {
}

export namespace QueryResolvers {
export interface Resolvers<Context = any, Parent = Query> {
allUsers?: AllUsersResolver<ReadonlyArray<User | null>, Parent, Context>;
userById?: UserByIdResolver<User | null, Parent, Context>;
export interface Resolvers<Context = any> {
allUsers?: AllUsersResolver<ReadonlyArray<User | null>, any, Context>;
userById?: UserByIdResolver<User | null, any, Context>;
}

export type AllUsersResolver<R = ReadonlyArray<User | null>, Parent = Query, Context = any> = Resolver<
export type AllUsersResolver<R = ReadonlyArray<User | null>, Parent = any, Context = any> = Resolver<
R,
Parent,
Context
>;
export type UserByIdResolver<R = User | null, Parent = Query, Context = any> = Resolver<
export type UserByIdResolver<R = User | null, Parent = any, Context = any> = Resolver<
R,
Parent,
Context,
Expand All @@ -64,13 +60,13 @@ export namespace QueryResolvers {
}

export namespace UserResolvers {
export interface Resolvers<Context = any, Parent = User> {
id?: IdResolver<number, Parent, Context>;
name?: NameResolver<string, Parent, Context>;
email?: EmailResolver<string, Parent, Context>;
export interface Resolvers<Context = any> {
id?: IdResolver<number, any, Context>;
name?: NameResolver<string, any, Context>;
email?: EmailResolver<string, any, Context>;
}

export type IdResolver<R = number, Parent = User, Context = any> = Resolver<R, Parent, Context>;
export type NameResolver<R = string, Parent = User, Context = any> = Resolver<R, Parent, Context>;
export type EmailResolver<R = string, Parent = User, Context = any> = Resolver<R, Parent, Context>;
export type IdResolver<R = number, Parent = any, Context = any> = Resolver<R, Parent, Context>;
export type NameResolver<R = string, Parent = any, Context = any> = Resolver<R, Parent, Context>;
export type EmailResolver<R = string, Parent = any, Context = any> = Resolver<R, Parent, Context>;
}
30 changes: 13 additions & 17 deletions dev-test/test-schema/typings.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
/* tslint:disable */
import { GraphQLResolveInfo } from 'graphql';

export type QueryResolver<Result, Parent = any, Context = any, Args = any> = (
export type Resolver<Result, Parent = any, Context = any, Args = any> = (
parent?: Parent,
args?: Args,
context?: Context,
Expand All @@ -23,10 +23,6 @@ export type SubscriptionResolver<Result, Parent = any, Context = any, Args = any
): R | Result | Promise<R | Result>;
};

export type Resolver<Result, Parent = any, Context = any, Args = any> =
| QueryResolver<Result, Parent, Context, Args>
| SubscriptionResolver<Result, Parent, Context, Args>;

export interface Query {
allUsers: (User | null)[];
userById?: User | null;
Expand All @@ -42,13 +38,13 @@ export interface UserByIdQueryArgs {
}

export namespace QueryResolvers {
export interface Resolvers<Context = any, Parent = Query> {
allUsers?: AllUsersResolver<(User | null)[], Parent, Context>;
userById?: UserByIdResolver<User | null, Parent, Context>;
export interface Resolvers<Context = any> {
allUsers?: AllUsersResolver<(User | null)[], any, Context>;
userById?: UserByIdResolver<User | null, any, Context>;
}

export type AllUsersResolver<R = (User | null)[], Parent = Query, Context = any> = Resolver<R, Parent, Context>;
export type UserByIdResolver<R = User | null, Parent = Query, Context = any> = Resolver<
export type AllUsersResolver<R = (User | null)[], Parent = any, Context = any> = Resolver<R, Parent, Context>;
export type UserByIdResolver<R = User | null, Parent = any, Context = any> = Resolver<
R,
Parent,
Context,
Expand All @@ -60,13 +56,13 @@ export namespace QueryResolvers {
}

export namespace UserResolvers {
export interface Resolvers<Context = any, Parent = User> {
id?: IdResolver<number, Parent, Context>;
name?: NameResolver<string, Parent, Context>;
email?: EmailResolver<string, Parent, Context>;
export interface Resolvers<Context = any> {
id?: IdResolver<number, any, Context>;
name?: NameResolver<string, any, Context>;
email?: EmailResolver<string, any, Context>;
}

export type IdResolver<R = number, Parent = User, Context = any> = Resolver<R, Parent, Context>;
export type NameResolver<R = string, Parent = User, Context = any> = Resolver<R, Parent, Context>;
export type EmailResolver<R = string, Parent = User, Context = any> = Resolver<R, Parent, Context>;
export type IdResolver<R = number, Parent = any, Context = any> = Resolver<R, Parent, Context>;
export type NameResolver<R = string, Parent = any, Context = any> = Resolver<R, Parent, Context>;
export type EmailResolver<R = string, Parent = any, Context = any> = Resolver<R, Parent, Context>;
}
32 changes: 18 additions & 14 deletions packages/graphql-codegen-compiler/src/flatten-types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -73,20 +73,24 @@ export function flattenSelectionSet(selectionSet: SelectionSetItem[], result: Fl

export function flattenTypes(document: Document): FlattenDocument {
return {
operations: document.operations.map<FlattenOperation>((operation: Operation): FlattenOperation => {
return {
isFlatten: true,
...operation,
innerModels: flattenSelectionSet(operation.selectionSet)
} as FlattenOperation;
}),
fragments: document.fragments.map<FlattenFragment>((fragment: Fragment): FlattenFragment => {
return {
isFlatten: true,
...fragment,
innerModels: flattenSelectionSet(fragment.selectionSet)
} as FlattenFragment;
}),
operations: document.operations.map<FlattenOperation>(
(operation: Operation): FlattenOperation => {
return {
isFlatten: true,
...operation,
innerModels: flattenSelectionSet(operation.selectionSet)
} as FlattenOperation;
}
),
fragments: document.fragments.map<FlattenFragment>(
(fragment: Fragment): FlattenFragment => {
return {
isFlatten: true,
...fragment,
innerModels: flattenSelectionSet(fragment.selectionSet)
} as FlattenFragment;
}
),
hasOperations: document.hasOperations,
hasFragments: document.hasFragments
};
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,7 @@ import {
GraphQLNamedType,
GraphQLObjectType,
GraphQLScalarType,
GraphQLType,
GraphQLUnionType,
isLeafType
GraphQLUnionType
} from 'graphql';

export interface NamedTypeIndicators {
Expand Down
39 changes: 36 additions & 3 deletions packages/graphql-codegen-core/src/schema/transform-fields.ts
Original file line number Diff line number Diff line change
@@ -1,13 +1,29 @@
import { getNamedType, GraphQLField, GraphQLFieldMap, GraphQLSchema, isLeafType } from 'graphql';
import {
getNamedType,
GraphQLField,
GraphQLFieldMap,
GraphQLSchema,
GraphQLInterfaceType,
GraphQLObjectType,
GraphQLInputObjectType,
GraphQLNamedType,
GraphQLScalarType,
GraphQLUnionType,
GraphQLEnumType
} from 'graphql';
import { objectMapToArray } from '../utils/object-map-to-array';
import { Field } from '../types';
import { Field, FieldType } from '../types';
import { resolveType } from './resolve-type';
import { resolveArguments } from './resolve-arguments';
import { resolveTypeIndicators } from './resolve-type-indicators';
import { debugLog } from '../debugging';
import { getDirectives } from '../utils/get-directives';

export function resolveFields(schema: GraphQLSchema, rawFields: GraphQLFieldMap<any, any>): Field[] {
export function resolveFields(
schema: GraphQLSchema,
rawFields: GraphQLFieldMap<any, any>,
parent: GraphQLObjectType | GraphQLInterfaceType | GraphQLInputObjectType
): Field[] {
const fieldsArray = objectMapToArray<GraphQLField<any, any>>(rawFields);

return fieldsArray.map<Field>(
Expand All @@ -25,6 +41,7 @@ export function resolveFields(schema: GraphQLSchema, rawFields: GraphQLFieldMap<
description: item.value.description || '',
arguments: resolvedArguments,
type: type.name,
fieldType: toFieldType(schema, namedType),
raw: type.raw,
isNullableArray: type.isNullableArray,
isArray: type.isArray,
Expand All @@ -43,3 +60,19 @@ export function resolveFields(schema: GraphQLSchema, rawFields: GraphQLFieldMap<
}
);
}

function toFieldType(schema: GraphQLSchema, type: GraphQLNamedType): FieldType {
const typeMap = {
Type: () => type instanceof GraphQLObjectType,
Scalar: () => type instanceof GraphQLScalarType,
Interface: () => type instanceof GraphQLInterfaceType,
Union: () => type instanceof GraphQLUnionType,
InputType: () => type instanceof GraphQLInputObjectType,
Enum: () => type instanceof GraphQLEnumType,
Query: () => schema.getQueryType() && schema.getQueryType().name === type.name,
Mutation: () => schema.getMutationType() && schema.getMutationType().name === type.name,
Subscription: () => schema.getSubscriptionType() && schema.getSubscriptionType().name === type.name
};

return Object.keys(typeMap).find(fieldType => typeMap[fieldType]()) as FieldType;
}
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ import { getImplementingTypes } from './implementing-types';
export function transformInterface(schema: GraphQLSchema, gqlInterface: GraphQLInterfaceType): Interface {
debugLog(`[transformInterface] transformed interface ${gqlInterface.name}`);

const resolvedFields = resolveFields(schema, gqlInterface.getFields());
const resolvedFields = resolveFields(schema, gqlInterface.getFields(), gqlInterface);
const directives = getDirectives(schema, gqlInterface);
const implementingTypes = getImplementingTypes(gqlInterface.name, schema);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ export function transformGraphQLObject(
object: GraphQLObjectType | GraphQLInputObjectType
): Type {
debugLog(`[transformGraphQLObject] transforming type ${object.name}`);
const resolvedFields = resolveFields(schema, (object as any).getFields());
const resolvedFields = resolveFields(schema, (object as any).getFields(), object);
const resolvedInterfaces = object instanceof GraphQLObjectType ? object.getInterfaces().map(inf => inf.name) : [];
const directives = getDirectives(schema, object);

Expand Down
12 changes: 12 additions & 0 deletions packages/graphql-codegen-core/src/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,17 @@ export interface AstNode {
usesDirectives: boolean;
}

export type FieldType =
| 'Interface'
| 'InputType'
| 'Type'
| 'Query'
| 'Mutation'
| 'Subscription'
| 'Enum'
| 'Scalar'
| 'Union';

export interface Argument extends AstNode {
raw: string;
name: string;
Expand All @@ -27,6 +38,7 @@ export interface Field extends AstNode {
description: string;
arguments: Argument[];
type: string;
fieldType: FieldType;
raw: string;
isArray: boolean;
dimensionOfArray: number;
Expand Down
12 changes: 10 additions & 2 deletions packages/templates/typescript/src/helpers/get-field-resolver.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,10 +9,18 @@ export function getFieldResolver(type, options) {

let result;

let resolver: string;

if (type.fieldType === 'Subscription') {
resolver = 'SubscriptionResolver';
} else {
resolver = 'Resolver';
}

if (type.hasArguments && !config.noNamespaces) {
result = `Resolver<R, Parent, Context, ${pascalCase(type.name)}Args>`;
result = `${resolver}<R, Parent, Context, ${pascalCase(type.name)}Args>`;
} else {
result = `Resolver<R, Parent, Context>`;
result = `${resolver}<R, Parent, Context>`;
}

return new SafeString(result);
Expand Down

0 comments on commit caf3e98

Please sign in to comment.