All files / domains/union compiler.ts

96% Statements 24/25
87.5% Branches 7/8
100% Functions 3/3
95.65% Lines 22/23
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 489x 9x 9x 9x 9x   1x 2x 3x 3x 2x           2x 1x   1x 1x 1x 2x 2x       1x 1x         1x 1x   9x                      
import { GraphQLUnionType, GraphQLObjectType } from 'graphql';
 
import { resolveTypes, isObjectType } from 'services/utils';
import { UnionError } from './error';
 
const compileUnionCache = new WeakMap<Function, GraphQLUnionType>();
 
function getDefaultResolver(types: GraphQLObjectType[]) {
  return (value: any, context: any, info: any) => {
    for (let type of types) {
      if (type.isTypeOf(value, context, info)) {
        return type;
      }
    }
  };
}
 
export function compileUnionType(target: Function, config: any) {
  if (compileUnionCache.has(target)) {
    return compileUnionCache.get(target);
  }
 
  const { types, resolver, name } = config;
I
  const resolvedTypes = resolveTypes(types);
 
  for (let type of resolvedTypes) {
    if (!isObjectType(type)) {
      throw new UnionError(
        target,
        `Every union type must be of type GraphQLObjectType. '${type}' is not.`,
      );
    }
  }
 
  const typeResolver =
    resolver || getDefaultResolver(resolvedTypes as GraphQLObjectType[]);
 
  const compiled = new GraphQLUnionType({
    name,
    resolveType: typeResolver,
    types: resolvedTypes as GraphQLObjectType[],
  });
 
  compileUnionCache.set(target, compiled);
  return compiled;
}