@graphql-codegen/flow-resolvers
Version:
GraphQL Code Generator plugin for generating Flow types for GraphQL resolvers signature
107 lines (95 loc) • 4.37 kB
JavaScript
;
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;