filestack-js
Version:
Official JavaScript library for Filestack
248 lines (246 loc) • 27.9 kB
JavaScript
/*
* Copyright (c) 2018 by Filestack.
* Some rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the 'License');
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an 'AS IS' BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
Object.defineProperty(exports, "__esModule", { value: true });
var tslib_1 = require("tslib");
// import { config } from './../../config';
var nock_1 = tslib_1.__importDefault(require("nock"));
var prefetch_1 = require("./prefetch");
var request_1 = require("../request");
var testApiKey = 'AHv2222222222444444uez';
var testSecurity = {
policy: 'examplePolicy',
signature: 'exampleSignature',
};
var testURL = {
fileApiUrl: '',
uploadApiUrl: 'https://uploadtesturl-fs.com',
cloudApiUrl: '',
cdnUrl: '',
pickerUrl: '',
processUrl: '',
};
var testSession = {
apikey: testApiKey,
urls: testURL,
};
var scope = (0, nock_1.default)(testURL.uploadApiUrl);
// mock cors responses for all request for browser tests
scope.defaultReplyHeaders({
'access-control-allow-origin': function (req) { var _a; return (_a = req.getHeader('origin')) === null || _a === void 0 ? void 0 : _a.toString(); },
'access-control-allow-methods': function (req) { var _a; return (_a = req.getHeader('access-control-request-method')) === null || _a === void 0 ? void 0 : _a.toString(); },
'access-control-allow-headers': function (req) { var _a; return (_a = req.getHeader('access-control-request-headers')) === null || _a === void 0 ? void 0 : _a.toString(); },
'content-type': 'application/json',
});
describe('Prefetch', function () {
beforeEach(function () {
scope
.options(/.*/)
.reply(204);
});
it('should make correct request to prefetch and return new config', function () { return tslib_1.__awaiter(void 0, void 0, void 0, function () {
var sessionCopy, serverResponse, test, prefetch, res;
return tslib_1.__generator(this, function (_a) {
switch (_a.label) {
case 0:
sessionCopy = tslib_1.__assign({}, testSession);
serverResponse = {
blocked: false,
settings: {
customsource: false,
inapp_browser: false,
},
permissions: {
transforms_ui: false,
},
updated_config: {
fromSources: ['googledrive'],
},
};
scope.post('/prefetch').once().reply(200, serverResponse);
test = function () { return 2; };
prefetch = new prefetch_1.Prefetch(sessionCopy);
return [4 /*yield*/, prefetch.getConfig({
pickerOptions: {
// @ts-ignore
onFileSelected: test,
fromSources: ['googledrive', 'test'],
},
})];
case 1:
res = _a.sent();
expect(res.pickerOptions.onFileSelected).toEqual(test);
expect(res.pickerOptions.fromSources).toEqual(['googledrive']);
scope.done();
return [2 /*return*/];
}
});
}); });
it('should set correct params to sessions (prefetch)', function () { return tslib_1.__awaiter(void 0, void 0, void 0, function () {
var sessionCopy, serverResponse, prefetch, res;
return tslib_1.__generator(this, function (_a) {
switch (_a.label) {
case 0:
sessionCopy = tslib_1.__assign({}, testSession);
serverResponse = {
blocked: false,
settings: {
customsource: false,
inapp_browser: true,
},
permissions: {
transforms_ui: true,
},
updated_config: {
fromSources: ['googledrive'],
},
};
scope.post('/prefetch').once().reply(200, serverResponse);
prefetch = new prefetch_1.Prefetch(sessionCopy);
return [4 /*yield*/, prefetch.getConfig({
pickerOptions: {
fromSources: ['facebook', 'test'],
},
})];
case 1:
res = _a.sent();
expect(sessionCopy.prefetch).toEqual(expect.any(Object));
expect(sessionCopy.prefetch.settings.inapp_browser).toEqual(true);
expect(sessionCopy.prefetch.permissions.transforms_ui).toEqual(true);
scope.done();
return [2 /*return*/];
}
});
}); });
it('should throw error when response code is other thant 200', function () { return tslib_1.__awaiter(void 0, void 0, void 0, function () {
var sessionCopy, prefetch, err_1;
return tslib_1.__generator(this, function (_a) {
switch (_a.label) {
case 0:
_a.trys.push([0, 2, , 3]);
sessionCopy = tslib_1.__assign({}, testSession);
prefetch = new prefetch_1.Prefetch(sessionCopy);
scope.post('/prefetch').once().reply(500);
return [4 /*yield*/, prefetch.getConfig({})];
case 1:
_a.sent();
return [3 /*break*/, 3];
case 2:
err_1 = _a.sent();
expect(err_1.code).toEqual(request_1.FsRequestErrorCode.SERVER);
return [3 /*break*/, 3];
case 3:
scope.done();
return [2 /*return*/];
}
});
}); });
it('should add security to request when provided', function () { return tslib_1.__awaiter(void 0, void 0, void 0, function () {
var sessionCopy, mockPref, prefetch, res;
return tslib_1.__generator(this, function (_a) {
switch (_a.label) {
case 0:
sessionCopy = tslib_1.__assign(tslib_1.__assign({}, testSession), { signature: testSecurity.signature, policy: testSecurity.policy });
mockPref = jest.fn().mockImplementation(function () { return ({}); });
scope.post('/prefetch').once().reply(200, function (_, data) { return mockPref(data); });
prefetch = new prefetch_1.Prefetch(sessionCopy);
return [4 /*yield*/, prefetch.getConfig({
pickerOptions: {},
})];
case 1:
res = _a.sent();
expect(mockPref).toHaveBeenCalledWith({
apikey: testApiKey,
settings: ['inapp_browser'],
security: {
signature: testSecurity.signature,
policy: testSecurity.policy,
},
});
scope.done();
return [2 /*return*/];
}
});
}); });
it('should always add inapp browser setting to request', function () { return tslib_1.__awaiter(void 0, void 0, void 0, function () {
var mockPref, prefetch;
return tslib_1.__generator(this, function (_a) {
switch (_a.label) {
case 0:
mockPref = jest.fn().mockImplementation(function () { return ({}); });
scope.post('/prefetch').once().reply(200, function (_, data) { return mockPref(data); });
prefetch = new prefetch_1.Prefetch(tslib_1.__assign({}, testSession));
return [4 /*yield*/, prefetch.getConfig({})];
case 1:
_a.sent();
expect(mockPref).toHaveBeenCalledWith({
apikey: testApiKey,
settings: ['inapp_browser'],
});
scope.done();
return [2 /*return*/];
}
});
}); });
it('should always add inapp browser setting to request event if some settings are provided', function () { return tslib_1.__awaiter(void 0, void 0, void 0, function () {
var mockPref, prefetch;
return tslib_1.__generator(this, function (_a) {
switch (_a.label) {
case 0:
mockPref = jest.fn().mockImplementation(function () { return ({}); });
scope.post('/prefetch').once().reply(200, function (_, data) { return mockPref(data); });
prefetch = new prefetch_1.Prefetch(tslib_1.__assign({}, testSession));
return [4 /*yield*/, prefetch.getConfig({ settings: ['inapp_browser'] })];
case 1:
_a.sent();
expect(mockPref).toHaveBeenCalledWith({
apikey: testApiKey,
settings: ['inapp_browser'],
});
scope.done();
return [2 /*return*/];
}
});
}); });
it('should return old config when updated_config is missing in response', function () { return tslib_1.__awaiter(void 0, void 0, void 0, function () {
var sessionCopy, pickerOptions, prefetch, res;
return tslib_1.__generator(this, function (_a) {
switch (_a.label) {
case 0:
sessionCopy = tslib_1.__assign(tslib_1.__assign({}, testSession), { signature: testSecurity.signature, policy: testSecurity.policy });
scope.post('/prefetch').once().reply(200, {
blocked: true,
});
pickerOptions = {
uploadInBackground: true,
onUploadDone: function () { return console.log; },
storeTo: {
location: 'asd',
},
};
prefetch = new prefetch_1.Prefetch(sessionCopy);
return [4 /*yield*/, prefetch.getConfig({ pickerOptions: pickerOptions })];
case 1:
res = _a.sent();
expect(res.pickerOptions).toEqual(pickerOptions);
scope.done();
return [2 /*return*/];
}
});
}); });
});
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9saWIvYXBpL3ByZWZldGNoLnNwZWMuYnJvd3Nlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHOzs7QUFFSCwyQ0FBMkM7QUFDM0Msc0RBQXdCO0FBQ3hCLHVDQUFzRDtBQUV0RCxzQ0FBZ0Q7QUFFaEQsSUFBTSxVQUFVLEdBQUcsd0JBQXdCLENBQUM7QUFDNUMsSUFBTSxZQUFZLEdBQWE7SUFDN0IsTUFBTSxFQUFFLGVBQWU7SUFDdkIsU0FBUyxFQUFFLGtCQUFrQjtDQUM5QixDQUFDO0FBRUYsSUFBTSxPQUFPLEdBQUc7SUFDZCxVQUFVLEVBQUUsRUFBRTtJQUNkLFlBQVksRUFBRSw4QkFBOEI7SUFDNUMsV0FBVyxFQUFFLEVBQUU7SUFDZixNQUFNLEVBQUUsRUFBRTtJQUNWLFNBQVMsRUFBRSxFQUFFO0lBQ2IsVUFBVSxFQUFFLEVBQUU7Q0FDZixDQUFDO0FBRUYsSUFBTSxXQUFXLEdBQVk7SUFDM0IsTUFBTSxFQUFFLFVBQVU7SUFDbEIsSUFBSSxFQUFFLE9BQU87Q0FDZCxDQUFDO0FBRUYsSUFBSSxLQUFLLEdBQUcsSUFBQSxjQUFJLEVBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxDQUFDO0FBRXZDLHdEQUF3RDtBQUN4RCxLQUFLLENBQUMsbUJBQW1CLENBQUM7SUFDeEIsNkJBQTZCLEVBQUUsVUFBVSxHQUFHLFlBQUksT0FBTyxNQUFBLEdBQUcsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLDBDQUFFLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUM3Riw4QkFBOEIsRUFBRSxVQUFVLEdBQUcsWUFBSSxPQUFPLE1BQUEsR0FBRyxDQUFDLFNBQVMsQ0FBQywrQkFBK0IsQ0FBQywwQ0FBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDckgsOEJBQThCLEVBQUUsVUFBVSxHQUFHLFlBQUksT0FBTyxNQUFBLEdBQUcsQ0FBQyxTQUFTLENBQUMsZ0NBQWdDLENBQUMsMENBQUUsUUFB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QUFNLE9BQUEsT0FBTyxDQUFDLEdBQUcsRUFBWCxDQUFXO3dCQUMvQixPQUFPLEVBQUU7NEJBQ1AsUUFBUSxFQUFFLEtBQUs7eUJBQ2hCO3FCQUNGLENBQUM7b0JBRUksUUFBUSxHQUFHLElBQUksbUJBQVEsQ0FBQyxXQUFXLENBQUMsQ0FBQztvQkFDL0IscUJBQU0sUUFBUSxDQUFDLFNBQVMsQ0FBQyxFQUFFLGFBQWEsZUFBQSxFQUFFLENBQUMsRUFBQTs7b0JBQWpELEdBQUcsR0FBRyxTQUEyQztvQkFFdkQsTUFBTSxDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUMsQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLENBQUM7b0JBRWpELEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQzs7OztTQUNkLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwiZmlsZSI6ImxpYi9hcGkvcHJlZmV0Y2guc3BlYy5icm93c2VyLmpzIiwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIENvcHlyaWdodCAoYykgMjAxOCBieSBGaWxlc3RhY2suXG4gKiBTb21lIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgJ0xpY2Vuc2UnKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAnQVMgSVMnIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG4vLyBpbXBvcnQgeyBjb25maWcgfSBmcm9tICcuLy4uLy4uL2NvbmZpZyc7XG5pbXBvcnQgbm9jayBmcm9tICdub2NrJztcbmltcG9ydCB7IFByZWZldGNoLCBQcmVmZXRjaEV2ZW50cyB9IGZyb20gJy4vcHJlZmV0Y2gnO1xuaW1wb3J0IHsgU2Vzc2lvbiwgU2VjdXJpdHkgfSBmcm9tICcuLy4uL2NsaWVudCc7XG5pbXBvcnQgeyBGc1JlcXVlc3RFcnJvckNvZGUgfSBmcm9tICcuLi9yZXF1ZXN0JztcblxuY29uc3QgdGVzdEFwaUtleSA9ICdBSHYyMjIyMjIyMjIyNDQ0NDQ0dWV6JztcbmNvbnN0IHRlc3RTZWN1cml0eTogU2VjdXJpdHkgPSB7XG4gIHBvbGljeTogJ2V4YW1wbGVQb2xpY3knLFxuICBzaWduYXR1cmU6ICdleGFtcGxlU2lnbmF0dXJlJyxcbn07XG5cbmNvbnN0IHRlc3RVUkwgPSB7XG4gIGZpbGVBcGlVcmw6ICcnLFxuICB1cGxvYWRBcGlVcmw6ICdodHRwczovL3VwbG9hZHRlc3R1cmwtZnMuY29tJyxcbiAgY2xvdWRBcGlVcmw6ICcnLFxuICBjZG5Vcmw6ICcnLFxuICBwaWNrZXJVcmw6ICcnLFxuICBwcm9jZXNzVXJsOiAnJyxcbn07XG5cbmNvbnN0IHRlc3RTZXNzaW9uOiBTZXNzaW9uID0ge1xuICBhcGlrZXk6IHRlc3RBcGlLZXksXG4gIHVybHM6IHRlc3RVUkwsXG59O1xuXG5sZXQgc2NvcGUgPSBub2NrKHRlc3RVUkwudXBsb2FkQXBpVXJsKTtcblxuLy8gbW9jayBjb3JzIHJlc3BvbnNlcyBmb3IgYWxsIHJlcXVlc3QgZm9yIGJyb3dzZXIgdGVzdHNcbnNjb3BlLmRlZmF1bHRSZXBseUhlYWRlcnMoe1xuICAnYWNjZXNzLWNvbnRyb2wtYWxsb3ctb3JpZ2luJzogZnVuY3Rpb24gKHJlcSkgeyByZXR1cm4gcmVxLmdldEhlYWRlcignb3JpZ2luJyk/LnRvU3RyaW5nKCk7IH0sXG4gICdhY2Nlc3MtY29udHJvbC1hbGxvdy1tZXRob2RzJzogZnVuY3Rpb24gKHJlcSkgeyByZXR1cm4gcmVxLmdldEhlYWRlcignYWNjZXNzLWNvbnRyb2wtcmVxdWVzdC1tZXRob2QnKT8udG9TdHJpbmcoKTsgfSxcbiAgJ2FjY2Vzcy1jb250cm9sLWFsbG93LWhlYWRlcnMnOiBmdW5jdGlvbiAocmVxKSB7IHJldHVybiByZXEuZ2V0SGVhZGVyKCdhY2Nlc3MtY29udHJvbC1yZXF1ZXN0LWhlYWRlcnMnKT8udG9TdHJpbmcoKTsgfSxcbiAgJ2NvbnRlbnQtdHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbn0pO1xuXG5kZXNjcmliZSgnUHJlZmV0Y2gnLCAoKSA9PiB7XG4gIGJlZm9yZUVhY2goKCkgPT4ge1xuICAgIHNjb3BlXG4gICAgLm9wdGlvbnMoLy4qLylcbiAgICAucmVwbHkoMjA0KTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCBtYWtlIGNvcnJlY3QgcmVxdWVzdCB0byBwcmVmZXRjaCBhbmQgcmV0dXJuIG5ldyBjb25maWcnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3Qgc2Vzc2lvbkNvcHkgPSAgeyAuLi50ZXN0U2Vzc2lvbiB9O1xuXG4gICAgY29uc3Qgc2VydmVyUmVzcG9uc2UgPSB7XG4gICAgICBibG9ja2VkOiBmYWxzZSxcbiAgICAgIHNldHRpbmdzOiB7XG4gICAgICAgIGN1c3RvbXNvdXJjZTogZmFsc2UsXG4gICAgICAgIGluYXBwX2Jyb3dzZXI6IGZhbHNlLFxuICAgICAgfSxcbiAgICAgIHBlcm1pc3Npb25zOiB7XG4gICAgICAgIHRyYW5zZm9ybXNfdWk6IGZhbHNlLFxuICAgICAgfSxcbiAgICAgIHVwZGF0ZWRfY29uZmlnOiB7XG4gICAgICAgIGZyb21Tb3VyY2VzOiBbJ2dvb2dsZWRyaXZlJ10sXG4gICAgICB9LFxuICAgIH07XG5cbiAgICBzY29wZS5wb3N0KCcvcHJlZmV0Y2gnKS5vbmNlKCkucmVwbHkoMjAwLCBzZXJ2ZXJSZXNwb25zZSk7XG5cbiAgICBjb25zdCB0ZXN0ID0gKCkgPT4gMjtcblxuICAgIGNvbnN0IHByZWZldGNoID0gbmV3IFByZWZldGNoKHNlc3Npb25Db3B5KTtcbiAgICBjb25zdCByZXMgPSBhd2FpdCBwcmVmZXRjaC5nZXRDb25maWcoe1xuICAgICAgcGlja2VyT3B0aW9uczoge1xuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIG9uRmlsZVNlbGVjdGVkOiB0ZXN0LFxuICAgICAgICBmcm9tU291cmNlczogWydnb29nbGVkcml2ZScsICd0ZXN0J10sXG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgZXhwZWN0KHJlcy5waWNrZXJPcHRpb25zLm9uRmlsZVNlbGVjdGVkKS50b0VxdWFsKHRlc3QpO1xuICAgIGV4cGVjdChyZXMucGlja2VyT3B0aW9ucy5mcm9tU291cmNlcykudG9FcXVhbChbJ2dvb2dsZWRyaXZlJ10pO1xuXG4gICAgc2NvcGUuZG9uZSgpO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIHNldCBjb3JyZWN0IHBhcmFtcyB0byBzZXNzaW9ucyAocHJlZmV0Y2gpJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHNlc3Npb25Db3B5ID0gIHsgLi4udGVzdFNlc3Npb24gfTtcbiAgICBjb25zdCBzZXJ2ZXJSZXNwb25zZSA9IHtcbiAgICAgIGJsb2NrZWQ6IGZhbHNlLFxuICAgICAgc2V0dGluZ3M6IHtcbiAgICAgICAgY3VzdG9tc291cmNlOiBmYWxzZSxcbiAgICAgICAgaW5hcHBfYnJvd3NlcjogdHJ1ZSxcbiAgICAgIH0sXG4gICAgICBwZXJtaXNzaW9uczoge1xuICAgICAgICB0cmFuc2Zvcm1zX3VpOiB0cnVlLFxuICAgICAgfSxcbiAgICAgIHVwZGF0ZWRfY29uZmlnOiB7XG4gICAgICAgIGZyb21Tb3VyY2VzOiBbJ2dvb2dsZWRyaXZlJ10sXG4gICAgICB9LFxuICAgIH07XG5cbiAgICBzY29wZS5wb3N0KCcvcHJlZmV0Y2gnKS5vbmNlKCkucmVwbHkoMjAwLCBzZXJ2ZXJSZXNwb25zZSk7XG5cbiAgICBjb25zdCBwcmVmZXRjaCA9IG5ldyBQcmVmZXRjaChzZXNzaW9uQ29weSk7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgcHJlZmV0Y2guZ2V0Q29uZmlnKHtcbiAgICAgIHBpY2tlck9wdGlvbnM6IHtcbiAgICAgICAgZnJvbVNvdXJjZXM6IFsnZmFjZWJvb2snLCAndGVzdCddLFxuICAgICAgfSxcbiAgICB9KTtcblxuICAgIGV4cGVjdChzZXNzaW9uQ29weS5wcmVmZXRjaCkudG9FcXVhbChleHBlY3QuYW55KE9iamVjdCkpO1xuICAgIGV4cGVjdChzZXNzaW9uQ29weS5wcmVmZXRjaC5zZXR0aW5ncy5pbmFwcF9icm93c2VyKS50b0VxdWFsKHRydWUpO1xuICAgIGV4cGVjdChzZXNzaW9uQ29weS5wcmVmZXRjaC5wZXJtaXNzaW9ucy50cmFuc2Zvcm1zX3VpKS50b0VxdWFsKHRydWUpO1xuXG4gICAgc2NvcGUuZG9uZSgpO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIHRocm93IGVycm9yIHdoZW4gcmVzcG9uc2UgY29kZSBpcyBvdGhlciB0aGFudCAyMDAnLCBhc3luYyAoKSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHNlc3Npb25Db3B5ID0gIHsgLi4udGVzdFNlc3Npb24gfTtcbiAgICAgIGNvbnN0IHByZWZldGNoID0gbmV3IFByZWZldGNoKHNlc3Npb25Db3B5KTtcblxuICAgICAgc2NvcGUucG9zdCgnL3ByZWZldGNoJykub25jZSgpLnJlcGx5KDUwMCk7XG5cbiAgICAgIGF3YWl0IHByZWZldGNoLmdldENvbmZpZyh7fSk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBleHBlY3QoZXJyLmNvZGUpLnRvRXF1YWwoRnNSZXF1ZXN0RXJyb3JDb2RlLlNFUlZFUik7XG4gICAgfVxuXG4gICAgc2NvcGUuZG9uZSgpO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIGFkZCBzZWN1cml0eSB0byByZXF1ZXN0IHdoZW4gcHJvdmlkZWQnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3Qgc2Vzc2lvbkNvcHkgPSAge1xuICAgICAgLi4udGVzdFNlc3Npb24sXG4gICAgICBzaWduYXR1cmU6IHRlc3RTZWN1cml0eS5zaWduYXR1cmUsXG4gICAgICBwb2xpY3k6IHRlc3RTZWN1cml0eS5wb2xpY3ksXG4gICAgfTtcblxuICAgIGNvbnN0IG1vY2tQcmVmID0gamVzdC5mbigpIC5tb2NrSW1wbGVtZW50YXRpb24oKCkgPT4gKHt9KSk7XG5cbiAgICBzY29wZS5wb3N0KCcvcHJlZmV0Y2gnKS5vbmNlKCkucmVwbHkoMjAwLCAoXywgZGF0YSkgPT4gbW9ja1ByZWYoZGF0YSkpO1xuXG4gICAgY29uc3QgcHJlZmV0Y2ggPSBuZXcgUHJlZmV0Y2goc2Vzc2lvbkNvcHkpO1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IHByZWZldGNoLmdldENvbmZpZyh7XG4gICAgICBwaWNrZXJPcHRpb25zOiB7fSxcbiAgICB9KTtcblxuICAgIGV4cGVjdChtb2NrUHJlZikudG9IYXZlQmVlbkNhbGxlZFdpdGgoe1xuICAgICAgYXBpa2V5OiB0ZXN0QXBpS2V5LFxuICAgICAgc2V0dGluZ3M6IFsnaW5hcHBfYnJvd3NlciddLFxuICAgICAgc2VjdXJpdHk6IHtcbiAgICAgICAgc2lnbmF0dXJlOiB0ZXN0U2VjdXJpdHkuc2lnbmF0dXJlLFxuICAgICAgICBwb2xpY3k6IHRlc3RTZWN1cml0eS5wb2xpY3ksXG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgc2NvcGUuZG9uZSgpO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIGFsd2F5cyBhZGQgaW5hcHAgYnJvd3NlciBzZXR0aW5nIHRvIHJlcXVlc3QnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgbW9ja1ByZWYgPSBqZXN0LmZuKCkgLm1vY2tJbXBsZW1lbnRhdGlvbigoKSA9PiAoe30pKTtcbiAgICBzY29wZS5wb3N0KCcvcHJlZmV0Y2gnKS5vbmNlKCkucmVwbHkoMjAwLCAoXywgZGF0YSkgPT4gbW9ja1ByZWYoZGF0YSkpO1xuXG4gICAgY29uc3QgcHJlZmV0Y2ggPSBuZXcgUHJlZmV0Y2goeyAuLi50ZXN0U2Vzc2lvbiB9KTtcbiAgICBhd2FpdCBwcmVmZXRjaC5nZXRDb25maWcoe30pO1xuXG4gICAgZXhwZWN0KG1vY2tQcmVmKS50b0hhdmVCZWVuQ2FsbGVkV2l0aCh7XG4gICAgICBhcGlrZXk6IHRlc3RBcGlLZXksXG4gICAgICBzZXR0aW5nczogWydpbmFwcF9icm93c2VyJ10sXG4gICAgfSk7XG5cbiAgICBzY29wZS5kb25lKCk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgYWx3YXlzIGFkZCBpbmFwcCBicm93c2VyIHNldHRpbmcgdG8gcmVxdWVzdCBldmVudCBpZiBzb21lIHNldHRpbmdzIGFyZSBwcm92aWRlZCcsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBtb2NrUHJlZiA9IGplc3QuZm4oKSAubW9ja0ltcGxlbWVudGF0aW9uKCgpID0+ICh7fSkpO1xuICAgIHNjb3BlLnBvc3QoJy9wcmVmZXRjaCcpLm9uY2UoKS5yZXBseSgyMDAsIChfLCBkYXRhKSA9PiBtb2NrUHJlZihkYXRhKSk7XG5cbiAgICBjb25zdCBwcmVmZXRjaCA9IG5ldyBQcmVmZXRjaCh7IC4uLnRlc3RTZXNzaW9uIH0pO1xuICAgIGF3YWl0IHByZWZldGNoLmdldENvbmZpZyh7IHNldHRpbmdzOiBbJ2luYXBwX2Jyb3dzZXInXSB9KTtcblxuICAgIGV4cGVjdChtb2NrUHJlZikudG9IYXZlQmVlbkNhbGxlZFdpdGgoe1xuICAgICAgYXBpa2V5OiB0ZXN0QXBpS2V5LFxuICAgICAgc2V0dGluZ3M6IFsnaW5hcHBfYnJvd3NlciddLFxuICAgIH0pO1xuXG4gICAgc2NvcGUuZG9uZSgpO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIHJldHVybiBvbGQgY29uZmlnIHdoZW4gdXBkYXRlZF9jb25maWcgaXMgbWlzc2luZyBpbiByZXNwb25zZScsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBzZXNzaW9uQ29weSA9ICB7XG4gICAgICAuLi50ZXN0U2Vzc2lvbixcbiAgICAgIHNpZ25hdHVyZTogdGVzdFNlY3VyaXR5LnNpZ25hdHVyZSxcbiAgICAgIHBvbGljeTogdGVzdFNlY3VyaXR5LnBvbGljeSxcbiAgICB9O1xuXG4gICAgc2NvcGUucG9zdCgnL3ByZWZldGNoJykub25jZSgpLnJlcGx5KDIwMCwge1xuICAgICAgYmxvY2tlZDogdHJ1ZSxcbiAgICB9KTtcblxuICAgIGNvbnN0IHBpY2tlck9wdGlvbnMgPSB7XG4gICAgICB1cGxvYWRJbkJhY2tncm91bmQ6IHRydWUsXG4gICAgICBvblVwbG9hZERvbmU6ICgpID0+IGNvbnNvbGUubG9nLFxuICAgICAgc3RvcmVUbzoge1xuICAgICAgICBsb2NhdGlvbjogJ2FzZCcsXG4gICAgICB9LFxuICAgIH07XG5cbiAgICBjb25zdCBwcmVmZXRjaCA9IG5ldyBQcmVmZXRjaChzZXNzaW9uQ29weSk7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgcHJlZmV0Y2guZ2V0Q29uZmlnKHsgcGlja2VyT3B0aW9ucyB9KTtcblxuICAgIGV4cGVjdChyZXMucGlja2VyT3B0aW9ucykudG9FcXVhbChwaWNrZXJPcHRpb25zKTtcblxuICAgIHNjb3BlLmRvbmUoKTtcbiAgfSk7XG59KTtcbiJdfQ==
;