Guest User

Untitled

a guest
Nov 13th, 2018
92
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.42 KB | None | 0 0
  1. // @flow
  2.  
  3. type ResolvedScalar = string | number | boolean | null;
  4. type ResolvedValue =
  5. | ResolvedScalar
  6. | {[key: string]: ResolvedScalar}
  7. | Array<ResolvedValue>;
  8.  
  9. export type ResolverMap = {
  10. [key: string]: () => ResolvedValue | ResolverMap,
  11. };
  12.  
  13. /**
  14. * Given a map of mock GraphQL resolver functions, merge in a map of
  15. * desired mocks. Generally, `target` will be the default mocked values,
  16. * and `input` will be the values desired for a portal example or Jest tests.
  17. */
  18. const mergeResolvers = (target: ResolverMap, input: ResolverMap) => {
  19. const inputTypenames = Object.keys(input);
  20. const merged: ResolverMap = inputTypenames.reduce(
  21. (accum, key) => {
  22. const inputResolver = input[key];
  23. if (target.hasOwnProperty(key)) {
  24. const targetResolver = target[key];
  25. const resolvedInput = inputResolver();
  26. const resolvedTarget = targetResolver();
  27. if (
  28. !!resolvedTarget &&
  29. !!resolvedInput &&
  30. typeof resolvedTarget === 'object' &&
  31. typeof resolvedInput === 'object' &&
  32. !Array.isArray(resolvedTarget) &&
  33. !Array.isArray(resolvedInput)
  34. ) {
  35. const newValue = {...resolvedTarget, ...resolvedInput};
  36. return {
  37. ...accum,
  38. [key]: () => newValue,
  39. };
  40. }
  41. }
  42. return {...accum, [key]: inputResolver};
  43. },
  44. {...target},
  45. );
  46. return merged;
  47. };
  48.  
  49. export default mergeResolvers;
Add Comment
Please, Sign In to add comment