UNPKG

@graphql-codegen/flow-resolvers

Version:

GraphQL Code Generator plugin for generating Flow types for GraphQL resolvers signature

107 lines (95 loc) 4.37 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.plugin = void 0; const plugin_helpers_1 = require("@graphql-codegen/plugin-helpers"); const visitor_js_1 = require("./visitor.js"); const plugin = (schema, documents, config) => { const imports = ['type GraphQLResolveInfo']; const showUnusedMappers = typeof config.showUnusedMappers === 'boolean' ? config.showUnusedMappers : true; const transformedSchema = config.federation ? (0, plugin_helpers_1.addFederationReferencesToSchema)(schema) : schema; const astNode = (0, plugin_helpers_1.getCachedDocumentNodeFromSchema)(transformedSchema); const visitor = new visitor_js_1.FlowResolversVisitor(config, transformedSchema); const visitorResult = (0, plugin_helpers_1.oldVisit)(astNode, { leave: visitor }); const defsToInclude = [visitor.getResolverTypeWrapperSignature()]; if (visitor.hasFederation()) { defsToInclude.push(` export type ReferenceResolver<TResult, TReference, TContext> = ( reference: TReference, context: TContext, info: GraphQLResolveInfo ) => Promise<TResult> | TResult; `); defsToInclude.push(`export type RecursivePick<T, U> = T`); } const header = `export type Resolver<Result, Parent = {}, Context = {}, Args = {}> = ( parent: Parent, args: Args, context: Context, info: GraphQLResolveInfo ) => Promise<Result> | Result; export type SubscriptionSubscribeFn<Result, Parent, Context, Args> = ( parent: Parent, args: Args, context: Context, info: GraphQLResolveInfo ) => AsyncIterator<Result> | Promise<AsyncIterator<Result>>; export type SubscriptionResolveFn<Result, Parent, Context, Args> = ( parent: Parent, args: Args, context: Context, info: GraphQLResolveInfo ) => Result | Promise<Result>; export interface SubscriptionSubscriberObject<Result, Key: string, Parent, Context, Args> { subscribe: SubscriptionSubscribeFn<{ [key: Key]: Result }, Parent, Context, Args>; resolve?: SubscriptionResolveFn<Result, { [key: Key]: Result }, Context, Args>; } export interface SubscriptionResolverObject<Result, Parent, Context, Args> { subscribe: SubscriptionSubscribeFn<mixed, Parent, Context, Args>; resolve: SubscriptionResolveFn<Result, mixed, Context, Args>; } export type SubscriptionObject<Result, Key: string, Parent, Context, Args> = | SubscriptionSubscriberObject<Result, Key, Parent, Context, Args> | SubscriptionResolverObject<Result, Parent, Context, Args>; export type SubscriptionResolver<Result, Key: string, Parent = {}, Context = {}, Args = {}> = | ((...args: Array<any>) => SubscriptionObject<Result, Key, Parent, Context, Args>) | SubscriptionObject<Result, Key, Parent, Context, Args>; export type TypeResolveFn<Types, Parent = {}, Context = {}> = ( parent: Parent, context: Context, info: GraphQLResolveInfo ) => ?Types | Promise<?Types>; export type IsTypeOfResolverFn<T = {}, Context = {}> = (obj: T, context: Context, info: GraphQLResolveInfo) => boolean | Promise<boolean>; export type NextResolverFn<T> = () => Promise<T>; export type DirectiveResolverFn<Result = {}, Parent = {}, Args = {}, Context = {}> = ( next: NextResolverFn<Result>, parent: Parent, args: Args, context: Context, info: GraphQLResolveInfo ) => Result | Promise<Result>; ${defsToInclude.join('\n')} `; const resolversTypeMapping = visitor.buildResolversTypes(); const resolversParentTypeMapping = visitor.buildResolversParentTypes(); const { getRootResolver, getAllDirectiveResolvers, mappersImports, unusedMappers, hasScalars } = visitor; if (hasScalars()) { imports.push('type GraphQLScalarType', 'type GraphQLScalarTypeConfig'); } const gqlImports = `import { ${imports.join(', ')} } from 'graphql';`; if (showUnusedMappers && unusedMappers.length) { // eslint-disable-next-line no-console console.warn(`Unused mappers: ${unusedMappers.join(',')}`); } return { prepend: [gqlImports, ...mappersImports, ...visitor.globalDeclarations], content: [ header, resolversTypeMapping, resolversParentTypeMapping, ...visitorResult.definitions.filter(d => typeof d === 'string'), getRootResolver(), getAllDirectiveResolvers(), ].join('\n'), }; }; exports.plugin = plugin;