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);
};
}
|