UNPKG

16 kBJavaScriptView Raw
1"use strict";
2var getFromAST_1 = require('../queries/getFromAST');
3var storeUtils_1 = require('../data/storeUtils');
4var assign = require('lodash.assign');
5var cloneDeep = require('lodash.clonedeep');
6var isArray = require('lodash.isarray');
7var isNull = require('lodash.isnull');
8var isUndefined = require('lodash.isundefined');
9function 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}
26exports.mergeRequests = mergeRequests;
27function 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}
42exports.unpackMergedResult = unpackMergedResult;
43function 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}
140exports.unpackDataForRequest = unpackDataForRequest;
141function mergeQueryDocuments(childQueryDocs) {
142 var rootQueryDoc = createEmptyRootQueryDoc();
143 childQueryDocs.forEach(function (childQueryDoc, childQueryDocIndex) {
144 rootQueryDoc = addQueryToRoot(rootQueryDoc, childQueryDoc, childQueryDocIndex);
145 });
146 return rootQueryDoc;
147}
148exports.mergeQueryDocuments = mergeQueryDocuments;
149function 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}
154exports.addVariablesToRoot = addVariablesToRoot;
155function 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}
168exports.addQueryToRoot = addQueryToRoot;
169function 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}
193exports.createEmptyRootQueryDoc = createEmptyRootQueryDoc;
194function 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}
211exports.renameFragmentSpreads = renameFragmentSpreads;
212function 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}
220function 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}
253exports.renameVariables = renameVariables;
254function 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}
261exports.applyAliasNameToVariableDefinition = applyAliasNameToVariableDefinition;
262function 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}
298exports.applyAliasNameToDocument = applyAliasNameToDocument;
299function 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}
308exports.applyAliasNameToFragment = applyAliasNameToFragment;
309function applyAliasNameToTopLevelFields(childQuery, aliasName, startIndex) {
310 childQuery.selectionSet.selections =
311 applyAliasNameToSelections(childQuery.selectionSet.selections, aliasName, startIndex).res;
312 return childQuery;
313}
314exports.applyAliasNameToTopLevelFields = applyAliasNameToTopLevelFields;
315function getVariableAliasName(varNode, aliasName) {
316 return aliasName + "___" + varNode.name.value;
317}
318exports.getVariableAliasName = getVariableAliasName;
319function getFragmentAliasName(fragment, queryAliasName) {
320 return queryAliasName + "___" + fragment.name.value;
321}
322exports.getFragmentAliasName = getFragmentAliasName;
323function getOperationDefinitionName(operationDef, requestIndex) {
324 var operationDefName = '';
325 if (operationDef.name) {
326 operationDefName = operationDef.name.value;
327 }
328 return "___" + operationDefName + "___requestIndex_" + requestIndex;
329}
330exports.getOperationDefinitionName = getOperationDefinitionName;
331function 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}
341exports.aliasField = aliasField;
342function addPrefixToQuery(prefix, query) {
343 if (query.name) {
344 query.name.value = prefix + query.name.value;
345 }
346 return query;
347}
348exports.addPrefixToQuery = addPrefixToQuery;
349function addPrefixToVariables(prefix, variables) {
350 var newVariables = {};
351 Object.keys(variables).forEach(function (variableName) {
352 newVariables[prefix + variableName] = variables[variableName];
353 });
354 return newVariables;
355}
356exports.addPrefixToVariables = addPrefixToVariables;
357function 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}
381function containsMarker(name) {
382 return name.indexOf('___') > -1;
383}
384//# sourceMappingURL=queryMerging.js.map
\No newline at end of file