1 | "use strict";
|
2 | var getFromAST_1 = require('../queries/getFromAST');
|
3 | var storeUtils_1 = require('../data/storeUtils');
|
4 | var assign = require('lodash.assign');
|
5 | var cloneDeep = require('lodash.clonedeep');
|
6 | var isArray = require('lodash.isarray');
|
7 | var isNull = require('lodash.isnull');
|
8 | var isUndefined = require('lodash.isundefined');
|
9 | function mergeRequests(requests) {
|
10 | var rootQueryDoc = createEmptyRootQueryDoc();
|
11 | var rootVariables;
|
12 | requests.forEach(function (request, requestIndex) {
|
13 | request = cloneDeep(request);
|
14 | rootQueryDoc = addQueryToRoot(rootQueryDoc, request.query, requestIndex);
|
15 | if (request.variables) {
|
16 | rootVariables = addVariablesToRoot(rootVariables, request.variables, request.query, requestIndex);
|
17 | }
|
18 | });
|
19 | var rootRequest = {
|
20 | debugName: '___composed',
|
21 | query: rootQueryDoc,
|
22 | variables: rootVariables,
|
23 | };
|
24 | return rootRequest;
|
25 | }
|
26 | exports.mergeRequests = mergeRequests;
|
27 | function unpackMergedResult(result, childRequests) {
|
28 | var resultArray = childRequests.map(function (request, index) {
|
29 | var unpackedData = unpackDataForRequest({
|
30 | request: request,
|
31 | data: result.data,
|
32 | selectionSet: getFromAST_1.getQueryDefinition(request.query).selectionSet,
|
33 | queryIndex: index,
|
34 | startIndex: 0,
|
35 | fragmentMap: getFromAST_1.createFragmentMap(getFromAST_1.getFragmentDefinitions(request.query)),
|
36 | topLevel: true,
|
37 | }).unpackedData;
|
38 | return assign({}, result, { data: unpackedData });
|
39 | });
|
40 | return resultArray;
|
41 | }
|
42 | exports.unpackMergedResult = unpackMergedResult;
|
43 | function unpackDataForRequest(_a) {
|
44 | var request = _a.request, data = _a.data, selectionSet = _a.selectionSet, queryIndex = _a.queryIndex, startIndex = _a.startIndex, fragmentMap = _a.fragmentMap, topLevel = _a.topLevel;
|
45 | if (!selectionSet) {
|
46 | return {
|
47 | newIndex: startIndex,
|
48 | unpackedData: {},
|
49 | };
|
50 | }
|
51 | var unpackedData = {};
|
52 | var currIndex = startIndex;
|
53 | selectionSet.selections.forEach(function (selection) {
|
54 | if (selection.kind === 'Field') {
|
55 | var field = selection;
|
56 | var realName = storeUtils_1.resultKeyNameFromField(field);
|
57 | var aliasName = getOperationDefinitionName(getFromAST_1.getQueryDefinition(request.query), queryIndex);
|
58 | var stringKey = topLevel ? aliasName + "___fieldIndex_" + currIndex : realName;
|
59 | if (topLevel) {
|
60 | currIndex += 1;
|
61 | }
|
62 | var childData = isNull(data) ? null : data[stringKey];
|
63 | var resData = childData;
|
64 | if (field.selectionSet && field.selectionSet.selections.length > 0) {
|
65 | var fieldOpts_1 = {
|
66 | request: request,
|
67 | data: childData,
|
68 | selectionSet: field.selectionSet,
|
69 | queryIndex: queryIndex,
|
70 | fragmentMap: fragmentMap,
|
71 | startIndex: currIndex,
|
72 | topLevel: false,
|
73 | };
|
74 | if (isNull(childData)) {
|
75 | var selectionRet = unpackDataForRequest(assign(fieldOpts_1, {
|
76 | startIndex: currIndex,
|
77 | }));
|
78 | currIndex = selectionRet.newIndex;
|
79 | resData = childData;
|
80 | }
|
81 | else if (isArray(childData)) {
|
82 | var resUnpacked_1 = [];
|
83 | var newIndex_1 = 0;
|
84 | childData.forEach(function (dataObject) {
|
85 | var selectionRet = unpackDataForRequest(assign(fieldOpts_1, {
|
86 | data: dataObject,
|
87 | startIndex: currIndex,
|
88 | }));
|
89 | newIndex_1 = selectionRet.newIndex;
|
90 | resUnpacked_1.push(selectionRet.unpackedData);
|
91 | });
|
92 | currIndex = newIndex_1;
|
93 | resData = resUnpacked_1;
|
94 | }
|
95 | else {
|
96 | var selectionRet = unpackDataForRequest(assign(fieldOpts_1, { startIndex: currIndex }));
|
97 | resData = selectionRet.unpackedData;
|
98 | currIndex = selectionRet.newIndex;
|
99 | }
|
100 | }
|
101 | if (!isUndefined(childData)) {
|
102 | unpackedData[realName] = resData;
|
103 | }
|
104 | }
|
105 | else if (selection.kind === 'InlineFragment') {
|
106 | var inlineFragment = selection;
|
107 | var ret = unpackDataForRequest({
|
108 | request: request,
|
109 | data: data,
|
110 | selectionSet: inlineFragment.selectionSet,
|
111 | queryIndex: queryIndex,
|
112 | startIndex: currIndex,
|
113 | fragmentMap: fragmentMap,
|
114 | topLevel: topLevel,
|
115 | });
|
116 | assign(unpackedData, ret.unpackedData);
|
117 | currIndex = ret.newIndex;
|
118 | }
|
119 | else if (selection.kind === 'FragmentSpread') {
|
120 | var fragmentSpread = selection;
|
121 | var fragment = fragmentMap[fragmentSpread.name.value];
|
122 | var fragmentRet = unpackDataForRequest({
|
123 | request: request,
|
124 | data: data,
|
125 | selectionSet: fragment.selectionSet,
|
126 | queryIndex: queryIndex,
|
127 | startIndex: currIndex,
|
128 | fragmentMap: fragmentMap,
|
129 | topLevel: true,
|
130 | });
|
131 | assign(unpackedData, fragmentRet.unpackedData);
|
132 | currIndex = fragmentRet.newIndex;
|
133 | }
|
134 | });
|
135 | return {
|
136 | newIndex: currIndex,
|
137 | unpackedData: unpackedData,
|
138 | };
|
139 | }
|
140 | exports.unpackDataForRequest = unpackDataForRequest;
|
141 | function mergeQueryDocuments(childQueryDocs) {
|
142 | var rootQueryDoc = createEmptyRootQueryDoc();
|
143 | childQueryDocs.forEach(function (childQueryDoc, childQueryDocIndex) {
|
144 | rootQueryDoc = addQueryToRoot(rootQueryDoc, childQueryDoc, childQueryDocIndex);
|
145 | });
|
146 | return rootQueryDoc;
|
147 | }
|
148 | exports.mergeQueryDocuments = mergeQueryDocuments;
|
149 | function addVariablesToRoot(rootVariables, childVariables, childQueryDoc, childQueryDocIndex) {
|
150 | var aliasName = getOperationDefinitionName(getFromAST_1.getQueryDefinition(childQueryDoc), childQueryDocIndex);
|
151 | var aliasedChildVariables = addPrefixToVariables(aliasName + '___', childVariables);
|
152 | return assign({}, rootVariables, aliasedChildVariables);
|
153 | }
|
154 | exports.addVariablesToRoot = addVariablesToRoot;
|
155 | function addQueryToRoot(rootQueryDoc, childQueryDoc, childQueryDocIndex) {
|
156 | var aliasName = getOperationDefinitionName(getFromAST_1.getQueryDefinition(childQueryDoc), childQueryDocIndex);
|
157 | var aliasedChild = applyAliasNameToDocument(childQueryDoc, aliasName);
|
158 | var aliasedChildQueryDef = getFromAST_1.getQueryDefinition(aliasedChild);
|
159 | var aliasedChildFragmentDefs = getFromAST_1.getFragmentDefinitions(aliasedChild);
|
160 | var rootQueryDef = getFromAST_1.getQueryDefinition(rootQueryDoc);
|
161 | rootQueryDoc.definitions = rootQueryDoc.definitions.concat(aliasedChildFragmentDefs);
|
162 | rootQueryDef.selectionSet.selections =
|
163 | rootQueryDef.selectionSet.selections.concat(aliasedChildQueryDef.selectionSet.selections);
|
164 | rootQueryDef.variableDefinitions =
|
165 | rootQueryDef.variableDefinitions.concat(aliasedChildQueryDef.variableDefinitions);
|
166 | return rootQueryDoc;
|
167 | }
|
168 | exports.addQueryToRoot = addQueryToRoot;
|
169 | function createEmptyRootQueryDoc(rootQueryName) {
|
170 | if (!rootQueryName) {
|
171 | rootQueryName = '___composed';
|
172 | }
|
173 | return {
|
174 | kind: 'Document',
|
175 | definitions: [
|
176 | {
|
177 | kind: 'OperationDefinition',
|
178 | operation: 'query',
|
179 | name: {
|
180 | kind: 'Name',
|
181 | value: rootQueryName,
|
182 | },
|
183 | variableDefinitions: [],
|
184 | directives: [],
|
185 | selectionSet: {
|
186 | kind: 'SelectionSet',
|
187 | selections: [],
|
188 | },
|
189 | },
|
190 | ],
|
191 | };
|
192 | }
|
193 | exports.createEmptyRootQueryDoc = createEmptyRootQueryDoc;
|
194 | function renameFragmentSpreads(selSet, aliasName) {
|
195 | if (selSet && selSet.selections) {
|
196 | selSet.selections = selSet.selections.map(function (selection) {
|
197 | if (selection.kind === 'FragmentSpread') {
|
198 | var fragmentSpread = selection;
|
199 | fragmentSpread.name.value = getFragmentAliasName(fragmentSpread, aliasName);
|
200 | return fragmentSpread;
|
201 | }
|
202 | else {
|
203 | var withSelSet = selection;
|
204 | withSelSet.selectionSet = renameFragmentSpreads(withSelSet.selectionSet, aliasName);
|
205 | return selection;
|
206 | }
|
207 | });
|
208 | }
|
209 | return selSet;
|
210 | }
|
211 | exports.renameFragmentSpreads = renameFragmentSpreads;
|
212 | function renameVariablesInArgument(argument, aliasName) {
|
213 | if (argument.kind === 'Argument' &&
|
214 | argument.value.kind === 'Variable') {
|
215 | var varx = argument.value;
|
216 | argument.value.name.value = getVariableAliasName(varx, aliasName);
|
217 | }
|
218 | return argument;
|
219 | }
|
220 | function renameVariables(selSet, aliasName) {
|
221 | if (selSet && selSet.selections) {
|
222 | selSet.selections = selSet.selections.map(function (selection) {
|
223 | if (selection.kind === 'Field') {
|
224 | var field = selection;
|
225 | if (field.arguments) {
|
226 | field.arguments = field.arguments.map(function (argument) {
|
227 | return renameVariablesInArgument(argument, aliasName);
|
228 | });
|
229 | }
|
230 | if (field.directives) {
|
231 | field.directives = field.directives.map(function (directive) {
|
232 | if (directive.arguments) {
|
233 | directive.arguments = directive.arguments.map(function (argument) {
|
234 | return renameVariablesInArgument(argument, aliasName);
|
235 | });
|
236 | }
|
237 | return directive;
|
238 | });
|
239 | }
|
240 | field.selectionSet = renameVariables(field.selectionSet, aliasName);
|
241 | return field;
|
242 | }
|
243 | else if (selection.kind === 'InlineFragment') {
|
244 | var inlineFragment = selection;
|
245 | inlineFragment.selectionSet = renameVariables(inlineFragment.selectionSet, aliasName);
|
246 | return inlineFragment;
|
247 | }
|
248 | return selection;
|
249 | });
|
250 | }
|
251 | return selSet;
|
252 | }
|
253 | exports.renameVariables = renameVariables;
|
254 | function applyAliasNameToVariableDefinition(vDef, aliasName) {
|
255 | if (containsMarker(vDef.variable.name.value)) {
|
256 | throw new Error("Variable definition for " + vDef.variable.name.value + " contains \"___\"");
|
257 | }
|
258 | vDef.variable.name.value = getVariableAliasName(vDef.variable, aliasName);
|
259 | return vDef;
|
260 | }
|
261 | exports.applyAliasNameToVariableDefinition = applyAliasNameToVariableDefinition;
|
262 | function applyAliasNameToDocument(document, aliasName) {
|
263 | document.definitions = document.definitions.map(function (definition) {
|
264 | var operationOrFragmentDef = definition;
|
265 | operationOrFragmentDef.selectionSet =
|
266 | renameFragmentSpreads(operationOrFragmentDef.selectionSet, aliasName);
|
267 | operationOrFragmentDef.selectionSet =
|
268 | renameVariables(operationOrFragmentDef.selectionSet, aliasName);
|
269 | return operationOrFragmentDef;
|
270 | });
|
271 | var currStartIndex = 0;
|
272 | document.definitions = document.definitions.map(function (definition) {
|
273 | if (definition.kind === 'OperationDefinition' &&
|
274 | definition.operation === 'query') {
|
275 | var operationDef = definition;
|
276 | if (operationDef.variableDefinitions) {
|
277 | operationDef.variableDefinitions =
|
278 | operationDef.variableDefinitions.map(function (vDef) {
|
279 | return applyAliasNameToVariableDefinition(vDef, aliasName);
|
280 | });
|
281 | }
|
282 | var retDef = applyAliasNameToTopLevelFields(operationDef, aliasName, currStartIndex);
|
283 | currStartIndex += operationDef.selectionSet.selections.length;
|
284 | return retDef;
|
285 | }
|
286 | else if (definition.kind === 'FragmentDefinition') {
|
287 | var fragmentDef = definition;
|
288 | var retDef = applyAliasNameToFragment(fragmentDef, aliasName, currStartIndex);
|
289 | currStartIndex += fragmentDef.selectionSet.selections.length;
|
290 | return retDef;
|
291 | }
|
292 | else {
|
293 | throw new Error('Cannot apply alias names to documents that contain mutations.');
|
294 | }
|
295 | });
|
296 | return document;
|
297 | }
|
298 | exports.applyAliasNameToDocument = applyAliasNameToDocument;
|
299 | function applyAliasNameToFragment(fragment, aliasName, startIndex) {
|
300 | if (containsMarker(fragment.name.value)) {
|
301 | throw new Error("Fragment " + fragment.name.value + " contains \"___\"");
|
302 | }
|
303 | fragment.name.value = getFragmentAliasName(fragment, aliasName);
|
304 | fragment.selectionSet.selections =
|
305 | applyAliasNameToSelections(fragment.selectionSet.selections, aliasName, startIndex).res;
|
306 | return fragment;
|
307 | }
|
308 | exports.applyAliasNameToFragment = applyAliasNameToFragment;
|
309 | function applyAliasNameToTopLevelFields(childQuery, aliasName, startIndex) {
|
310 | childQuery.selectionSet.selections =
|
311 | applyAliasNameToSelections(childQuery.selectionSet.selections, aliasName, startIndex).res;
|
312 | return childQuery;
|
313 | }
|
314 | exports.applyAliasNameToTopLevelFields = applyAliasNameToTopLevelFields;
|
315 | function getVariableAliasName(varNode, aliasName) {
|
316 | return aliasName + "___" + varNode.name.value;
|
317 | }
|
318 | exports.getVariableAliasName = getVariableAliasName;
|
319 | function getFragmentAliasName(fragment, queryAliasName) {
|
320 | return queryAliasName + "___" + fragment.name.value;
|
321 | }
|
322 | exports.getFragmentAliasName = getFragmentAliasName;
|
323 | function getOperationDefinitionName(operationDef, requestIndex) {
|
324 | var operationDefName = '';
|
325 | if (operationDef.name) {
|
326 | operationDefName = operationDef.name.value;
|
327 | }
|
328 | return "___" + operationDefName + "___requestIndex_" + requestIndex;
|
329 | }
|
330 | exports.getOperationDefinitionName = getOperationDefinitionName;
|
331 | function aliasField(field, alias) {
|
332 | if (containsMarker(field.name.value)) {
|
333 | throw new Error("Field " + field.name.value + " contains \"___\".");
|
334 | }
|
335 | field.alias = {
|
336 | kind: 'Name',
|
337 | value: alias,
|
338 | };
|
339 | return field;
|
340 | }
|
341 | exports.aliasField = aliasField;
|
342 | function addPrefixToQuery(prefix, query) {
|
343 | if (query.name) {
|
344 | query.name.value = prefix + query.name.value;
|
345 | }
|
346 | return query;
|
347 | }
|
348 | exports.addPrefixToQuery = addPrefixToQuery;
|
349 | function addPrefixToVariables(prefix, variables) {
|
350 | var newVariables = {};
|
351 | Object.keys(variables).forEach(function (variableName) {
|
352 | newVariables[prefix + variableName] = variables[variableName];
|
353 | });
|
354 | return newVariables;
|
355 | }
|
356 | exports.addPrefixToVariables = addPrefixToVariables;
|
357 | function applyAliasNameToSelections(selections, aliasName, startIndex) {
|
358 | var currIndex = startIndex;
|
359 | var res = selections.map(function (selection) {
|
360 | if (selection.kind === 'Field') {
|
361 | var aliasedField = aliasField(selection, aliasName + "___fieldIndex_" + currIndex);
|
362 | currIndex += 1;
|
363 | return aliasedField;
|
364 | }
|
365 | else if (selection.kind === 'InlineFragment') {
|
366 | var inlineFragment = selection;
|
367 | var ret = applyAliasNameToSelections(inlineFragment.selectionSet.selections, aliasName, currIndex);
|
368 | inlineFragment.selectionSet.selections = ret.res;
|
369 | currIndex = ret.newIndex;
|
370 | return inlineFragment;
|
371 | }
|
372 | else {
|
373 | return selection;
|
374 | }
|
375 | });
|
376 | return {
|
377 | res: res,
|
378 | newIndex: currIndex,
|
379 | };
|
380 | }
|
381 | function containsMarker(name) {
|
382 | return name.indexOf('___') > -1;
|
383 | }
|
384 |
|
\ | No newline at end of file |