rip-hunter
Version:
JS utilities for AJAX and GraphQL
281 lines (243 loc) • 26.9 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.Hunter = void 0;
var Immutable = _interopRequireWildcard(require("immutable"));
var _isArray = _interopRequireDefault(require("lodash/isArray"));
var _isNull = _interopRequireDefault(require("lodash/isNull"));
var _isPlainObject = _interopRequireDefault(require("lodash/isPlainObject"));
var _isString = _interopRequireDefault(require("lodash/isString"));
var _isUndefined = _interopRequireDefault(require("lodash/isUndefined"));
var _omit = _interopRequireDefault(require("lodash/omit"));
var _ApiError = require("./errors/ApiError");
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }
if (typeof window === 'undefined') {
// require('es6-promise/auto');
require('fetch-everywhere');
}
/**
* Copyright (c) 2017-Present, Nitrogen Labs, Inc.
* Copyrights licensed under the MIT License. See the accompanying LICENSE file for terms.
*/
/**
* Hunter: JS utilities for GraphQL
*/
var Hunter =
/*#__PURE__*/
function () {
function Hunter() {
_classCallCheck(this, Hunter);
}
_createClass(Hunter, null, [{
key: "get",
// AJAX
value: function get(url, params, options) {
return Hunter.ajax(url, 'GET', params, options);
}
}, {
key: "post",
value: function post(url, params, options) {
return Hunter.ajax(url, 'POST', params, options);
}
}, {
key: "put",
value: function put(url, params, options) {
return Hunter.ajax(url, 'PUT', params, options);
}
}, {
key: "del",
value: function del(url, params, options) {
return Hunter.ajax(url, 'DELETE', params, options);
}
}, {
key: "ajax",
value: function ajax(url, method, params) {
var options = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};
var headers = options.headers,
token = options.token;
var isImmutable = options.isImmutable;
url = (url || '').trim();
var formatToken = (token || '').trim();
var formatHeaders = headers || new Headers(); // Method
method = (method || 'GET').toUpperCase(); // Parameters
if (params && method === 'GET') {
url = "".concat(url, "?").concat(Hunter.queryString(params));
params = null;
} else if (params) {
params = JSON.stringify(params);
} // Authentication token
if (formatToken !== '') {
formatHeaders.set('Authorization', "Bearer ".concat(formatToken));
}
var isJSON;
return fetch(url, {
body: params,
headers: formatHeaders,
method: method
}).then(function (response) {
var regex = /application\/json/i; // Check if response is json
isJSON = regex.test(response.headers.get('Content-Type') || '');
if (isJSON) {
return response.json();
} else {
return response.text();
}
}).then(function (results) {
if (isJSON) {
return isImmutable ? Immutable.fromJS(results) : results;
} else {
return results;
}
}).catch(function (error) {
if ((error || {}).message === 'only absolute urls are supported') {
error = new _ApiError.ApiError([{
message: 'invalid_url'
}], error);
}
throw new _ApiError.ApiError([{
message: 'network_error'
}], error);
});
}
}, {
key: "queryString",
value: function queryString(json) {
return Object.keys(json).map(function (key) {
return "".concat(encodeURIComponent(key), "=").concat(encodeURIComponent(json[key]));
}).join('&');
} // GraphQL
}, {
key: "toGQL",
value: function toGQL(obj) {
if (Immutable.Iterable.isIterable(obj)) {
return Hunter.toGQL(obj.toJS());
} else if ((0, _isString.default)(obj)) {
return JSON.stringify(obj);
} else if ((0, _isPlainObject.default)(obj)) {
var cleanObj = (0, _omit.default)(obj, _isUndefined.default);
cleanObj = (0, _omit.default)(cleanObj, _isNull.default);
var props = [];
Object.keys(cleanObj).map(function (key) {
var item = obj[key];
if ((0, _isPlainObject.default)(item)) {
props.push(Hunter.toGQL(item));
} else if ((0, _isArray.default)(item)) {
var list = item.map(function (o) {
return Hunter.toGQL(o);
});
props.push("".concat(key, ": [").concat(list.join(', '), "]"));
} else {
var val = JSON.stringify(item);
if (val) {
props.push("".concat(key, ": ").concat(val));
}
}
});
var values = props.join(', ');
if (values === '') {
return '""';
} else {
return "{".concat(props.join(', '), "}");
}
} else if ((0, _isArray.default)(obj)) {
return "[".concat(obj.map(function (o) {
return Hunter.toGQL(o);
}).toString(), "]");
} else {
return obj;
}
}
}, {
key: "query",
value: function query(url, body, options) {
body = "query ".concat(body);
return Hunter.getGraph(url, body, options);
}
}, {
key: "mutation",
value: function mutation(url, body, options) {
body = "mutation ".concat(body);
return Hunter.getGraph(url, body, options);
}
}, {
key: "getGraph",
value: function getGraph(url, body) {
var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
var isImmutable = options.isImmutable;
var headers = options.headers,
token = options.token;
url = url ? url.trim() : '';
var formatToken = (token || '').trim();
var formatHeaders = headers || new Headers({
'Content-Type': 'application/graphql'
});
if (formatToken !== '') {
formatHeaders.set('Authorization', "Bearer ".concat(formatToken));
}
return fetch(url, {
body: body,
headers: formatHeaders,
method: 'post'
}).then(function (response) {
var regex = /application\/json/i;
var isJSON = regex.test(response.headers.get('Content-Type') || '');
if (isJSON) {
return response.json();
} else {
return {
data: {}
};
}
}).catch(function (error) {
if ((error || {}).message === 'only absolute urls are supported') {
return Promise.reject(new _ApiError.ApiError([{
message: 'invalid_url'
}], error));
}
return Promise.reject(new _ApiError.ApiError([{
message: 'network_error'
}], error));
}).then(function (json) {
if (!json || json.errors) {
if (!json) {
json = {
errors: [{
message: 'api_error'
}]
};
} else if ((json.errors || []).some(function (o) {
return o.message === 'Must provide query string.';
})) {
return Promise.reject(new _ApiError.ApiError([{
message: 'required_query'
}], new Error()));
}
return Promise.reject(new _ApiError.ApiError(json.errors, new Error()));
} else {
var results = json.data || {};
return isImmutable ? Immutable.fromJS(results) : results;
}
}).catch(function (error) {
if (!error.source) {
error = new _ApiError.ApiError([{
message: 'network_error'
}], error);
}
return Promise.reject(error);
});
}
}, {
key: "removeSpaces",
value: function removeSpaces(str) {
return str.replace(/\s+(?=(?:[^'"]*['"][^'"]*['"])*[^'"]*$)/gm, '');
}
}]);
return Hunter;
}();
exports.Hunter = Hunter;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9IdW50ZXIudHMiXSwibmFtZXMiOlsid2luZG93IiwicmVxdWlyZSIsIkh1bnRlciIsInVybCIsInBhcmFtcyIsIm9wdGlvbnMiLCJhamF4IiwibWV0aG9kIiwiaGVhZGVycyIsInRva2VuIiwiaXNJbW11dGFibGUiLCJ0cmltIiwiZm9ybWF0VG9rZW4iLCJmb3JtYXRIZWFkZXJzIiwiSGVhZGVycyIsInRvVXBwZXJDYXNlIiwicXVlcnlTdHJpbmciLCJKU09OIiwic3RyaW5naWZ5Iiwic2V0IiwiaXNKU09OIiwiZmV0Y2giLCJib2R5IiwidGhlbiIsInJlc3BvbnNlIiwicmVnZXgiLCJ0ZXN0IiwiZ2V0IiwianNvbiIsInRleHQiLCJyZXN1bHRzIiwiSW1tdXRhYmxlIiwiZnJvbUpTIiwiY2F0Y2giLCJlcnJvciIsIm1lc3NhZ2UiLCJBcGlFcnJvciIsIk9iamVjdCIsImtleXMiLCJtYXAiLCJrZXkiLCJlbmNvZGVVUklDb21wb25lbnQiLCJqb2luIiwib2JqIiwiSXRlcmFibGUiLCJpc0l0ZXJhYmxlIiwidG9HUUwiLCJ0b0pTIiwiY2xlYW5PYmoiLCJpc1VuZGVmaW5lZCIsImlzTnVsbCIsInByb3BzIiwiaXRlbSIsInB1c2giLCJsaXN0IiwibyIsInZhbCIsInZhbHVlcyIsInRvU3RyaW5nIiwiZ2V0R3JhcGgiLCJkYXRhIiwiUHJvbWlzZSIsInJlamVjdCIsImVycm9ycyIsInNvbWUiLCJFcnJvciIsInNvdXJjZSIsInN0ciIsInJlcGxhY2UiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFBQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFFQTs7Ozs7Ozs7Ozs7O0FBRUEsSUFBRyxPQUFPQSxNQUFQLEtBQWtCLFdBQXJCLEVBQWtDO0FBQ2hDO0FBQ0FDLFVBQVEsa0JBQVI7QUFDRDtBQUVEOzs7Ozs7QUFXQTs7O0lBR2FDLE07Ozs7Ozs7OztBQUNYO3dCQUNXQyxHLEVBQWFDLE0sRUFBU0MsTyxFQUEyQztBQUMxRSxh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QUNDLEtBQUQsRUFBcUI7QUFDMUIsWUFBRyxDQUFDQSxNQUFNZ0MsTUFBVixFQUFrQjtBQUNoQmhDLGtCQUFRLElBQUlFLGtCQUFKLENBQWEsQ0FBQztBQUFDRCxxQkFBUztBQUFWLFdBQUQsQ0FBYixFQUEyQ0QsS0FBM0MsQ0FBUjtBQUNEOztBQUVELGVBQU8yQixRQUFRQyxNQUFSLENBQWU1QixLQUFmLENBQVA7QUFDRCxPQXRDSSxDQUFQO0FBdUNEOzs7aUNBRW1CaUMsRyxFQUFxQjtBQUN2QyxhQUFPQSxJQUFJQyxPQUFKLENBQVksMkNBQVosRUFBeUQsRUFBekQsQ0FBUDtBQUNEIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgSW1tdXRhYmxlIGZyb20gJ2ltbXV0YWJsZSc7XG5pbXBvcnQgaXNBcnJheSBmcm9tICdsb2Rhc2gvaXNBcnJheSc7XG5pbXBvcnQgaXNOdWxsIGZyb20gJ2xvZGFzaC9pc051bGwnO1xuaW1wb3J0IGlzUGxhaW5PYmplY3QgZnJvbSAnbG9kYXNoL2lzUGxhaW5PYmplY3QnO1xuaW1wb3J0IGlzU3RyaW5nIGZyb20gJ2xvZGFzaC9pc1N0cmluZyc7XG5pbXBvcnQgaXNVbmRlZmluZWQgZnJvbSAnbG9kYXNoL2lzVW5kZWZpbmVkJztcbmltcG9ydCBvbWl0IGZyb20gJ2xvZGFzaC9vbWl0JztcblxuaW1wb3J0IHtBcGlFcnJvcn0gZnJvbSAnLi9lcnJvcnMvQXBpRXJyb3InO1xuXG5pZih0eXBlb2Ygd2luZG93ID09PSAndW5kZWZpbmVkJykge1xuICAvLyByZXF1aXJlKCdlczYtcHJvbWlzZS9hdXRvJyk7XG4gIHJlcXVpcmUoJ2ZldGNoLWV2ZXJ5d2hlcmUnKTtcbn1cblxuLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTctUHJlc2VudCwgTml0cm9nZW4gTGFicywgSW5jLlxuICogQ29weXJpZ2h0cyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSB0aGUgYWNjb21wYW55aW5nIExJQ0VOU0UgZmlsZSBmb3IgdGVybXMuXG4gKi9cblxuZXhwb3J0IGludGVyZmFjZSBIdW50ZXJPcHRpb25zVHlwZSB7XG4gIHJlYWRvbmx5IGhlYWRlcnM/OiBIZWFkZXJzO1xuICByZWFkb25seSBpc0ltbXV0YWJsZT86IGJvb2xlYW47XG4gIHJlYWRvbmx5IHRva2VuPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIEh1bnRlcjogSlMgdXRpbGl0aWVzIGZvciBHcmFwaFFMXG4gKi9cbmV4cG9ydCBjbGFzcyBIdW50ZXIge1xuICAvLyBBSkFYXG4gIHN0YXRpYyBnZXQodXJsOiBzdHJpbmcsIHBhcmFtcz8sIG9wdGlvbnM/OiBIdW50ZXJPcHRpb25zVHlwZSk6IFByb21pc2U8YW55PiB7XG4gICAgcmV0dXJuIEh1bnRlci5hamF4KHVybCwgJ0dFVCcsIHBhcmFtcywgb3B0aW9ucyk7XG4gIH1cblxuICBzdGF0aWMgcG9zdCh1cmw6IHN0cmluZywgcGFyYW1zPywgb3B0aW9ucz86IEh1bnRlck9wdGlvbnNUeXBlKTogUHJvbWlzZTxhbnk+IHtcbiAgICByZXR1cm4gSHVudGVyLmFqYXgodXJsLCAnUE9TVCcsIHBhcmFtcywgb3B0aW9ucyk7XG4gIH1cblxuICBzdGF0aWMgcHV0KHVybDogc3RyaW5nLCBwYXJhbXM/LCBvcHRpb25zPzogSHVudGVyT3B0aW9uc1R5cGUpOiBQcm9taXNlPGFueT4ge1xuICAgIHJldHVybiBIdW50ZXIuYWpheCh1cmwsICdQVVQnLCBwYXJhbXMsIG9wdGlvbnMpO1xuICB9XG5cbiAgc3RhdGljIGRlbCh1cmw6IHN0cmluZywgcGFyYW1zPywgb3B0aW9ucz86IEh1bnRlck9wdGlvbnNUeXBlKTogUHJvbWlzZTxhbnk+IHtcbiAgICByZXR1cm4gSHVudGVyLmFqYXgodXJsLCAnREVMRVRFJywgcGFyYW1zLCBvcHRpb25zKTtcbiAgfVxuXG4gIHN0YXRpYyBhamF4KHVybDogc3RyaW5nLCBtZXRob2Q6IHN0cmluZywgcGFyYW1zPywgb3B0aW9uczogSHVudGVyT3B0aW9uc1R5cGUgPSB7fSk6IFByb21pc2U8YW55PiB7XG4gICAgY29uc3Qge2hlYWRlcnMsIHRva2VufSA9IG9wdGlvbnM7XG4gICAgY29uc3Qge2lzSW1tdXRhYmxlfSA9IG9wdGlvbnM7XG5cbiAgICB1cmwgPSAodXJsIHx8ICcnKS50cmltKCk7XG4gICAgY29uc3QgZm9ybWF0VG9rZW46IHN0cmluZyA9ICh0b2tlbiB8fCAnJykudHJpbSgpO1xuICAgIGNvbnN0IGZvcm1hdEhlYWRlcnM6IEhlYWRlcnMgPSBoZWFkZXJzIHx8IG5ldyBIZWFkZXJzKCk7XG5cbiAgICAvLyBNZXRob2RcbiAgICBtZXRob2QgPSAobWV0aG9kIHx8ICdHRVQnKS50b1VwcGVyQ2FzZSgpO1xuXG4gICAgLy8gUGFyYW1ldGVyc1xuICAgIGlmKHBhcmFtcyAmJiBtZXRob2QgPT09ICdHRVQnKSB7XG4gICAgICB1cmwgPSBgJHt1cmx9PyR7SHVudGVyLnF1ZXJ5U3RyaW5nKHBhcmFtcyl9YDtcbiAgICAgIHBhcmFtcyA9IG51bGw7XG4gICAgfSBlbHNlIGlmKHBhcmFtcykge1xuICAgICAgcGFyYW1zID0gSlNPTi5zdHJpbmdpZnkocGFyYW1zKTtcbiAgICB9XG5cbiAgICAvLyBBdXRoZW50aWNhdGlvbiB0b2tlblxuICAgIGlmKGZvcm1hdFRva2VuICE9PSAnJykge1xuICAgICAgZm9ybWF0SGVhZGVycy5zZXQoJ0F1dGhvcml6YXRpb24nLCBgQmVhcmVyICR7Zm9ybWF0VG9rZW59YCk7XG4gICAgfVxuXG4gICAgbGV0IGlzSlNPTjogYm9vbGVhbjtcblxuICAgIHJldHVybiBmZXRjaCh1cmwsIHtib2R5OiBwYXJhbXMsIGhlYWRlcnM6IGZvcm1hdEhlYWRlcnMsIG1ldGhvZH0pXG4gICAgICAudGhlbigocmVzcG9uc2U6IFJlc3BvbnNlKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlZ2V4ID0gL2FwcGxpY2F0aW9uXFwvanNvbi9pO1xuXG4gICAgICAgIC8vIENoZWNrIGlmIHJlc3BvbnNlIGlzIGpzb25cbiAgICAgICAgaXNKU09OID0gcmVnZXgudGVzdChyZXNwb25zZS5oZWFkZXJzLmdldCgnQ29udGVudC1UeXBlJykgfHwgJycpO1xuXG4gICAgICAgIGlmKGlzSlNPTikge1xuICAgICAgICAgIHJldHVybiByZXNwb25zZS5qc29uKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIHJlc3BvbnNlLnRleHQoKTtcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICAgIC50aGVuKChyZXN1bHRzKSA9PiB7XG4gICAgICAgIGlmKGlzSlNPTikge1xuICAgICAgICAgIHJldHVybiBpc0ltbXV0YWJsZSA/IEltbXV0YWJsZS5mcm9tSlMocmVzdWx0cykgOiByZXN1bHRzO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiByZXN1bHRzO1xuICAgICAgICB9XG4gICAgICB9KVxuICAgICAgLmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgICBpZigoZXJyb3IgfHwge30pLm1lc3NhZ2UgPT09ICdvbmx5IGFic29sdXRlIHVybHMgYXJlIHN1cHBvcnRlZCcpIHtcbiAgICAgICAgICBlcnJvciA9IG5ldyBBcGlFcnJvcihbe21lc3NhZ2U6ICdpbnZhbGlkX3VybCd9XSwgZXJyb3IpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhyb3cgbmV3IEFwaUVycm9yKFt7bWVzc2FnZTogJ25ldHdvcmtfZXJyb3InfV0sIGVycm9yKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgc3RhdGljIHF1ZXJ5U3RyaW5nKGpzb246IG9iamVjdCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIE9iamVjdFxuICAgICAgLmtleXMoanNvbilcbiAgICAgIC5tYXAoKGtleTogc3RyaW5nKSA9PiBgJHtlbmNvZGVVUklDb21wb25lbnQoa2V5KX09JHtlbmNvZGVVUklDb21wb25lbnQoanNvbltrZXldKX1gKS5qb2luKCcmJyk7XG4gIH1cblxuICAvLyBHcmFwaFFMXG4gIHN0YXRpYyB0b0dRTChvYmopOiBzdHJpbmcge1xuICAgIGlmKEltbXV0YWJsZS5JdGVyYWJsZS5pc0l0ZXJhYmxlKG9iaikpIHtcbiAgICAgIHJldHVybiBIdW50ZXIudG9HUUwob2JqLnRvSlMoKSk7XG4gICAgfSBlbHNlIGlmKGlzU3RyaW5nKG9iaikpIHtcbiAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShvYmopO1xuICAgIH0gZWxzZSBpZihpc1BsYWluT2JqZWN0KG9iaikpIHtcbiAgICAgIGxldCBjbGVhbk9iaiA9IG9taXQob2JqLCBpc1VuZGVmaW5lZCk7XG4gICAgICBjbGVhbk9iaiA9IG9taXQoY2xlYW5PYmosIGlzTnVsbCk7XG4gICAgICBjb25zdCBwcm9wcyA9IFtdO1xuXG4gICAgICBPYmplY3Qua2V5cyhjbGVhbk9iaikubWFwKChrZXk6IHN0cmluZykgPT4ge1xuICAgICAgICBjb25zdCBpdGVtID0gb2JqW2tleV07XG5cbiAgICAgICAgaWYoaXNQbGFpbk9iamVjdChpdGVtKSkge1xuICAgICAgICAgIHByb3BzLnB1c2goSHVudGVyLnRvR1FMKGl0ZW0pKTtcbiAgICAgICAgfSBlbHNlIGlmKGlzQXJyYXkoaXRlbSkpIHtcbiAgICAgICAgICBjb25zdCBsaXN0ID0gaXRlbS5tYXAoKG8pID0+IEh1bnRlci50b0dRTChvKSk7XG4gICAgICAgICAgcHJvcHMucHVzaChgJHtrZXl9OiBbJHtsaXN0LmpvaW4oJywgJyl9XWApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnN0IHZhbCA9IEpTT04uc3RyaW5naWZ5KGl0ZW0pO1xuXG4gICAgICAgICAgaWYodmFsKSB7XG4gICAgICAgICAgICBwcm9wcy5wdXNoKGAke2tleX06ICR7dmFsfWApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHZhbHVlcyA9IHByb3BzLmpvaW4oJywgJyk7XG5cbiAgICAgIGlmKHZhbHVlcyA9PT0gJycpIHtcbiAgICAgICAgcmV0dXJuICdcIlwiJztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBgeyR7cHJvcHMuam9pbignLCAnKX19YDtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYoaXNBcnJheShvYmopKSB7XG4gICAgICByZXR1cm4gYFske29iai5tYXAoKG8pID0+IEh1bnRlci50b0dRTChvKSkudG9TdHJpbmcoKX1dYDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG9iajtcbiAgICB9XG4gIH1cblxuICBzdGF0aWMgcXVlcnkodXJsOiBzdHJpbmcsIGJvZHk/LCBvcHRpb25zPzogSHVudGVyT3B0aW9uc1R5cGUpOiBQcm9taXNlPGFueT4ge1xuICAgIGJvZHkgPSBgcXVlcnkgJHtib2R5fWA7XG4gICAgcmV0dXJuIEh1bnRlci5nZXRHcmFwaCh1cmwsIGJvZHksIG9wdGlvbnMpO1xuICB9XG5cbiAgc3RhdGljIG11dGF0aW9uKHVybDogc3RyaW5nLCBib2R5Pywgb3B0aW9ucz86IEh1bnRlck9wdGlvbnNUeXBlKTogUHJvbWlzZTxhbnk+IHtcbiAgICBib2R5ID0gYG11dGF0aW9uICR7Ym9keX1gO1xuICAgIHJldHVybiBIdW50ZXIuZ2V0R3JhcGgodXJsLCBib2R5LCBvcHRpb25zKTtcbiAgfVxuXG4gIHN0YXRpYyBnZXRHcmFwaCh1cmw6IHN0cmluZywgYm9keT8sIG9wdGlvbnM6IEh1bnRlck9wdGlvbnNUeXBlID0ge30pOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbnN0IHtpc0ltbXV0YWJsZX0gPSBvcHRpb25zO1xuICAgIGNvbnN0IHtoZWFkZXJzLCB0b2tlbn0gPSBvcHRpb25zO1xuICAgIHVybCA9IHVybCA/IHVybC50cmltKCkgOiAnJztcbiAgICBjb25zdCBmb3JtYXRUb2tlbjogc3RyaW5nID0gKHRva2VuIHx8ICcnKS50cmltKCk7XG4gICAgY29uc3QgZm9ybWF0SGVhZGVyczogSGVhZGVycyA9IGhlYWRlcnMgfHwgbmV3IEhlYWRlcnMoeydDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vZ3JhcGhxbCd9KTtcblxuICAgIGlmKGZvcm1hdFRva2VuICE9PSAnJykge1xuICAgICAgZm9ybWF0SGVhZGVycy5zZXQoJ0F1dGhvcml6YXRpb24nLCBgQmVhcmVyICR7Zm9ybWF0VG9rZW59YCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZldGNoKHVybCwge2JvZHksIGhlYWRlcnM6IGZvcm1hdEhlYWRlcnMsIG1ldGhvZDogJ3Bvc3QnfSlcbiAgICAgIC50aGVuKChyZXNwb25zZTogUmVzcG9uc2UpID0+IHtcbiAgICAgICAgY29uc3QgcmVnZXg6IFJlZ0V4cCA9IC9hcHBsaWNhdGlvblxcL2pzb24vaTtcbiAgICAgICAgY29uc3QgaXNKU09OOiBib29sZWFuID0gcmVnZXgudGVzdChyZXNwb25zZS5oZWFkZXJzLmdldCgnQ29udGVudC1UeXBlJykgfHwgJycpO1xuXG4gICAgICAgIGlmKGlzSlNPTikge1xuICAgICAgICAgIHJldHVybiByZXNwb25zZS5qc29uKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIHtkYXRhOiB7fX07XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgICAuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgICAgIGlmKChlcnJvciB8fCB7fSkubWVzc2FnZSA9PT0gJ29ubHkgYWJzb2x1dGUgdXJscyBhcmUgc3VwcG9ydGVkJykge1xuICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgQXBpRXJyb3IoW3ttZXNzYWdlOiAnaW52YWxpZF91cmwnfV0sIGVycm9yKSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEFwaUVycm9yKFt7bWVzc2FnZTogJ25ldHdvcmtfZXJyb3InfV0sIGVycm9yKSk7XG4gICAgICB9KVxuICAgICAgLnRoZW4oKGpzb24pID0+IHtcbiAgICAgICAgaWYoIWpzb24gfHwganNvbi5lcnJvcnMpIHtcbiAgICAgICAgICBpZighanNvbikge1xuICAgICAgICAgICAganNvbiA9IHtlcnJvcnM6IFt7bWVzc2FnZTogJ2FwaV9lcnJvcid9XX07XG4gICAgICAgICAgfSBlbHNlIGlmKChqc29uLmVycm9ycyB8fCBbXSkuc29tZSgobykgPT4gby5tZXNzYWdlID09PSAnTXVzdCBwcm92aWRlIHF1ZXJ5IHN0cmluZy4nKSkge1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBBcGlFcnJvcihbe21lc3NhZ2U6ICdyZXF1aXJlZF9xdWVyeSd9XSwgbmV3IEVycm9yKCkpKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEFwaUVycm9yKGpzb24uZXJyb3JzLCBuZXcgRXJyb3IoKSkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnN0IHJlc3VsdHMgPSBqc29uLmRhdGEgfHwge307XG4gICAgICAgICAgcmV0dXJuIGlzSW1tdXRhYmxlID8gSW1tdXRhYmxlLmZyb21KUyhyZXN1bHRzKSA6IHJlc3VsdHM7XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgICAuY2F0Y2goKGVycm9yOiBBcGlFcnJvcikgPT4ge1xuICAgICAgICBpZighZXJyb3Iuc291cmNlKSB7XG4gICAgICAgICAgZXJyb3IgPSBuZXcgQXBpRXJyb3IoW3ttZXNzYWdlOiAnbmV0d29ya19lcnJvcid9XSwgZXJyb3IpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KGVycm9yKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgc3RhdGljIHJlbW92ZVNwYWNlcyhzdHI6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHN0ci5yZXBsYWNlKC9cXHMrKD89KD86W14nXCJdKlsnXCJdW14nXCJdKlsnXCJdKSpbXidcIl0qJCkvZ20sICcnKTtcbiAgfVxufVxuIl19