apollo-angular
Version:
Use your GraphQL data in your Angular app, with the Apollo Client
102 lines • 15.6 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')));
}
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, Object.assign(Object.assign({ 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 createHeadersWithClientAwereness(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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiL3dvcmtzcGFjZXMvYXBvbGxvLWFuZ3VsYXIvcGFja2FnZXMvYXBvbGxvLWFuZ3VsYXIvaHR0cC9zcmMvIiwic291cmNlcyI6WyJ1dGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsV0FBVyxFQUEyQixNQUFNLHNCQUFzQixDQUFDO0FBQzNFLE9BQU8sRUFBQyxVQUFVLEVBQUMsTUFBTSxNQUFNLENBQUM7QUFJaEMsTUFBTSxDQUFDLE1BQU0sS0FBSyxHQUFHLENBQ25CLEdBQVksRUFDWixVQUFzQixFQUN0QixZQUEwQixFQUNRLEVBQUU7SUFDcEMsTUFBTSxhQUFhLEdBQ2pCLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxPQUFPLENBQUMsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxXQUFXLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0lBQ3BFLE1BQU0sZUFBZSxHQUFHLENBQUMsS0FBYSxFQUFFLEVBQUUsQ0FDeEMsQ0FBQyxXQUFXLEVBQUUsWUFBWSxDQUFDLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxXQUFXLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0lBQ2xFLE1BQU0sVUFBVSxHQUFJLEdBQUcsQ0FBQyxJQUFlLENBQUMsTUFBTSxDQUFDO0lBQy9DLElBQUksa0JBQWtCLEdBQUcsR0FBRyxDQUFDLE9BQU8sSUFBSSxHQUFHLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQztJQUNqRSxJQUFJLGFBR0gsQ0FBQztJQUVGLElBQUksa0JBQWtCLEVBQUU7UUFDdEIsSUFBSSxVQUFVLEVBQUU7WUFDZCxPQUFPLElBQUksVUFBVSxDQUFDLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FDakMsUUFBUSxDQUFDLEtBQUssQ0FDWixJQUFJLEtBQUssQ0FBQywwREFBMEQsQ0FBQyxDQUN0RSxDQUNGLENBQUM7U0FDSDtRQUVELElBQUksQ0FBQyxhQUFhLEVB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RCxDQUFDLENBQUMsT0FBTyxDQUFDLE9BQU87UUFDakIsQ0FBQyxDQUFDLElBQUksV0FBVyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUV2QyxJQUFJLE9BQU8sQ0FBQyxlQUFlLEVBQUU7UUFDM0IsTUFBTSxFQUFDLElBQUksRUFBRSxPQUFPLEVBQUMsR0FBRyxPQUFPLENBQUMsZUFBZSxDQUFDO1FBRWhELHNEQUFzRDtRQUN0RCxvREFBb0Q7UUFDcEQsNkRBQTZEO1FBRTdELElBQUksSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQywyQkFBMkIsQ0FBQyxFQUFFO1lBQ3JELE9BQU8sR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLDJCQUEyQixFQUFFLElBQUksQ0FBQyxDQUFDO1NBQzFEO1FBRUQsSUFBSSxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLDhCQUE4QixDQUFDLEVBQUU7WUFDM0QsT0FBTyxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsOEJBQThCLEVBQUUsT0FBTyxDQUFDLENBQUM7U0FDaEU7S0FDRjtJQUVELE9BQU8sT0FBTyxDQUFDO0FBQ2pCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0h0dHBIZWFkZXJzLCBIdHRwUmVzcG9uc2UsIEh0dHBDbGllbnR9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcbmltcG9ydCB7T2JzZXJ2YWJsZX0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7UmVxdWVzdCwgQm9keSwgRXh0cmFjdEZpbGVzfSBmcm9tICcuL3R5cGVzJztcblxuZXhwb3J0IGNvbnN0IGZldGNoID0gKFxuICByZXE6IFJlcXVlc3QsXG4gIGh0dHBDbGllbnQ6IEh0dHBDbGllbnQsXG4gIGV4dHJhY3RGaWxlczogRXh0cmFjdEZpbGVzLFxuKTogT2JzZXJ2YWJsZTxIdHRwUmVzcG9uc2U8T2JqZWN0Pj4gPT4ge1xuICBjb25zdCBzaG91bGRVc2VCb2R5ID1cbiAgICBbJ1BPU1QnLCAnUFVUJywgJ1BBVENIJ10uaW5kZXhPZihyZXEubWV0aG9kLnRvVXBwZXJDYXNlKCkpICE9PSAtMTtcbiAgY29uc3Qgc2hvdWxkU3RyaW5naWZ5ID0gKHBhcmFtOiBzdHJpbmcpID0+XG4gICAgWyd2YXJpYWJsZXMnLCAnZXh0ZW5zaW9ucyddLmluZGV4T2YocGFyYW0udG9Mb3dlckNhc2UoKSkgIT09IC0xO1xuICBjb25zdCBpc0JhdGNoaW5nID0gKHJlcS5ib2R5IGFzIEJvZHlbXSkubGVuZ3RoO1xuICBsZXQgc2hvdWxkVXNlTXVsdGlwYXJ0ID0gcmVxLm9wdGlvbnMgJiYgcmVxLm9wdGlvbnMudXNlTXVsdGlwYXJ0O1xuICBsZXQgbXVsdGlwYXJ0SW5mbzoge1xuICAgIGNsb25lOiBCb2R5O1xuICAgIGZpbGVzOiBNYXA8YW55LCBhbnk+O1xuICB9O1xuXG4gIGlmIChzaG91bGRVc2VNdWx0aXBhcnQpIHtcbiAgICBpZiAoaXNCYXRjaGluZykge1xuICAgICAgcmV0dXJuIG5ldyBPYnNlcnZhYmxlKChvYnNlcnZlcikgPT5cbiAgICAgICAgb2JzZXJ2ZXIuZXJyb3IoXG4gICAgICAgICAgbmV3IEVycm9yKCdGaWxlIHVwbG9hZCBpcyBub3QgYXZhaWxhYmxlIHdoZW4gY29tYmluZWQgd2l0aCBCYXRjaGluZycpLFxuICAgICAgICApLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoIXNob3VsZFVzZUJvZHkpIHtcbiAgICAgIHJldHVybiBuZXcgT2JzZXJ2YWJsZSgob2JzZXJ2ZXIpID0+XG4gICAgICAgIG9ic2VydmVyLmVycm9yKFxuICAgICAgICAgIG5ldyBFcnJvcignRmlsZSB1cGxvYWQgaXMgbm90IGF2YWlsYWJsZSB3aGVuIEdFVCBpcyB1c2VkJyksXG4gICAgICAgICksXG4gICAgICApO1xuICAgIH1cblxuICAgIG11bHRpcGFydEluZm8gPSBleHRyYWN0RmlsZXMocmVxLmJvZHkpO1xuXG4gICAgc2hvdWxkVXNlTXVsdGlwYXJ0ID0gISFtdWx0aXBhcnRJbmZvLmZpbGVzLnNpemU7XG4gIH1cblxuICAvLyBgYm9keWAgZm9yIHNvbWUsIGBwYXJhbXNgIGZvciBvdGhlcnNcbiAgbGV0IGJvZHlPclBhcmFtcyA9IHt9O1xuXG4gIGlmIChpc0JhdGNoaW5nKSB7XG4gICAgaWYgKCFzaG91bGRVc2VCb2R5KSB7XG4gICAgICByZXR1cm4gbmV3IE9ic2VydmFibGUoKG9ic2VydmVyKSA9PlxuICAgICAgICBvYnNlcnZlci5lcnJvcihuZXcgRXJyb3IoJ0JhdGNoaW5nIGlzIG5vdCBhdmFpbGFibGUgZm9yIEdFVCByZXF1ZXN0cycpKSxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgYm9keU9yUGFyYW1zID0ge1xuICAgICAgYm9keTogcmVxLmJvZHksXG4gICAgfTtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBib2R5ID0gc2hvdWxkVXNlTXVsdGlwYXJ0ID8gbXVsdGlwYXJ0SW5mbyEuY2xvbmUgOiByZXEuYm9keTtcblxuICAgIGlmIChzaG91bGRVc2VCb2R5KSB7XG4gICAgICBib2R5T3JQYXJhbXMgPSB7XG4gICAgICAgIGJvZHksXG4gICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBwYXJhbXMgPSBPYmplY3Qua2V5cyhyZXEuYm9keSkucmVkdWNlKChvYmo6IGFueSwgcGFyYW0pID0+IHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSAocmVxLmJvZHkgYXMgYW55KVtwYXJhbV07XG4gICAgICAgIG9ialtwYXJhbV0gPSBzaG91bGRTdHJpbmdpZnkocGFyYW0pID8gSlNPTi5zdHJpbmdpZnkodmFsdWUpIDogdmFsdWU7XG4gICAgICAgIHJldHVybiBvYmo7XG4gICAgICB9LCB7fSk7XG5cbiAgICAgIGJvZHlPclBhcmFtcyA9IHtwYXJhbXM6IHBhcmFtc307XG4gICAgfVxuICB9XG5cbiAgaWYgKHNob3VsZFVzZU11bHRpcGFydCAmJiBzaG91bGRVc2VCb2R5KSB7XG4gICAgY29uc3QgZm9ybSA9IG5ldyBGb3JtRGF0YSgpO1xuXG4gICAgZm9ybS5hcHBlbmQoJ29wZXJhdGlvbnMnLCBKU09OLnN0cmluZ2lmeSgoYm9keU9yUGFyYW1zIGFzIGFueSkuYm9keSkpO1xuXG4gICAgY29uc3QgbWFwOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge307XG4gICAgY29uc3QgZmlsZXMgPSBtdWx0aXBhcnRJbmZvIS5maWxlcztcblxuICAgIGxldCBpID0gMDtcbiAgICBmaWxlcy5mb3JFYWNoKChwYXRocykgPT4ge1xuICAgICAgbWFwWysraV0gPSBwYXRocztcbiAgICB9KTtcblxuICAgIGZvcm0uYXBwZW5kKCdtYXAnLCBKU09OLnN0cmluZ2lmeShtYXApKTtcblxuICAgIGkgPSAwO1xuICAgIGZpbGVzLmZvckVhY2goKF8sIGZpbGUpID0+IHtcbiAgICAgIGZvcm0uYXBwZW5kKCsraSArICcnLCBmaWxlLCBmaWxlLm5hbWUpO1xuICAgIH0pO1xuXG4gICAgKGJvZHlPclBhcmFtcyBhcyBhbnkpLmJvZHkgPSBmb3JtO1xuICB9XG5cbiAgLy8gY3JlYXRlIGEgcmVxdWVzdFxuICByZXR1cm4gaHR0cENsaWVudC5yZXF1ZXN0PE9iamVjdD4ocmVxLm1ldGhvZCwgcmVxLnVybCwge1xuICAgIG9ic2VydmU6ICdyZXNwb25zZScsXG4gICAgcmVzcG9uc2VUeXBlOiAnanNvbicsXG4gICAgcmVwb3J0UHJvZ3Jlc3M6IGZhbHNlLFxuICAgIC4uLmJvZHlPclBhcmFtcyxcbiAgICAuLi5yZXEub3B0aW9ucyxcbiAgfSk7XG59O1xuXG5leHBvcnQgY29uc3QgbWVyZ2VIZWFkZXJzID0gKFxuICBzb3VyY2U6IEh0dHBIZWFkZXJzLFxuICBkZXN0aW5hdGlvbjogSHR0cEhlYWRlcnMsXG4pOiBIdHRwSGVhZGVycyA9PiB7XG4gIGlmIChzb3VyY2UgJiYgZGVzdGluYXRpb24pIHtcbiAgICBjb25zdCBtZXJnZWQgPSBkZXN0aW5hdGlvblxuICAgICAgLmtleXMoKVxuICAgICAgLnJlZHVjZShcbiAgICAgICAgKGhlYWRlcnMsIG5hbWUpID0+IGhlYWRlcnMuc2V0KG5hbWUsIGRlc3RpbmF0aW9uLmdldEFsbChuYW1lKSksXG4gICAgICAgIHNvdXJjZSxcbiAgICAgICk7XG5cbiAgICByZXR1cm4gbWVyZ2VkO1xuICB9XG5cbiAgcmV0dXJuIGRlc3RpbmF0aW9uIHx8IHNvdXJjZTtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBwcmlvcml0aXplPFQ+KC4uLnZhbHVlczogVFtdKTogVCB7XG4gIGNvbnN0IHBpY2tlZCA9IHZhbHVlcy5maW5kKCh2YWwpID0+IHR5cGVvZiB2YWwgIT09ICd1bmRlZmluZWQnKTtcblxuICBpZiAodHlwZW9mIHBpY2tlZCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICByZXR1cm4gdmFsdWVzW3ZhbHVlcy5sZW5ndGggLSAxXTtcbiAgfVxuXG4gIHJldHVybiBwaWNrZWQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVIZWFkZXJzV2l0aENsaWVudEF3ZXJlbmVzcyhjb250ZXh0OiBSZWNvcmQ8c3RyaW5nLCBhbnk+KSB7XG4gIC8vIGBhcG9sbG9ncmFwaHFsLWNsaWVudC0qYCBoZWFkZXJzIGFyZSBhdXRvbWF0aWNhbGx5IHNldCBpZiBhXG4gIC8vIGBjbGllbnRBd2FyZW5lc3NgIG9iamVjdCBpcyBmb3VuZCBpbiB0aGUgY29udGV4dC4gVGhlc2UgaGVhZGVycyBhcmVcbiAgLy8gc2V0IGZpcnN0LCBmb2xsb3dlZCBieSB0aGUgcmVzdCBvZiB0aGUgaGVhZGVycyBwdWxsZWQgZnJvbVxuICAvLyBgY29udGV4dC5oZWFkZXJzYC5cbiAgbGV0IGhlYWRlcnMgPVxuICAgIGNvbnRleHQuaGVhZGVycyAmJiBjb250ZXh0LmhlYWRlcnMgaW5zdGFuY2VvZiBIdHRwSGVhZGVyc1xuICAgICAgPyBjb250ZXh0LmhlYWRlcnNcbiAgICAgIDogbmV3IEh0dHBIZWFkZXJzKGNvbnRleHQuaGVhZGVycyk7XG5cbiAgaWYgKGNvbnRleHQuY2xpZW50QXdhcmVuZXNzKSB7XG4gICAgY29uc3Qge25hbWUsIHZlcnNpb259ID0gY29udGV4dC5jbGllbnRBd2FyZW5lc3M7XG5cbiAgICAvLyBJZiBkZXNpcmVkLCBgYXBvbGxvZ3JhcGhxbC1jbGllbnQtKmAgaGVhZGVycyBzZXQgYnlcbiAgICAvLyB0aGUgYGNsaWVudEF3YXJlbmVzc2Agb2JqZWN0IGNhbiBiZSBvdmVycmlkZGVuIGJ5XG4gICAgLy8gYGFwb2xsb2dyYXBocWwtY2xpZW50LSpgIGhlYWRlcnMgc2V0IGluIGBjb250ZXh0LmhlYWRlcnNgLlxuXG4gICAgaWYgKG5hbWUgJiYgIWhlYWRlcnMuaGFzKCdhcG9sbG9ncmFwaHFsLWNsaWVudC1uYW1lJykpIHtcbiAgICAgIGhlYWRlcnMgPSBoZWFkZXJzLnNldCgnYXBvbGxvZ3JhcGhxbC1jbGllbnQtbmFtZScsIG5hbWUpO1xuICAgIH1cblxuICAgIGlmICh2ZXJzaW9uICYmICFoZWFkZXJzLmhhcygnYXBvbGxvZ3JhcGhxbC1jbGllbnQtdmVyc2lvbicpKSB7XG4gICAgICBoZWFkZXJzID0gaGVhZGVycy5zZXQoJ2Fwb2xsb2dyYXBocWwtY2xpZW50LXZlcnNpb24nLCB2ZXJzaW9uKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gaGVhZGVycztcbn1cbiJdfQ==