1 | "use strict";
|
2 | Object.defineProperty(exports, "__esModule", { value: true });
|
3 | exports.merge = exports.graphql = void 0;
|
4 | var apollo_utilities_1 = require("apollo-utilities");
|
5 | function graphql(resolver, document, rootValue, contextValue, variableValues, execOptions) {
|
6 | if (variableValues === void 0) { variableValues = {}; }
|
7 | if (execOptions === void 0) { execOptions = {}; }
|
8 | var mainDefinition = (0, apollo_utilities_1.getMainDefinition)(document);
|
9 | var fragments = (0, apollo_utilities_1.getFragmentDefinitions)(document);
|
10 | var fragmentMap = (0, apollo_utilities_1.createFragmentMap)(fragments);
|
11 | var resultMapper = execOptions.resultMapper;
|
12 | var fragmentMatcher = execOptions.fragmentMatcher || (function () { return true; });
|
13 | var execContext = {
|
14 | fragmentMap: fragmentMap,
|
15 | contextValue: contextValue,
|
16 | variableValues: variableValues,
|
17 | resultMapper: resultMapper,
|
18 | resolver: resolver,
|
19 | fragmentMatcher: fragmentMatcher,
|
20 | };
|
21 | return executeSelectionSet(mainDefinition.selectionSet, rootValue, execContext);
|
22 | }
|
23 | exports.graphql = graphql;
|
24 | function executeSelectionSet(selectionSet, rootValue, execContext) {
|
25 | var fragmentMap = execContext.fragmentMap, contextValue = execContext.contextValue, variables = execContext.variableValues;
|
26 | var result = {};
|
27 | selectionSet.selections.forEach(function (selection) {
|
28 | if (variables && !(0, apollo_utilities_1.shouldInclude)(selection, variables)) {
|
29 | return;
|
30 | }
|
31 | if ((0, apollo_utilities_1.isField)(selection)) {
|
32 | var fieldResult = executeField(selection, rootValue, execContext);
|
33 | var resultFieldKey = (0, apollo_utilities_1.resultKeyNameFromField)(selection);
|
34 | if (fieldResult !== undefined) {
|
35 | if (result[resultFieldKey] === undefined) {
|
36 | result[resultFieldKey] = fieldResult;
|
37 | }
|
38 | else {
|
39 | merge(result[resultFieldKey], fieldResult);
|
40 | }
|
41 | }
|
42 | }
|
43 | else {
|
44 | var fragment = void 0;
|
45 | if ((0, apollo_utilities_1.isInlineFragment)(selection)) {
|
46 | fragment = selection;
|
47 | }
|
48 | else {
|
49 | fragment = fragmentMap[selection.name.value];
|
50 | if (!fragment) {
|
51 | throw new Error("No fragment named ".concat(selection.name.value));
|
52 | }
|
53 | }
|
54 | var typeCondition = fragment.typeCondition.name.value;
|
55 | if (execContext.fragmentMatcher(rootValue, typeCondition, contextValue)) {
|
56 | var fragmentResult = executeSelectionSet(fragment.selectionSet, rootValue, execContext);
|
57 | merge(result, fragmentResult);
|
58 | }
|
59 | }
|
60 | });
|
61 | if (execContext.resultMapper) {
|
62 | return execContext.resultMapper(result, rootValue);
|
63 | }
|
64 | return result;
|
65 | }
|
66 | function executeField(field, rootValue, execContext) {
|
67 | var variables = execContext.variableValues, contextValue = execContext.contextValue, resolver = execContext.resolver;
|
68 | var fieldName = field.name.value;
|
69 | var args = (0, apollo_utilities_1.argumentsObjectFromField)(field, variables);
|
70 | var info = {
|
71 | isLeaf: !field.selectionSet,
|
72 | resultKey: (0, apollo_utilities_1.resultKeyNameFromField)(field),
|
73 | directives: (0, apollo_utilities_1.getDirectiveInfoFromField)(field, variables),
|
74 | field: field,
|
75 | };
|
76 | var result = resolver(fieldName, rootValue, args, contextValue, info);
|
77 | if (!field.selectionSet) {
|
78 | return result;
|
79 | }
|
80 | if (result == null) {
|
81 | return result;
|
82 | }
|
83 | if (Array.isArray(result)) {
|
84 | return executeSubSelectedArray(field, result, execContext);
|
85 | }
|
86 | return executeSelectionSet(field.selectionSet, result, execContext);
|
87 | }
|
88 | function executeSubSelectedArray(field, result, execContext) {
|
89 | return result.map(function (item) {
|
90 | if (item === null) {
|
91 | return null;
|
92 | }
|
93 | if (Array.isArray(item)) {
|
94 | return executeSubSelectedArray(field, item, execContext);
|
95 | }
|
96 | return executeSelectionSet(field.selectionSet, item, execContext);
|
97 | });
|
98 | }
|
99 | var hasOwn = Object.prototype.hasOwnProperty;
|
100 | function merge(dest, src) {
|
101 | if (src !== null && typeof src === 'object') {
|
102 | Object.keys(src).forEach(function (key) {
|
103 | var srcVal = src[key];
|
104 | if (!hasOwn.call(dest, key)) {
|
105 | dest[key] = srcVal;
|
106 | }
|
107 | else {
|
108 | merge(dest[key], srcVal);
|
109 | }
|
110 | });
|
111 | }
|
112 | }
|
113 | exports.merge = merge;
|
114 |
|
\ | No newline at end of file |