apollo-angular
Version:
Use your GraphQL data in your Angular app, with the Apollo Client
107 lines • 16.1 kB
JavaScript
import { Observable } from 'rxjs';
import { HttpHeaders } from '@angular/common/http';
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) {
return values.find(val => typeof val !== 'undefined');
}
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9odHRwL3NyYy91dGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ2xDLE9BQU8sRUFBYyxXQUFXLEVBQWdCLE1BQU0sc0JBQXNCLENBQUM7QUFHN0UsTUFBTSxDQUFDLE1BQU0sS0FBSyxHQUFHLENBQ25CLEdBQVksRUFDWixVQUFzQixFQUN0QixZQUEyQixFQUNPLEVBQUU7SUFDcEMsTUFBTSxhQUFhLEdBQUcsQ0FBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLE9BQU8sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLFdBQVcsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7SUFDeEYsTUFBTSxlQUFlLEdBQUcsQ0FBQyxLQUFhLEVBQUUsRUFBRSxDQUN4QyxDQUFDLFdBQVcsRUFBRSxZQUFZLENBQUMsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLFdBQVcsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7SUFDbEUsTUFBTSxVQUFVLEdBQUksR0FBRyxDQUFDLElBQWUsQ0FBQyxNQUFNLENBQUM7SUFDL0MsSUFBSSxrQkFBa0IsR0FBRyxHQUFHLENBQUMsT0FBTyxJQUFJLEdBQUcsQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDO0lBQ2pFLElBQUksYUFHSCxDQUFDO0lBRUYsSUFBSSxrQkFBa0IsRUFBRSxDQUFDO1FBQ3ZCLElBQUksVUFBVSxFQUFFLENBQUM7WUFDZixPQUFPLElBQUksVUFBVSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQy9CLFFBQVEsQ0FBQyxLQUFLLENBQUMsSUFBSSxLQUFLLENBQUMsMERBQTBELENBQUMsQ0FBQyxDQUN0RixDQUFDO1FBQ0osQ0FBQztRQUVELElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUNuQixPQUFPLElBQUksVUFBVSxDQUFD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cUJBQXFCO0lBQ3JCLElBQUksT0FBTyxHQUNULE9BQU8sQ0FBQyxPQUFPLElBQUksT0FBTyxDQUFDLE9BQU8sWUFBWSxXQUFXO1FBQ3ZELENBQUMsQ0FBQyxPQUFPLENBQUMsT0FBTztRQUNqQixDQUFDLENBQUMsSUFBSSxXQUFXLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBRXZDLElBQUksT0FBTyxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQzVCLE1BQU0sRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLEdBQUcsT0FBTyxDQUFDLGVBQWUsQ0FBQztRQUVsRCxzREFBc0Q7UUFDdEQsb0RBQW9EO1FBQ3BELDZEQUE2RDtRQUU3RCxJQUFJLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsMkJBQTJCLENBQUMsRUFBRSxDQUFDO1lBQ3RELE9BQU8sR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLDJCQUEyQixFQUFFLElBQUksQ0FBQyxDQUFDO1FBQzNELENBQUM7UUFFRCxJQUFJLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsOEJBQThCLENBQUMsRUFBRSxDQUFDO1lBQzVELE9BQU8sR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLDhCQUE4QixFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQ2pFLENBQUM7SUFDSCxDQUFDO0lBRUQsT0FBTyxPQUFPLENBQUM7QUFDakIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IEh0dHBDbGllbnQsIEh0dHBIZWFkZXJzLCBIdHRwUmVzcG9uc2UgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XG5pbXBvcnQgeyBCb2R5LCBFeHRyYWN0RmlsZXMsIFJlcXVlc3QgfSBmcm9tICcuL3R5cGVzJztcblxuZXhwb3J0IGNvbnN0IGZldGNoID0gKFxuICByZXE6IFJlcXVlc3QsXG4gIGh0dHBDbGllbnQ6IEh0dHBDbGllbnQsXG4gIGV4dHJhY3RGaWxlcz86IEV4dHJhY3RGaWxlcyxcbik6IE9ic2VydmFibGU8SHR0cFJlc3BvbnNlPE9iamVjdD4+ID0+IHtcbiAgY29uc3Qgc2hvdWxkVXNlQm9keSA9IFsnUE9TVCcsICdQVVQnLCAnUEFUQ0gnXS5pbmRleE9mKHJlcS5tZXRob2QudG9VcHBlckNhc2UoKSkgIT09IC0xO1xuICBjb25zdCBzaG91bGRTdHJpbmdpZnkgPSAocGFyYW06IHN0cmluZykgPT5cbiAgICBbJ3ZhcmlhYmxlcycsICdleHRlbnNpb25zJ10uaW5kZXhPZihwYXJhbS50b0xvd2VyQ2FzZSgpKSAhPT0gLTE7XG4gIGNvbnN0IGlzQmF0Y2hpbmcgPSAocmVxLmJvZHkgYXMgQm9keVtdKS5sZW5ndGg7XG4gIGxldCBzaG91bGRVc2VNdWx0aXBhcnQgPSByZXEub3B0aW9ucyAmJiByZXEub3B0aW9ucy51c2VNdWx0aXBhcnQ7XG4gIGxldCBtdWx0aXBhcnRJbmZvOiB7XG4gICAgY2xvbmU6IEJvZHk7XG4gICAgZmlsZXM6IE1hcDxhbnksIGFueT47XG4gIH07XG5cbiAgaWYgKHNob3VsZFVzZU11bHRpcGFydCkge1xuICAgIGlmIChpc0JhdGNoaW5nKSB7XG4gICAgICByZXR1cm4gbmV3IE9ic2VydmFibGUob2JzZXJ2ZXIgPT5cbiAgICAgICAgb2JzZXJ2ZXIuZXJyb3IobmV3IEVycm9yKCdGaWxlIHVwbG9hZCBpcyBub3QgYXZhaWxhYmxlIHdoZW4gY29tYmluZWQgd2l0aCBCYXRjaGluZycpKSxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKCFzaG91bGRVc2VCb2R5KSB7XG4gICAgICByZXR1cm4gbmV3IE9ic2VydmFibGUob2JzZXJ2ZXIgPT5cbiAgICAgICAgb2JzZXJ2ZXIuZXJyb3IobmV3IEVycm9yKCdGaWxlIHVwbG9hZCBpcyBub3QgYXZhaWxhYmxlIHdoZW4gR0VUIGlzIHVzZWQnKSksXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmICghZXh0cmFjdEZpbGVzKSB7XG4gICAgICByZXR1cm4gbmV3IE9ic2VydmFibGUob2JzZXJ2ZXIgPT5cbiAgICAgICAgb2JzZXJ2ZXIuZXJyb3IoXG4gICAgICAgICAgbmV3IEVycm9yKFxuICAgICAgICAgICAgYFRvIHVzZSBGaWxlIHVwbG9hZCB5b3UgbmVlZCB0byBwYXNzIFwiZXh0cmFjdEZpbGVzXCIgZnVuY3Rpb24gZnJvbSBcImV4dHJhY3QtZmlsZXNcIiBsaWJyYXJ5IHRvIEh0dHBMaW5rJ3Mgb3B0aW9uc2AsXG4gICAgICAgICAgKSxcbiAgICAgICAgKSxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgbXVsdGlwYXJ0SW5mbyA9IGV4dHJhY3RGaWxlcyhyZXEuYm9keSk7XG5cbiAgICBzaG91bGRVc2VNdWx0aXBhcnQgPSAhIW11bHRpcGFydEluZm8uZmlsZXMuc2l6ZTtcbiAgfVxuXG4gIC8vIGBib2R5YCBmb3Igc29tZSwgYHBhcmFtc2AgZm9yIG90aGVyc1xuICBsZXQgYm9keU9yUGFyYW1zID0ge307XG5cbiAgaWYgKGlzQmF0Y2hpbmcpIHtcbiAgICBpZiAoIXNob3VsZFVzZUJvZHkpIHtcbiAgICAgIHJldHVybiBuZXcgT2JzZXJ2YWJsZShvYnNlcnZlciA9PlxuICAgICAgICBvYnNlcnZlci5lcnJvcihuZXcgRXJyb3IoJ0JhdGNoaW5nIGlzIG5vdCBhdmFpbGFibGUgZm9yIEdFVCByZXF1ZXN0cycpKSxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgYm9keU9yUGFyYW1zID0ge1xuICAgICAgYm9keTogcmVxLmJvZHksXG4gICAgfTtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBib2R5ID0gc2hvdWxkVXNlTXVsdGlwYXJ0ID8gbXVsdGlwYXJ0SW5mbyEuY2xvbmUgOiByZXEuYm9keTtcblxuICAgIGlmIChzaG91bGRVc2VCb2R5KSB7XG4gICAgICBib2R5T3JQYXJhbXMgPSB7XG4gICAgICAgIGJvZHksXG4gICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBwYXJhbXMgPSBPYmplY3Qua2V5cyhyZXEuYm9keSkucmVkdWNlKChvYmo6IGFueSwgcGFyYW0pID0+IHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSAocmVxLmJvZHkgYXMgYW55KVtwYXJhbV07XG4gICAgICAgIG9ialtwYXJhbV0gPSBzaG91bGRTdHJpbmdpZnkocGFyYW0pID8gSlNPTi5zdHJpbmdpZnkodmFsdWUpIDogdmFsdWU7XG4gICAgICAgIHJldHVybiBvYmo7XG4gICAgICB9LCB7fSk7XG5cbiAgICAgIGJvZHlPclBhcmFtcyA9IHsgcGFyYW1zOiBwYXJhbXMgfTtcbiAgICB9XG4gIH1cblxuICBpZiAoc2hvdWxkVXNlTXVsdGlwYXJ0ICYmIHNob3VsZFVzZUJvZHkpIHtcbiAgICBjb25zdCBmb3JtID0gbmV3IEZvcm1EYXRhKCk7XG5cbiAgICBmb3JtLmFwcGVuZCgnb3BlcmF0aW9ucycsIEpTT04uc3RyaW5naWZ5KChib2R5T3JQYXJhbXMgYXMgYW55KS5ib2R5KSk7XG5cbiAgICBjb25zdCBtYXA6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fTtcbiAgICBjb25zdCBmaWxlcyA9IG11bHRpcGFydEluZm8hLmZpbGVzO1xuXG4gICAgbGV0IGkgPSAwO1xuICAgIGZpbGVzLmZvckVhY2gocGF0aHMgPT4ge1xuICAgICAgbWFwWysraV0gPSBwYXRocztcbiAgICB9KTtcblxuICAgIGZvcm0uYXBwZW5kKCdtYXAnLCBKU09OLnN0cmluZ2lmeShtYXApKTtcblxuICAgIGkgPSAwO1xuICAgIGZpbGVzLmZvckVhY2goKF8sIGZpbGUpID0+IHtcbiAgICAgIGZvcm0uYXBwZW5kKCsraSArICcnLCBmaWxlLCBmaWxlLm5hbWUpO1xuICAgIH0pO1xuXG4gICAgKGJvZHlPclBhcmFtcyBhcyBhbnkpLmJvZHkgPSBmb3JtO1xuICB9XG5cbiAgLy8gY3JlYXRlIGEgcmVxdWVzdFxuICByZXR1cm4gaHR0cENsaWVudC5yZXF1ZXN0PE9iamVjdD4ocmVxLm1ldGhvZCwgcmVxLnVybCwge1xuICAgIG9ic2VydmU6ICdyZXNwb25zZScsXG4gICAgcmVzcG9uc2VUeXBlOiAnanNvbicsXG4gICAgcmVwb3J0UHJvZ3Jlc3M6IGZhbHNlLFxuICAgIC4uLmJvZHlPclBhcmFtcyxcbiAgICAuLi5yZXEub3B0aW9ucyxcbiAgfSk7XG59O1xuXG5leHBvcnQgY29uc3QgbWVyZ2VIZWFkZXJzID0gKFxuICBzb3VyY2U6IEh0dHBIZWFkZXJzIHwgdW5kZWZpbmVkLFxuICBkZXN0aW5hdGlvbjogSHR0cEhlYWRlcnMsXG4pOiBIdHRwSGVhZGVycyA9PiB7XG4gIGlmIChzb3VyY2UgJiYgZGVzdGluYXRpb24pIHtcbiAgICBjb25zdCBtZXJnZWQgPSBkZXN0aW5hdGlvblxuICAgICAgLmtleXMoKVxuICAgICAgLnJlZHVjZSgoaGVhZGVycywgbmFtZSkgPT4gaGVhZGVycy5zZXQobmFtZSwgZGVzdGluYXRpb24uZ2V0QWxsKG5hbWUpISksIHNvdXJjZSk7XG5cbiAgICByZXR1cm4gbWVyZ2VkO1xuICB9XG5cbiAgcmV0dXJuIGRlc3RpbmF0aW9uIHx8IHNvdXJjZTtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBwcmlvcml0aXplPFQ+KFxuICAuLi52YWx1ZXM6IFtOb25OdWxsYWJsZTxUPiwgLi4uVFtdXSB8IFsuLi5UW10sIE5vbk51bGxhYmxlPFQ+XVxuKTogTm9uTnVsbGFibGU8VD4ge1xuICByZXR1cm4gdmFsdWVzLmZpbmQodmFsID0+IHR5cGVvZiB2YWwgIT09ICd1bmRlZmluZWQnKSBhcyBOb25OdWxsYWJsZTxUPjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUhlYWRlcnNXaXRoQ2xpZW50QXdhcmVuZXNzKGNvbnRleHQ6IFJlY29yZDxzdHJpbmcsIGFueT4pIHtcbiAgLy8gYGFwb2xsb2dyYXBocWwtY2xpZW50LSpgIGhlYWRlcnMgYXJlIGF1dG9tYXRpY2FsbHkgc2V0IGlmIGFcbiAgLy8gYGNsaWVudEF3YXJlbmVzc2Agb2JqZWN0IGlzIGZvdW5kIGluIHRoZSBjb250ZXh0LiBUaGVzZSBoZWFkZXJzIGFyZVxuICAvLyBzZXQgZmlyc3QsIGZvbGxvd2VkIGJ5IHRoZSByZXN0IG9mIHRoZSBoZWFkZXJzIHB1bGxlZCBmcm9tXG4gIC8vIGBjb250ZXh0LmhlYWRlcnNgLlxuICBsZXQgaGVhZGVycyA9XG4gICAgY29udGV4dC5oZWFkZXJzICYmIGNvbnRleHQuaGVhZGVycyBpbnN0YW5jZW9mIEh0dHBIZWFkZXJzXG4gICAgICA/IGNvbnRleHQuaGVhZGVyc1xuICAgICAgOiBuZXcgSHR0cEhlYWRlcnMoY29udGV4dC5oZWFkZXJzKTtcblxuICBpZiAoY29udGV4dC5jbGllbnRBd2FyZW5lc3MpIHtcbiAgICBjb25zdCB7IG5hbWUsIHZlcnNpb24gfSA9IGNvbnRleHQuY2xpZW50QXdhcmVuZXNzO1xuXG4gICAgLy8gSWYgZGVzaXJlZCwgYGFwb2xsb2dyYXBocWwtY2xpZW50LSpgIGhlYWRlcnMgc2V0IGJ5XG4gICAgLy8gdGhlIGBjbGllbnRBd2FyZW5lc3NgIG9iamVjdCBjYW4gYmUgb3ZlcnJpZGRlbiBieVxuICAgIC8vIGBhcG9sbG9ncmFwaHFsLWNsaWVudC0qYCBoZWFkZXJzIHNldCBpbiBgY29udGV4dC5oZWFkZXJzYC5cblxuICAgIGlmIChuYW1lICYmICFoZWFkZXJzLmhhcygnYXBvbGxvZ3JhcGhxbC1jbGllbnQtbmFtZScpKSB7XG4gICAgICBoZWFkZXJzID0gaGVhZGVycy5zZXQoJ2Fwb2xsb2dyYXBocWwtY2xpZW50LW5hbWUnLCBuYW1lKTtcbiAgICB9XG5cbiAgICBpZiAodmVyc2lvbiAmJiAhaGVhZGVycy5oYXMoJ2Fwb2xsb2dyYXBocWwtY2xpZW50LXZlcnNpb24nKSkge1xuICAgICAgaGVhZGVycyA9IGhlYWRlcnMuc2V0KCdhcG9sbG9ncmFwaHFsLWNsaWVudC12ZXJzaW9uJywgdmVyc2lvbik7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGhlYWRlcnM7XG59XG4iXX0=