Skip to content

Commit

Permalink
Support for list of fragments
Browse files Browse the repository at this point in the history
  • Loading branch information
maticzav committed Jul 16, 2018
1 parent cd5e722 commit 16946ed
Show file tree
Hide file tree
Showing 5 changed files with 68 additions and 15 deletions.
17 changes: 12 additions & 5 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -115,17 +115,18 @@ export declare type IMiddlewareResolver<
info: GraphQLResolveInfo,
) => Promise<any>

export interface IMiddlewareWithFragment<
export interface IMiddlewareWithOptions<
TSource = any,
TContext = any,
TArgs = any
> {
fragment: string
fragment?: IMiddlewareFragment
fragments?: IMiddlewareFragment[]
resolve?: IMiddlewareResolver<TSource, TContext, TArgs>
}

export type IMiddlewareFunction<TSource = any, TContext = any, TArgs = any> =
| IMiddlewareWithFragment<TSource, TContext, TArgs>
| IMiddlewareWithOptions<TSource, TContext, TArgs>
| IMiddlewareResolver<TSource, TContext, TArgs>

interface IMiddlewareTypeMap {
Expand Down Expand Up @@ -210,8 +211,14 @@ const middlewareWithFragments = {
return resolve(foo)
},
},
Mutation: (resolve, parent, args, ctx, info) => {
return resolve(parent, customArgs)
Mutation: {
fragments: [
`fragment NodeID on Node { id }`,
`fragment NodeSecret on Node { secret }`,
],
resolve: (resolve, parent, args, ctx, info) => {
return resolve(parent, customArgs)
},
},
}

Expand Down
3 changes: 2 additions & 1 deletion src/applicator.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,13 +5,14 @@ import {
GraphQLSchema,
defaultFieldResolver,
} from 'graphql'
import { IResolverOptions, IResolvers } from 'graphql-tools'
import {
IMiddlewareFunction,
IMiddlewareResolver,
IMiddlewareFieldMap,
IApplyOptions,
IMiddleware,
IResolvers,
IResolverOptions,
} from './types'
import {
isMiddlewareFunction,
Expand Down
11 changes: 9 additions & 2 deletions src/fragments.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
import { FragmentReplacement } from './types'
import { IResolvers } from 'graphql-tools/dist/Interfaces'
import { FragmentReplacement, IResolvers } from './types'

export function extractFragmentReplacements(
resolvers: IResolvers,
Expand All @@ -16,6 +15,14 @@ export function extractFragmentReplacements(
fragment: fieldResolver.fragment,
})
}
if (typeof fieldResolver === 'object' && fieldResolver.fragments) {
for (const fragment in fieldResolver.fragments) {
fragmentReplacements.push({
field: fieldName,
fragment,
})
}
}
}
}

Expand Down
48 changes: 43 additions & 5 deletions src/types.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,14 @@
import { GraphQLResolveInfo, GraphQLSchema } from 'graphql'
import {
GraphQLResolveInfo,
GraphQLSchema,
GraphQLTypeResolver,
GraphQLIsTypeOfFn,
} from 'graphql'
import { MergeInfo } from 'graphql-tools'

// Middleware
// Middleware Tree

export declare type IMiddlewareFragment = string

export declare type IMiddlewareResolver<
TSource = any,
Expand All @@ -14,17 +22,18 @@ export declare type IMiddlewareResolver<
info: GraphQLResolveInfo,
) => Promise<any>

export interface IMiddlewareWithFragment<
export interface IMiddlewareWithOptions<
TSource = any,
TContext = any,
TArgs = any
> {
fragment: string
fragment?: IMiddlewareFragment
fragments?: IMiddlewareFragment[]
resolve?: IMiddlewareResolver<TSource, TContext, TArgs>
}

export type IMiddlewareFunction<TSource = any, TContext = any, TArgs = any> =
| IMiddlewareWithFragment<TSource, TContext, TArgs>
| IMiddlewareWithOptions<TSource, TContext, TArgs>
| IMiddlewareResolver<TSource, TContext, TArgs>

export interface IMiddlewareTypeMap<
Expand Down Expand Up @@ -64,6 +73,8 @@ export declare type IMiddleware<TSource = any, TContext = any, TArgs = any> =
| IMiddlewareFunction<TSource, TContext, TArgs>
| IMiddlewareTypeMap<TSource, TContext, TArgs>

// Middleware

export declare type IApplyOptions = {
onlyDeclaredResolvers: boolean
}
Expand All @@ -73,7 +84,34 @@ export declare type GraphQLSchemaWithFragmentReplacements = GraphQLSchema & {
fragmentReplacements?: FragmentReplacement[]
}

// Fragments (inspired by graphql-tools)

export interface FragmentReplacement {
field: string
fragment: string
}

export interface IResolvers<TSource = any, TContext = any> {
[key: string]: IResolverObject<TSource, TContext>
}

export interface IResolverObject<TSource = any, TContext = any> {
[key: string]:
| IFieldResolver<TSource, TContext>
| IResolverOptions<TSource, TContext>
}

export interface IResolverOptions<TSource = any, TContext = any> {
fragment?: string
resolve?: IFieldResolver<TSource, TContext>
subscribe?: IFieldResolver<TSource, TContext>
__resolveType?: GraphQLTypeResolver<TSource, TContext>
__isTypeOf?: GraphQLIsTypeOfFn<TSource, TContext>
}

export type IFieldResolver<TSource, TContext> = (
source: TSource,
args: { [argument: string]: any },
context: TContext,
info: GraphQLResolveInfo & { mergeInfo: MergeInfo },
) => any
4 changes: 2 additions & 2 deletions src/utils.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { GraphQLObjectType, GraphQLInterfaceType } from 'graphql'
import {
IMiddlewareResolver,
IMiddlewareWithFragment,
IMiddlewareWithOptions,
IMiddlewareFunction,
IMiddlewareGenerator,
} from './types'
Expand All @@ -20,7 +20,7 @@ export function isMiddlewareResolver<TSource, TContext, TArgs>(

export function isMiddlewareWithFragment<TSource, TContext, TArgs>(
obj: any,
): obj is IMiddlewareWithFragment<TSource, TContext, TArgs> {
): obj is IMiddlewareWithOptions<TSource, TContext, TArgs> {
return (
typeof obj.fragment === 'string' &&
(obj.resolve === undefined || isMiddlewareResolver(obj.resolve))
Expand Down

0 comments on commit 16946ed

Please sign in to comment.