apollo-angular
Version:
Use your GraphQL data in your Angular app, with the Apollo Client
111 lines • 16.4 kB
JavaScript
import { HttpHeaders } from '@angular/common/http';
import { Observable } from 'rxjs';
export const fetch = (req, httpClient, extractFiles) => {
const shouldUseBody = ['POST', 'PUT', 'PATCH'].indexOf(req.method.toUpperCase()) !== -1;
const shouldStringify = (param) => ['variables', 'extensions'].indexOf(param.toLowerCase()) !== -1;
const isBatching = req.body.length;
let shouldUseMultipart = req.options && req.options.useMultipart;
let multipartInfo;
if (shouldUseMultipart) {
if (isBatching) {
return new Observable((observer) => observer.error(new Error('File upload is not available when combined with Batching')));
}
if (!shouldUseBody) {
return new Observable((observer) => observer.error(new Error('File upload is not available when GET is used')));
}
if (!extractFiles) {
return new Observable((observer) => observer.error(new Error(`To use File upload you need to pass "extractFiles" function from "extract-files" library to HttpLink's options`)));
}
multipartInfo = extractFiles(req.body);
shouldUseMultipart = !!multipartInfo.files.size;
}
// `body` for some, `params` for others
let bodyOrParams = {};
if (isBatching) {
if (!shouldUseBody) {
return new Observable((observer) => observer.error(new Error('Batching is not available for GET requests')));
}
bodyOrParams = {
body: req.body,
};
}
else {
const body = shouldUseMultipart ? multipartInfo.clone : req.body;
if (shouldUseBody) {
bodyOrParams = {
body,
};
}
else {
const params = Object.keys(req.body).reduce((obj, param) => {
const value = req.body[param];
obj[param] = shouldStringify(param) ? JSON.stringify(value) : value;
return obj;
}, {});
bodyOrParams = { params: params };
}
}
if (shouldUseMultipart && shouldUseBody) {
const form = new FormData();
form.append('operations', JSON.stringify(bodyOrParams.body));
const map = {};
const files = multipartInfo.files;
let i = 0;
files.forEach((paths) => {
map[++i] = paths;
});
form.append('map', JSON.stringify(map));
i = 0;
files.forEach((_, file) => {
form.append(++i + '', file, file.name);
});
bodyOrParams.body = form;
}
// create a request
return httpClient.request(req.method, req.url, {
observe: 'response',
responseType: 'json',
reportProgress: false,
...bodyOrParams,
...req.options,
});
};
export const mergeHeaders = (source, destination) => {
if (source && destination) {
const merged = destination
.keys()
.reduce((headers, name) => headers.set(name, destination.getAll(name)), source);
return merged;
}
return destination || source;
};
export function prioritize(...values) {
const picked = values.find((val) => typeof val !== 'undefined');
if (typeof picked === 'undefined') {
return values[values.length - 1];
}
return picked;
}
export function createHeadersWithClientAwareness(context) {
// `apollographql-client-*` headers are automatically set if a
// `clientAwareness` object is found in the context. These headers are
// set first, followed by the rest of the headers pulled from
// `context.headers`.
let headers = context.headers && context.headers instanceof HttpHeaders
? context.headers
: new HttpHeaders(context.headers);
if (context.clientAwareness) {
const { name, version } = context.clientAwareness;
// If desired, `apollographql-client-*` headers set by
// the `clientAwareness` object can be overridden by
// `apollographql-client-*` headers set in `context.headers`.
if (name && !headers.has('apollographql-client-name')) {
headers = headers.set('apollographql-client-name', name);
}
if (version && !headers.has('apollographql-client-version')) {
headers = headers.set('apollographql-client-version', version);
}
}
return headers;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9odHRwL3NyYy91dGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsV0FBVyxFQUEyQixNQUFNLHNCQUFzQixDQUFDO0FBQzNFLE9BQU8sRUFBQyxVQUFVLEVBQUMsTUFBTSxNQUFNLENBQUM7QUFJaEMsTUFBTSxDQUFDLE1BQU0sS0FBSyxHQUFHLENBQ25CLEdBQVksRUFDWixVQUFzQixFQUN0QixZQUEyQixFQUNPLEVBQUU7SUFDcEMsTUFBTSxhQUFhLEdBQ2pCLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxPQUFPLENBQUMsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxXQUFXLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0lBQ3BFLE1BQU0sZUFBZSxHQUFHLENBQUMsS0FBYSxFQUFFLEVBQUUsQ0FDeEMsQ0FBQyxXQUFXLEVBQUUsWUFBWSxDQUFDLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxXQUFXLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0lBQ2xFLE1BQU0sVUFBVSxHQUFJLEdBQUcsQ0FBQyxJQUFlLENBQUMsTUFBTSxDQUFDO0lBQy9DLElBQUksa0JBQWtCLEdBQUcsR0FBRyxDQUFDLE9BQU8sSUFBSSxHQUFHLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQztJQUNqRSxJQUFJLGFBR0gsQ0FBQztJQUVGLElBQUksa0JBQWtCLEVBQUU7UUFDdEIsSUFBSSxVQUFVLEVBQUU7WUFDZCxPQUFPLElBQUksVUFBVSxDQUFDLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FDakMsUUFBUSxDQUFDLEtBQUssQ0FDWixJQUFJLEtBQUssQ0FBQywwREFBMEQsQ0FBQyxDQUN0RSxDQUNGLENBQUM7U0FDSDtRQUVELElBQUksQ0FBQyxhQUFhLEVBQUU7WUFDbEIsT0FBTyxJQUFJLFVBQVUsQ0FBQyxDQUFDLFFBQVEsRUFB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SUFDM0UsOERBQThEO0lBQzlELHNFQUFzRTtJQUN0RSw2REFBNkQ7SUFDN0QscUJBQXFCO0lBQ3JCLElBQUksT0FBTyxHQUNULE9BQU8sQ0FBQyxPQUFPLElBQUksT0FBTyxDQUFDLE9BQU8sWUFBWSxXQUFXO1FBQ3ZELENBQUMsQ0FBQyxPQUFPLENBQUMsT0FBTztRQUNqQixDQUFDLENBQUMsSUFBSSxXQUFXLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBRXZDLElBQUksT0FBTyxDQUFDLGVBQWUsRUFBRTtRQUMzQixNQUFNLEVBQUMsSUFBSSxFQUFFLE9BQU8sRUFBQyxHQUFHLE9BQU8sQ0FBQyxlQUFlLENBQUM7UUFFaEQsc0RBQXNEO1FBQ3RELG9EQUFvRDtRQUNwRCw2REFBNkQ7UUFFN0QsSUFBSSxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLDJCQUEyQixDQUFDLEVBQUU7WUFDckQsT0FBTyxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsMkJBQTJCLEVBQUUsSUFBSSxDQUFDLENBQUM7U0FDMUQ7UUFFRCxJQUFJLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsOEJBQThCLENBQUMsRUFBRTtZQUMzRCxPQUFPLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyw4QkFBOEIsRUFBRSxPQUFPLENBQUMsQ0FBQztTQUNoRTtLQUNGO0lBRUQsT0FBTyxPQUFPLENBQUM7QUFDakIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7SHR0cEhlYWRlcnMsIEh0dHBSZXNwb25zZSwgSHR0cENsaWVudH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuaW1wb3J0IHtPYnNlcnZhYmxlfSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHtSZXF1ZXN0LCBCb2R5LCBFeHRyYWN0RmlsZXN9IGZyb20gJy4vdHlwZXMnO1xuXG5leHBvcnQgY29uc3QgZmV0Y2ggPSAoXG4gIHJlcTogUmVxdWVzdCxcbiAgaHR0cENsaWVudDogSHR0cENsaWVudCxcbiAgZXh0cmFjdEZpbGVzPzogRXh0cmFjdEZpbGVzLFxuKTogT2JzZXJ2YWJsZTxIdHRwUmVzcG9uc2U8T2JqZWN0Pj4gPT4ge1xuICBjb25zdCBzaG91bGRVc2VCb2R5ID1cbiAgICBbJ1BPU1QnLCAnUFVUJywgJ1BBVENIJ10uaW5kZXhPZihyZXEubWV0aG9kLnRvVXBwZXJDYXNlKCkpICE9PSAtMTtcbiAgY29uc3Qgc2hvdWxkU3RyaW5naWZ5ID0gKHBhcmFtOiBzdHJpbmcpID0+XG4gICAgWyd2YXJpYWJsZXMnLCAnZXh0ZW5zaW9ucyddLmluZGV4T2YocGFyYW0udG9Mb3dlckNhc2UoKSkgIT09IC0xO1xuICBjb25zdCBpc0JhdGNoaW5nID0gKHJlcS5ib2R5IGFzIEJvZHlbXSkubGVuZ3RoO1xuICBsZXQgc2hvdWxkVXNlTXVsdGlwYXJ0ID0gcmVxLm9wdGlvbnMgJiYgcmVxLm9wdGlvbnMudXNlTXVsdGlwYXJ0O1xuICBsZXQgbXVsdGlwYXJ0SW5mbzoge1xuICAgIGNsb25lOiBCb2R5O1xuICAgIGZpbGVzOiBNYXA8YW55LCBhbnk+O1xuICB9O1xuXG4gIGlmIChzaG91bGRVc2VNdWx0aXBhcnQpIHtcbiAgICBpZiAoaXNCYXRjaGluZykge1xuICAgICAgcmV0dXJuIG5ldyBPYnNlcnZhYmxlKChvYnNlcnZlcikgPT5cbiAgICAgICAgb2JzZXJ2ZXIuZXJyb3IoXG4gICAgICAgICAgbmV3IEVycm9yKCdGaWxlIHVwbG9hZCBpcyBub3QgYXZhaWxhYmxlIHdoZW4gY29tYmluZWQgd2l0aCBCYXRjaGluZycpLFxuICAgICAgICApLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoIXNob3VsZFVzZUJvZHkpIHtcbiAgICAgIHJldHVybiBuZXcgT2JzZXJ2YWJsZSgob2JzZXJ2ZXIpID0+XG4gICAgICAgIG9ic2VydmVyLmVycm9yKFxuICAgICAgICAgIG5ldyBFcnJvcignRmlsZSB1cGxvYWQgaXMgbm90IGF2YWlsYWJsZSB3aGVuIEdFVCBpcyB1c2VkJyksXG4gICAgICAgICksXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmICghZXh0cmFjdEZpbGVzKSB7XG4gICAgICByZXR1cm4gbmV3IE9ic2VydmFibGUoKG9ic2VydmVyKSA9PlxuICAgICAgICBvYnNlcnZlci5lcnJvcihcbiAgICAgICAgICBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgVG8gdXNlIEZpbGUgdXBsb2FkIHlvdSBuZWVkIHRvIHBhc3MgXCJleHRyYWN0RmlsZXNcIiBmdW5jdGlvbiBmcm9tIFwiZXh0cmFjdC1maWxlc1wiIGxpYnJhcnkgdG8gSHR0cExpbmsncyBvcHRpb25zYCxcbiAgICAgICAgICApLFxuICAgICAgICApLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBtdWx0aXBhcnRJbmZvID0gZXh0cmFjdEZpbGVzKHJlcS5ib2R5KTtcblxuICAgIHNob3VsZFVzZU11bHRpcGFydCA9ICEhbXVsdGlwYXJ0SW5mby5maWxlcy5zaXplO1xuICB9XG5cbiAgLy8gYGJvZHlgIGZvciBzb21lLCBgcGFyYW1zYCBmb3Igb3RoZXJzXG4gIGxldCBib2R5T3JQYXJhbXMgPSB7fTtcblxuICBpZiAoaXNCYXRjaGluZykge1xuICAgIGlmICghc2hvdWxkVXNlQm9keSkge1xuICAgICAgcmV0dXJuIG5ldyBPYnNlcnZhYmxlKChvYnNlcnZlcikgPT5cbiAgICAgICAgb2JzZXJ2ZXIuZXJyb3IobmV3IEVycm9yKCdCYXRjaGluZyBpcyBub3QgYXZhaWxhYmxlIGZvciBHRVQgcmVxdWVzdHMnKSksXG4gICAgICApO1xuICAgIH1cblxuICAgIGJvZHlPclBhcmFtcyA9IHtcbiAgICAgIGJvZHk6IHJlcS5ib2R5LFxuICAgIH07XG4gIH0gZWxzZSB7XG4gICAgY29uc3QgYm9keSA9IHNob3VsZFVzZU11bHRpcGFydCA/IG11bHRpcGFydEluZm8hLmNsb25lIDogcmVxLmJvZHk7XG5cbiAgICBpZiAoc2hvdWxkVXNlQm9keSkge1xuICAgICAgYm9keU9yUGFyYW1zID0ge1xuICAgICAgICBib2R5LFxuICAgICAgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgcGFyYW1zID0gT2JqZWN0LmtleXMocmVxLmJvZHkpLnJlZHVjZSgob2JqOiBhbnksIHBhcmFtKSA9PiB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gKHJlcS5ib2R5IGFzIGFueSlbcGFyYW1dO1xuICAgICAgICBvYmpbcGFyYW1dID0gc2hvdWxkU3RyaW5naWZ5KHBhcmFtKSA/IEpTT04uc3RyaW5naWZ5KHZhbHVlKSA6IHZhbHVlO1xuICAgICAgICByZXR1cm4gb2JqO1xuICAgICAgfSwge30pO1xuXG4gICAgICBib2R5T3JQYXJhbXMgPSB7cGFyYW1zOiBwYXJhbXN9O1xuICAgIH1cbiAgfVxuXG4gIGlmIChzaG91bGRVc2VNdWx0aXBhcnQgJiYgc2hvdWxkVXNlQm9keSkge1xuICAgIGNvbnN0IGZvcm0gPSBuZXcgRm9ybURhdGEoKTtcblxuICAgIGZvcm0uYXBwZW5kKCdvcGVyYXRpb25zJywgSlNPTi5zdHJpbmdpZnkoKGJvZHlPclBhcmFtcyBhcyBhbnkpLmJvZHkpKTtcblxuICAgIGNvbnN0IG1hcDogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9O1xuICAgIGNvbnN0IGZpbGVzID0gbXVsdGlwYXJ0SW5mbyEuZmlsZXM7XG5cbiAgICBsZXQgaSA9IDA7XG4gICAgZmlsZXMuZm9yRWFjaCgocGF0aHMpID0+IHtcbiAgICAgIG1hcFsrK2ldID0gcGF0aHM7XG4gICAgfSk7XG5cbiAgICBmb3JtLmFwcGVuZCgnbWFwJywgSlNPTi5zdHJpbmdpZnkobWFwKSk7XG5cbiAgICBpID0gMDtcbiAgICBmaWxlcy5mb3JFYWNoKChfLCBmaWxlKSA9PiB7XG4gICAgICBmb3JtLmFwcGVuZCgrK2kgKyAnJywgZmlsZSwgZmlsZS5uYW1lKTtcbiAgICB9KTtcblxuICAgIChib2R5T3JQYXJhbXMgYXMgYW55KS5ib2R5ID0gZm9ybTtcbiAgfVxuXG4gIC8vIGNyZWF0ZSBhIHJlcXVlc3RcbiAgcmV0dXJuIGh0dHBDbGllbnQucmVxdWVzdDxPYmplY3Q+KHJlcS5tZXRob2QsIHJlcS51cmwsIHtcbiAgICBvYnNlcnZlOiAncmVzcG9uc2UnLFxuICAgIHJlc3BvbnNlVHlwZTogJ2pzb24nLFxuICAgIHJlcG9ydFByb2dyZXNzOiBmYWxzZSxcbiAgICAuLi5ib2R5T3JQYXJhbXMsXG4gICAgLi4ucmVxLm9wdGlvbnMsXG4gIH0pO1xufTtcblxuZXhwb3J0IGNvbnN0IG1lcmdlSGVhZGVycyA9IChcbiAgc291cmNlOiBIdHRwSGVhZGVycyxcbiAgZGVzdGluYXRpb246IEh0dHBIZWFkZXJzLFxuKTogSHR0cEhlYWRlcnMgPT4ge1xuICBpZiAoc291cmNlICYmIGRlc3RpbmF0aW9uKSB7XG4gICAgY29uc3QgbWVyZ2VkID0gZGVzdGluYXRpb25cbiAgICAgIC5rZXlzKClcbiAgICAgIC5yZWR1Y2UoXG4gICAgICAgIChoZWFkZXJzLCBuYW1lKSA9PiBoZWFkZXJzLnNldChuYW1lLCBkZXN0aW5hdGlvbi5nZXRBbGwobmFtZSkpLFxuICAgICAgICBzb3VyY2UsXG4gICAgICApO1xuXG4gICAgcmV0dXJuIG1lcmdlZDtcbiAgfVxuXG4gIHJldHVybiBkZXN0aW5hdGlvbiB8fCBzb3VyY2U7XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gcHJpb3JpdGl6ZTxUPiguLi52YWx1ZXM6IFRbXSk6IFQge1xuICBjb25zdCBwaWNrZWQgPSB2YWx1ZXMuZmluZCgodmFsKSA9PiB0eXBlb2YgdmFsICE9PSAndW5kZWZpbmVkJyk7XG5cbiAgaWYgKHR5cGVvZiBwaWNrZWQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgcmV0dXJuIHZhbHVlc1t2YWx1ZXMubGVuZ3RoIC0gMV07XG4gIH1cblxuICByZXR1cm4gcGlja2VkO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlSGVhZGVyc1dpdGhDbGllbnRBd2FyZW5lc3MoY29udGV4dDogUmVjb3JkPHN0cmluZywgYW55Pikge1xuICAvLyBgYXBvbGxvZ3JhcGhxbC1jbGllbnQtKmAgaGVhZGVycyBhcmUgYXV0b21hdGljYWxseSBzZXQgaWYgYVxuICAvLyBgY2xpZW50QXdhcmVuZXNzYCBvYmplY3QgaXMgZm91bmQgaW4gdGhlIGNvbnRleHQuIFRoZXNlIGhlYWRlcnMgYXJlXG4gIC8vIHNldCBmaXJzdCwgZm9sbG93ZWQgYnkgdGhlIHJlc3Qgb2YgdGhlIGhlYWRlcnMgcHVsbGVkIGZyb21cbiAgLy8gYGNvbnRleHQuaGVhZGVyc2AuXG4gIGxldCBoZWFkZXJzID1cbiAgICBjb250ZXh0LmhlYWRlcnMgJiYgY29udGV4dC5oZWFkZXJzIGluc3RhbmNlb2YgSHR0cEhlYWRlcnNcbiAgICAgID8gY29udGV4dC5oZWFkZXJzXG4gICAgICA6IG5ldyBIdHRwSGVhZGVycyhjb250ZXh0LmhlYWRlcnMpO1xuXG4gIGlmIChjb250ZXh0LmNsaWVudEF3YXJlbmVzcykge1xuICAgIGNvbnN0IHtuYW1lLCB2ZXJzaW9ufSA9IGNvbnRleHQuY2xpZW50QXdhcmVuZXNzO1xuXG4gICAgLy8gSWYgZGVzaXJlZCwgYGFwb2xsb2dyYXBocWwtY2xpZW50LSpgIGhlYWRlcnMgc2V0IGJ5XG4gICAgLy8gdGhlIGBjbGllbnRBd2FyZW5lc3NgIG9iamVjdCBjYW4gYmUgb3ZlcnJpZGRlbiBieVxuICAgIC8vIGBhcG9sbG9ncmFwaHFsLWNsaWVudC0qYCBoZWFkZXJzIHNldCBpbiBgY29udGV4dC5oZWFkZXJzYC5cblxuICAgIGlmIChuYW1lICYmICFoZWFkZXJzLmhhcygnYXBvbGxvZ3JhcGhxbC1jbGllbnQtbmFtZScpKSB7XG4gICAgICBoZWFkZXJzID0gaGVhZGVycy5zZXQoJ2Fwb2xsb2dyYXBocWwtY2xpZW50LW5hbWUnLCBuYW1lKTtcbiAgICB9XG5cbiAgICBpZiAodmVyc2lvbiAmJiAhaGVhZGVycy5oYXMoJ2Fwb2xsb2dyYXBocWwtY2xpZW50LXZlcnNpb24nKSkge1xuICAgICAgaGVhZGVycyA9IGhlYWRlcnMuc2V0KCdhcG9sbG9ncmFwaHFsLWNsaWVudC12ZXJzaW9uJywgdmVyc2lvbik7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGhlYWRlcnM7XG59XG4iXX0=