UNPKG

apollo-angular

Version:

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

111 lines 16.2 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) { 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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9odHRwL3NyYy91dGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ2xDLE9BQU8sRUFBYyxXQUFXLEVBQWdCLE1BQU0sc0JBQXNCLENBQUM7QUFHN0UsTUFBTSxDQUFDLE1BQU0sS0FBSyxHQUFHLENBQ25CLEdBQVksRUFDWixVQUFzQixFQUN0QixZQUEyQixFQUNPLEVBQUU7SUFDcEMsTUFBTSxhQUFhLEdBQUcsQ0FBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLE9BQU8sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLFdBQVcsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7SUFDeEYsTUFBTSxlQUFlLEdBQUcsQ0FBQyxLQUFhLEVBQUUsRUFBRSxDQUN4QyxDQUFDLFdBQVcsRUFBRSxZQUFZLENBQUMsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLFdBQVcsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7SUFDbEUsTUFBTSxVQUFVLEdBQUksR0FBRyxDQUFDLElBQWUsQ0FBQyxNQUFNLENBQUM7SUFDL0MsSUFBSSxrQkFBa0IsR0FBRyxHQUFHLENBQUMsT0FBTyxJQUFJLEdBQUcsQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDO0lBQ2pFLElBQUksYUFHSCxDQUFDO0lBRUYsSUFBSSxrQkFBa0IsRUFBRTtRQUN0QixJQUFJLFVBQVUsRUFBRTtZQUNkLE9BQU8sSUFBSSxVQUFVLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FDL0IsUUFBUSxDQUFDLEtBQUssQ0FBQyxJQUFJLEtBQUssQ0FBQywwREFBMEQsQ0FBQyxDQUFDLENBQ3RGLENBQUM7U0FDSDtRQUVELElBQUksQ0FBQyxhQUFhLEVBQUU7WUFDbEIsT0FBTyxJQUFJLFVBQVUsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUMvQixRQUFRLENBQUMsS0FBSyxDQUFDLElBQUksS0FBSyxDQUFDLCtDQUErQyxDQUFDLENBQUMsQ0FDM0UsQ0FBQztTQUNIO1FBRUQsSUFBSSxDQUFDLFlBQVksRUFBRTtZQUNqQixPQUFPLElBQUksVUFBVSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQy9CLFFBQVEsQ0FBQyxLQUFLLENBQ1osSUFBSSxLQUFLLENBQ1AsZ0hBQWdILENBQ2pILENBQ0YsQ0FDRixDQUFDO1NBQ0g7UUFFRCxhQUFhLEdBQUcsWUFBWSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUV2QyxrQkFBa0IsR0FBRyxDQUFDLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUM7S0FDakQ7SUFFRCx1Q0FBdUM7SUFDdkMsSUFBSSxZQUFZLEdBQUcsRUFBRSxDQUFDO0lBRXRCLElBQUksVUFBVSxFQUFFO1FBQ2QsSUFBSSxDQUFDLGFBQWEsRUFBRTtZQUNsQixPQUFPLElBQUksVUFBVSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQy9CLFFBQVEsQ0FBQyxLQUFLLENBQUMsSUFBSSxLQUFLLENBQUMsNENBQTRDLENBQUMsQ0FBQyxDQUN4RSxDQUFDO1NBQ0g7UUFFRCxZQUFZLEdBQUc7WUFDYixJQUFJLEVBQUUsR0FBRyxDQUFDLElBQUk7U0FDZixDQUFDO0tBQ0g7U0FBTTtRQUNMLE1BQU0sSUFBSSxHQUFHLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxhQUFjLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDO1FBRWxFLElBQUksYUFBYSxFQUFFO1lBQ2pCLFlBQVksR0FBRztnQkFDYixJQUFJO2FBQ0wsQ0FBQztTQUNIO2FBQU07WUFDTCxNQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFRLEVBQUUsS0FBSyxFQUFFLEVBQUU7Z0JBQzlELE1BQU0sS0FBSyxHQUFJLEdBQUcsQ0FBQyxJQUFZLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQ3ZDLEdBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxlQUFlLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztnQkFDcEUsT0FBTyxHQUFHLENBQUM7WUFDYixDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFFUCxZQUFZLEdBQUcsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLENBQUM7U0FDbkM7S0FDRjtJQUVELElBQUksa0JBQWtCLElBQUksYUFBYSxFQUFFO1FBQ3ZDLE1BQU0sSUFBSSxHQUFHLElBQUksUUFBUSxFQUFFLENBQUM7UUFFNUIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxZQUFZLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBRSxZQUFvQixDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7UUFFdEUsTUFBTSxHQUFHLEdBQXdCLEVBQUUsQ0FBQztRQUNwQyxNQUFNLEtBQUssR0FBRyxhQUFjLENBQUMsS0FBSyxDQUFDO1FBRW5DLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNWLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUU7WUFDcEIsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDO1FBQ25CLENBQUMsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBRXhDLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDTixLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxFQUFFO1lBQ3hCLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDekMsQ0FBQyxDQUFDLENBQUM7UUFFRixZQUFvQixDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7S0FDbkM7SUFFRCxtQkFBbUI7SUFDbkIsT0FBTyxVQUFVLENBQUMsT0FBTyxDQUFTLEdBQUcsQ0FBQyxNQUFNLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRTtRQUNyRCxPQUFPLEVBQUUsVUFBVTtRQUNuQixZQUFZLEVBQUUsTUFBTTtRQUNwQixjQUFjLEVBQUUsS0FBSztRQUNyQixHQUFHLFlBQVk7UUFDZixHQUFHLEdBQUcsQ0FBQyxPQUFPO0tBQ2YsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sWUFBWSxHQUFHLENBQUMsTUFBbUIsRUFBRSxXQUF3QixFQUFlLEVBQUU7SUFDekYsSUFBSSxNQUFNLElBQUksV0FBVyxFQUFFO1FBQ3pCLE1BQU0sTUFBTSxHQUFHLFdBQVc7YUFDdkIsSUFBSSxFQUFFO2FBQ04sTUFBTSxDQUFDLENBQUMsT0FBTyxFQUFFLElBQUksRUFBRSxFQUFFLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsV0FBVyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBRWxGLE9BQU8sTUFBTSxDQUFDO0tBQ2Y7SUFFRCxPQUFPLFdBQVcsSUFBSSxNQUFNLENBQUM7QUFDL0IsQ0FBQyxDQUFDO0FBRUYsTUFBTSxVQUFVLFVBQVUsQ0FBSSxHQUFHLE1BQVc7SUFDMUMsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLE9BQU8sR0FBRyxLQUFLLFdBQVcsQ0FBQyxDQUFDO0lBRTlELElBQUksT0FBTyxNQUFNLEtBQUssV0FBVyxFQUFFO1FBQ2pDLE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7S0FDbEM7SUFFRCxPQUFPLE1BQU0sQ0FBQztBQUNoQixDQUFDO0FBRUQsTUFBTSxVQUFVLGdDQUFnQyxDQUFDLE9BQTRCO0lBQzNFLDhEQUE4RDtJQUM5RCxzRUFBc0U7SUFDdEUsNkRBQTZEO0lBQzdELHFCQUFxQjtJQUNyQixJQUFJLE9BQU8sR0FDVCxPQUFPLENBQUMsT0FBTyxJQUFJLE9BQU8sQ0FBQyxPQUFPLFlBQVksV0FBVztRQUN2RCxDQUFDLENBQUMsT0FBTyxDQUFDLE9BQU87UUFDakIsQ0FBQyxDQUFDLElBQUksV0FBVyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUV2QyxJQUFJLE9BQU8sQ0FBQyxlQUFlLEVBQUU7UUFDM0IsTUFBTSxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsR0FBRyxPQUFPLENBQUMsZUFBZSxDQUFDO1FBRWxELHNEQUFzRDtRQUN0RCxvREFBb0Q7UUFDcEQsNkRBQTZEO1FBRTdELElBQUksSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQywyQkFBMkIsQ0FBQyxFQUFFO1lBQ3JELE9BQU8sR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLDJCQUEyQixFQUFFLElBQUksQ0FBQyxDQUFDO1NBQzFEO1FBRUQsSUFBSSxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLDhCQUE4QixDQUFDLEVBQUU7WUFDM0QsT0FBTyxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsOEJBQThCLEVBQUUsT0FBTyxDQUFDLENBQUM7U0FDaEU7S0FDRjtJQUVELE9BQU8sT0FBTyxDQUFDO0FBQ2pCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBIdHRwQ2xpZW50LCBIdHRwSGVhZGVycywgSHR0cFJlc3BvbnNlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuaW1wb3J0IHsgQm9keSwgRXh0cmFjdEZpbGVzLCBSZXF1ZXN0IH0gZnJvbSAnLi90eXBlcyc7XG5cbmV4cG9ydCBjb25zdCBmZXRjaCA9IChcbiAgcmVxOiBSZXF1ZXN0LFxuICBodHRwQ2xpZW50OiBIdHRwQ2xpZW50LFxuICBleHRyYWN0RmlsZXM/OiBFeHRyYWN0RmlsZXMsXG4pOiBPYnNlcnZhYmxlPEh0dHBSZXNwb25zZTxPYmplY3Q+PiA9PiB7XG4gIGNvbnN0IHNob3VsZFVzZUJvZHkgPSBbJ1BPU1QnLCAnUFVUJywgJ1BBVENIJ10uaW5kZXhPZihyZXEubWV0aG9kLnRvVXBwZXJDYXNlKCkpICE9PSAtMTtcbiAgY29uc3Qgc2hvdWxkU3RyaW5naWZ5ID0gKHBhcmFtOiBzdHJpbmcpID0+XG4gICAgWyd2YXJpYWJsZXMnLCAnZXh0ZW5zaW9ucyddLmluZGV4T2YocGFyYW0udG9Mb3dlckNhc2UoKSkgIT09IC0xO1xuICBjb25zdCBpc0JhdGNoaW5nID0gKHJlcS5ib2R5IGFzIEJvZHlbXSkubGVuZ3RoO1xuICBsZXQgc2hvdWxkVXNlTXVsdGlwYXJ0ID0gcmVxLm9wdGlvbnMgJiYgcmVxLm9wdGlvbnMudXNlTXVsdGlwYXJ0O1xuICBsZXQgbXVsdGlwYXJ0SW5mbzoge1xuICAgIGNsb25lOiBCb2R5O1xuICAgIGZpbGVzOiBNYXA8YW55LCBhbnk+O1xuICB9O1xuXG4gIGlmIChzaG91bGRVc2VNdWx0aXBhcnQpIHtcbiAgICBpZiAoaXNCYXRjaGluZykge1xuICAgICAgcmV0dXJuIG5ldyBPYnNlcnZhYmxlKG9ic2VydmVyID0+XG4gICAgICAgIG9ic2VydmVyLmVycm9yKG5ldyBFcnJvcignRmlsZSB1cGxvYWQgaXMgbm90IGF2YWlsYWJsZSB3aGVuIGNvbWJpbmVkIHdpdGggQmF0Y2hpbmcnKSksXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmICghc2hvdWxkVXNlQm9keSkge1xuICAgICAgcmV0dXJuIG5ldyBPYnNlcnZhYmxlKG9ic2VydmVyID0+XG4gICAgICAgIG9ic2VydmVyLmVycm9yKG5ldyBFcnJvcignRmlsZSB1cGxvYWQgaXMgbm90IGF2YWlsYWJsZSB3aGVuIEdFVCBpcyB1c2VkJykpLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoIWV4dHJhY3RGaWxlcykge1xuICAgICAgcmV0dXJuIG5ldyBPYnNlcnZhYmxlKG9ic2VydmVyID0+XG4gICAgICAgIG9ic2VydmVyLmVycm9yKFxuICAgICAgICAgIG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBUbyB1c2UgRmlsZSB1cGxvYWQgeW91IG5lZWQgdG8gcGFzcyBcImV4dHJhY3RGaWxlc1wiIGZ1bmN0aW9uIGZyb20gXCJleHRyYWN0LWZpbGVzXCIgbGlicmFyeSB0byBIdHRwTGluaydzIG9wdGlvbnNgLFxuICAgICAgICAgICksXG4gICAgICAgICksXG4gICAgICApO1xuICAgIH1cblxuICAgIG11bHRpcGFydEluZm8gPSBleHRyYWN0RmlsZXMocmVxLmJvZHkpO1xuXG4gICAgc2hvdWxkVXNlTXVsdGlwYXJ0ID0gISFtdWx0aXBhcnRJbmZvLmZpbGVzLnNpemU7XG4gIH1cblxuICAvLyBgYm9keWAgZm9yIHNvbWUsIGBwYXJhbXNgIGZvciBvdGhlcnNcbiAgbGV0IGJvZHlPclBhcmFtcyA9IHt9O1xuXG4gIGlmIChpc0JhdGNoaW5nKSB7XG4gICAgaWYgKCFzaG91bGRVc2VCb2R5KSB7XG4gICAgICByZXR1cm4gbmV3IE9ic2VydmFibGUob2JzZXJ2ZXIgPT5cbiAgICAgICAgb2JzZXJ2ZXIuZXJyb3IobmV3IEVycm9yKCdCYXRjaGluZyBpcyBub3QgYXZhaWxhYmxlIGZvciBHRVQgcmVxdWVzdHMnKSksXG4gICAgICApO1xuICAgIH1cblxuICAgIGJvZHlPclBhcmFtcyA9IHtcbiAgICAgIGJvZHk6IHJlcS5ib2R5LFxuICAgIH07XG4gIH0gZWxzZSB7XG4gICAgY29uc3QgYm9keSA9IHNob3VsZFVzZU11bHRpcGFydCA/IG11bHRpcGFydEluZm8hLmNsb25lIDogcmVxLmJvZHk7XG5cbiAgICBpZiAoc2hvdWxkVXNlQm9keSkge1xuICAgICAgYm9keU9yUGFyYW1zID0ge1xuICAgICAgICBib2R5LFxuICAgICAgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgcGFyYW1zID0gT2JqZWN0LmtleXMocmVxLmJvZHkpLnJlZHVjZSgob2JqOiBhbnksIHBhcmFtKSA9PiB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gKHJlcS5ib2R5IGFzIGFueSlbcGFyYW1dO1xuICAgICAgICBvYmpbcGFyYW1dID0gc2hvdWxkU3RyaW5naWZ5KHBhcmFtKSA/IEpTT04uc3RyaW5naWZ5KHZhbHVlKSA6IHZhbHVlO1xuICAgICAgICByZXR1cm4gb2JqO1xuICAgICAgfSwge30pO1xuXG4gICAgICBib2R5T3JQYXJhbXMgPSB7IHBhcmFtczogcGFyYW1zIH07XG4gICAgfVxuICB9XG5cbiAgaWYgKHNob3VsZFVzZU11bHRpcGFydCAmJiBzaG91bGRVc2VCb2R5KSB7XG4gICAgY29uc3QgZm9ybSA9IG5ldyBGb3JtRGF0YSgpO1xuXG4gICAgZm9ybS5hcHBlbmQoJ29wZXJhdGlvbnMnLCBKU09OLnN0cmluZ2lmeSgoYm9keU9yUGFyYW1zIGFzIGFueSkuYm9keSkpO1xuXG4gICAgY29uc3QgbWFwOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge307XG4gICAgY29uc3QgZmlsZXMgPSBtdWx0aXBhcnRJbmZvIS5maWxlcztcblxuICAgIGxldCBpID0gMDtcbiAgICBmaWxlcy5mb3JFYWNoKHBhdGhzID0+IHtcbiAgICAgIG1hcFsrK2ldID0gcGF0aHM7XG4gICAgfSk7XG5cbiAgICBmb3JtLmFwcGVuZCgnbWFwJywgSlNPTi5zdHJpbmdpZnkobWFwKSk7XG5cbiAgICBpID0gMDtcbiAgICBmaWxlcy5mb3JFYWNoKChfLCBmaWxlKSA9PiB7XG4gICAgICBmb3JtLmFwcGVuZCgrK2kgKyAnJywgZmlsZSwgZmlsZS5uYW1lKTtcbiAgICB9KTtcblxuICAgIChib2R5T3JQYXJhbXMgYXMgYW55KS5ib2R5ID0gZm9ybTtcbiAgfVxuXG4gIC8vIGNyZWF0ZSBhIHJlcXVlc3RcbiAgcmV0dXJuIGh0dHBDbGllbnQucmVxdWVzdDxPYmplY3Q+KHJlcS5tZXRob2QsIHJlcS51cmwsIHtcbiAgICBvYnNlcnZlOiAncmVzcG9uc2UnLFxuICAgIHJlc3BvbnNlVHlwZTogJ2pzb24nLFxuICAgIHJlcG9ydFByb2dyZXNzOiBmYWxzZSxcbiAgICAuLi5ib2R5T3JQYXJhbXMsXG4gICAgLi4ucmVxLm9wdGlvbnMsXG4gIH0pO1xufTtcblxuZXhwb3J0IGNvbnN0IG1lcmdlSGVhZGVycyA9IChzb3VyY2U6IEh0dHBIZWFkZXJzLCBkZXN0aW5hdGlvbjogSHR0cEhlYWRlcnMpOiBIdHRwSGVhZGVycyA9PiB7XG4gIGlmIChzb3VyY2UgJiYgZGVzdGluYXRpb24pIHtcbiAgICBjb25zdCBtZXJnZWQgPSBkZXN0aW5hdGlvblxuICAgICAgLmtleXMoKVxuICAgICAgLnJlZHVjZSgoaGVhZGVycywgbmFtZSkgPT4gaGVhZGVycy5zZXQobmFtZSwgZGVzdGluYXRpb24uZ2V0QWxsKG5hbWUpKSwgc291cmNlKTtcblxuICAgIHJldHVybiBtZXJnZWQ7XG4gIH1cblxuICByZXR1cm4gZGVzdGluYXRpb24gfHwgc291cmNlO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIHByaW9yaXRpemU8VD4oLi4udmFsdWVzOiBUW10pOiBUIHtcbiAgY29uc3QgcGlja2VkID0gdmFsdWVzLmZpbmQodmFsID0+IHR5cGVvZiB2YWwgIT09ICd1bmRlZmluZWQnKTtcblxuICBpZiAodHlwZW9mIHBpY2tlZCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICByZXR1cm4gdmFsdWVzW3ZhbHVlcy5sZW5ndGggLSAxXTtcbiAgfVxuXG4gIHJldHVybiBwaWNrZWQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVIZWFkZXJzV2l0aENsaWVudEF3YXJlbmVzcyhjb250ZXh0OiBSZWNvcmQ8c3RyaW5nLCBhbnk+KSB7XG4gIC8vIGBhcG9sbG9ncmFwaHFsLWNsaWVudC0qYCBoZWFkZXJzIGFyZSBhdXRvbWF0aWNhbGx5IHNldCBpZiBhXG4gIC8vIGBjbGllbnRBd2FyZW5lc3NgIG9iamVjdCBpcyBmb3VuZCBpbiB0aGUgY29udGV4dC4gVGhlc2UgaGVhZGVycyBhcmVcbiAgLy8gc2V0IGZpcnN0LCBmb2xsb3dlZCBieSB0aGUgcmVzdCBvZiB0aGUgaGVhZGVycyBwdWxsZWQgZnJvbVxuICAvLyBgY29udGV4dC5oZWFkZXJzYC5cbiAgbGV0IGhlYWRlcnMgPVxuICAgIGNvbnRleHQuaGVhZGVycyAmJiBjb250ZXh0LmhlYWRlcnMgaW5zdGFuY2VvZiBIdHRwSGVhZGVyc1xuICAgICAgPyBjb250ZXh0LmhlYWRlcnNcbiAgICAgIDogbmV3IEh0dHBIZWFkZXJzKGNvbnRleHQuaGVhZGVycyk7XG5cbiAgaWYgKGNvbnRleHQuY2xpZW50QXdhcmVuZXNzKSB7XG4gICAgY29uc3QgeyBuYW1lLCB2ZXJzaW9uIH0gPSBjb250ZXh0LmNsaWVudEF3YXJlbmVzcztcblxuICAgIC8vIElmIGRlc2lyZWQsIGBhcG9sbG9ncmFwaHFsLWNsaWVudC0qYCBoZWFkZXJzIHNldCBieVxuICAgIC8vIHRoZSBgY2xpZW50QXdhcmVuZXNzYCBvYmplY3QgY2FuIGJlIG92ZXJyaWRkZW4gYnlcbiAgICAvLyBgYXBvbGxvZ3JhcGhxbC1jbGllbnQtKmAgaGVhZGVycyBzZXQgaW4gYGNvbnRleHQuaGVhZGVyc2AuXG5cbiAgICBpZiAobmFtZSAmJiAhaGVhZGVycy5oYXMoJ2Fwb2xsb2dyYXBocWwtY2xpZW50LW5hbWUnKSkge1xuICAgICAgaGVhZGVycyA9IGhlYWRlcnMuc2V0KCdhcG9sbG9ncmFwaHFsLWNsaWVudC1uYW1lJywgbmFtZSk7XG4gICAgfVxuXG4gICAgaWYgKHZlcnNpb24gJiYgIWhlYWRlcnMuaGFzKCdhcG9sbG9ncmFwaHFsLWNsaWVudC12ZXJzaW9uJykpIHtcbiAgICAgIGhlYWRlcnMgPSBoZWFkZXJzLnNldCgnYXBvbGxvZ3JhcGhxbC1jbGllbnQtdmVyc2lvbicsIHZlcnNpb24pO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBoZWFkZXJzO1xufVxuIl19