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