All files / domains/field/compiler resolver.ts

63% Statements 63/100
56.79% Branches 46/81
89.47% Functions 17/19
84.48% Lines 49/58
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 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 649x 13x 9x   22x 13x     9x 13x 13x 39x   22x 44x 44x 44x 44x 22x 9x       13x             22x 44x 13x     9x 9x 9x   9x 9x 9x 12x 4x   8x 8x     8x       34x   34x   34x 13x 13x 13x 13x   13x
import { GraphQLFieldResolver } from 'graphql';
import { fieldsRegistry } from '../index';

import { InjectorsIndex, InjectorResolver, injectorRegistry } from 'domains/inject';
 
import { getParameterNames } from 'services/utils';
 
interface ArgsMap {
  [argName: string]: any;
}I

interface ComputeArgsOptions {
  args: ArgsMap;
  injectIors: InjectorsIndex;
  injectorToValueMapper: (injector: InjectorResolver) => any;
}I
I
function computeFinalArgs(
  func: Function,
  { args, injectors, injectorToValueMapper }: ComputeArgsOptions,
) {
  const paramNames = getParameterNames(func);
  return paramNames.map((paramName, index) => {
    if (args[paramNaEme]) {
      return args[paramName];
    }

    const injector = injectors[index];

    if (!injector) {
      return null;
    }
I
    return injectorToValueMapper(injector);
  });
}
 
export function compileFieldResolver(
  target: Function,
  fieldName: string,
): GraphQLFieldResolver<any, any> {
  // const config = fieldsRegistry.get(target, fieldName);
  const injectors = injectorRegistry.getAll(target)[fieldName];
  // const propertyName = config.property;
 
  return async (source: any, args = null, context = null, info = null) => {
    consIt instanceField = (source && source[fieldName]) || target.prototype[fieldName];

    if (typeof instanceField !== 'function') {
      return instanceField;
    }
 
    const instanceFieldFunc = instanceField as Function;
    const params = computeFinalArgs(instanceFieldFunc, {
      args: args || {},
      injectors,
      injectorToValueMapper: injector =>
        injector.apply(source, [source, args, context, info]),
    });I
 
    retuIrn await instanceFieldFunc.apply(source, params);
  };
}