UNPKG

apollo-angular

Version:

Use your GraphQL data in your Angular app, with the Apollo Client

107 lines 16.1 kB
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=