UNPKG

@querc/squidex-client

Version:

NodeJS client for the [Squidex](https://squidex.io/) CMS

150 lines (138 loc) 16.9 kB
"use strict"; require("jest"); var _nodeFetch = _interopRequireWildcard(require("node-fetch")); var _nodeFetch2 = require("./node-fetch.client"); function _getRequireWildcardCache() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; } function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; } const { Response } = jest.requireActual('node-fetch'); jest.mock('node-fetch'); const CONFIG = { url: 'https://foo', clientId: 'my-app:default', clientSecret: 'SEKRIT' }; describe('Node Fetch Client should...', () => { let client; beforeEach(() => { // Mock response from node-fetch _nodeFetch.default.mockImplementation(async (url, init) => { let status = 200; let statusText = 'OK'; if (init.method === 'TEST-500') { status = 500; statusText = 'Something went wrong (HTTP)'; } if (init.method === 'TEST-FETCHERROR') { throw new _nodeFetch.FetchError('Something went wrong (FETCH)', 'TEST'); } const response = new Response(JSON.stringify({ test: 'TEST' }), { status, statusText }); return response; }); client = new _nodeFetch2.NodeFetchClient(CONFIG); }); test('exist', () => { expect(_nodeFetch2.NodeFetchClient).toBeDefined(); }); test('send params as key-value pairs for form-urlencoded contentType', async () => { await client.send({ method: 'TEST', path: '/', contentType: 'application/x-www-form-urlencoded', data: { a: 'b', x: 'y' } }); expect(_nodeFetch.default).toHaveBeenCalledWith('https://foo/', expect.objectContaining({ body: 'a=b&x=y' })); }); test('send Bearer header when token provided', async () => { client = new _nodeFetch2.NodeFetchClient(Object.assign({ flatten: true }, CONFIG)); await client.send({ method: 'TEST', path: '/', token: 'abc' }); expect(_nodeFetch.default).toHaveBeenCalledWith('https://foo/', expect.objectContaining({ headers: expect.objectContaining({ Authorization: 'Bearer abc' }) })); }); test('send X-Languages header when configured', async () => { client = new _nodeFetch2.NodeFetchClient(Object.assign({ languages: ['en', 'es'] }, CONFIG)); await client.send({ method: 'TEST', path: '/', token: 'abc' }); expect(_nodeFetch.default).toHaveBeenCalledWith('https://foo/', expect.objectContaining({ headers: expect.objectContaining({ 'X-Languages': 'en,es' }) })); }); test('send X-Flatten header when configured', async () => { client = new _nodeFetch2.NodeFetchClient(Object.assign({ flatten: true }, CONFIG)); await client.send({ method: 'TEST', path: '/', token: 'abc' }); expect(_nodeFetch.default).toHaveBeenCalledWith('https://foo/', expect.objectContaining({ headers: expect.objectContaining({ 'X-Flatten': 'true' }) })); }); test('send X-Unpublished header when configured', async () => { await client.send({ method: 'TEST', path: '/', token: 'abc', draft: true }); expect(_nodeFetch.default).toHaveBeenCalledWith('https://foo/', expect.objectContaining({ headers: expect.objectContaining({ 'X-Unpublished': 'true' }) })); }); test('handles server errors', async () => { expect.assertions(1); try { await client.send({ method: 'TEST-500', path: '/' }); } catch (e) { expect(e.message).toMatch(/HTTP error/); } }); test('handles fetch errors', async () => { expect.assertions(1); try { await client.send({ method: 'TEST-FETCHERROR', path: '/' }); } catch (e) { expect(e.message).toMatch(/Fetch error/); } }); }); //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9odHRwL25vZGUtZmV0Y2guY2xpZW50LnRlc3QudHMiXSwibmFtZXMiOlsiUmVzcG9uc2UiLCJqZXN0IiwicmVxdWlyZUFjdHVhbCIsIm1vY2siLCJDT05GSUciLCJ1cmwiLCJjbGllbnRJZCIsImNsaWVudFNlY3JldCIsImRlc2NyaWJlIiwiY2xpZW50IiwiYmVmb3JlRWFjaCIsImZldGNoIiwibW9ja0ltcGxlbWVudGF0aW9uIiwiaW5pdCIsInN0YXR1cyIsInN0YXR1c1RleHQiLCJtZXRob2QiLCJGZXRjaEVycm9yIiwicmVzcG9uc2UiLCJKU09OIiwic3RyaW5naWZ5IiwidGVzdCIsIk5vZGVGZXRjaENsaWVudCIsImV4cGVjdCIsInRvQmVEZWZpbmVkIiwic2VuZCIsInBhdGgiLCJjb250ZW50VHlwZSIsImRhdGEiLCJhIiwieCIsInRvSGF2ZUJlZW5DYWxsZWRXaXRoIiwib2JqZWN0Q29udGFpbmluZyIsImJvZHkiLCJPYmplY3QiLCJhc3NpZ24iLCJmbGF0dGVuIiwidG9rZW4iLCJoZWFkZXJzIiwiQXV0aG9yaXphdGlvbiIsImxhbmd1YWdlcyIsImRyYWZ0IiwiYXNzZXJ0aW9ucyIsImUiLCJtZXNzYWdlIiwidG9NYXRjaCJdLCJtYXBwaW5ncyI6Ijs7QUFBQTs7QUFDQTs7QUFDQTs7Ozs7O0FBRUEsTUFBTTtBQUFFQSxFQUFBQTtBQUFGLElBQWVDLElBQUksQ0FBQ0MsYUFBTCxDQUFtQixZQUFuQixDQUFyQjtBQUNBRCxJQUFJLENBQUNFLElBQUwsQ0FBVSxZQUFWO0FBRUEsTUFBTUMsTUFBTSxHQUFHO0FBQ1hDLEVBQUFBLEdBQUcsRUFBRSxhQURNO0FBRVhDLEVBQUFBLFFBQVEsRUFBRSxnQkFGQztBQUdYQyxFQUFBQSxZQUFZLEVBQUU7QUFISCxDQUFmO0FBTUFDLFFBQVEsQ0FBQyw2QkFBRCxFQUFnQyxNQUFNO0FBQzFDLE1BQUlDLE1BQUo7QUFFQUMsRUFBQUEsVUFBVSxDQUFDLE1BQU07QUFDYjtBQUNDQyxzQkFBRCxDQUE2Q0Msa0JBQTdDLENBQ0ksT0FBT1AsR0FBUCxFQUF5QlEsSUFBekIsS0FBZ0Q7QUFDNUMsVUFBSUMsTUFBTSxHQUFHLEdBQWI7QUFDQSxVQUFJQyxVQUFVLEdBQUcsSUFBakI7O0FBRUEsVUFBSUYsSUFBSSxDQUFDRyxNQUFMLEtBQWdCLFVBQXBCLEVBQWdDO0FBQzVCRixRQUFBQSxNQUFNLEdBQUcsR0FBVDtBQUNBQyxRQUFBQSxVQUFVLEdBQUcsNkJBQWI7QUFDSDs7QUFFRCxVQUFJRixJQUFJLENBQUNHLE1BQUwsS0FBZ0IsaUJBQXBCLEVBQXVDO0FBQ25DLGNBQU0sSUFBSUMscUJBQUosQ0FBZSw4QkFBZixFQUErQyxNQUEvQyxDQUFOO0FBQ0g7O0FBRUQsWUFBTUMsUUFBUSxHQUFHLElBQUlsQixRQUFKLENBQ2JtQixJQUFJLENBQUNDLFNBQUwsQ0FBZTtBQUNYQyxRQUFBQSxJQUFJLEVBQUU7QUFESyxPQUFmLENBRGEsRUFJYjtBQUNJUCxRQUFBQSxNQURKO0FBRUlDLFFBQUFBO0FBRkosT0FKYSxDQUFqQjtBQVVBLGFBQU9HLFFBQVA7QUFDSCxLQXpCTDs7QUE0QkFULElBQUFBLE1BQU0sR0FBRyxJQUFJYSwyQkFBSixDQUFvQmxCLE1BQXBCLENBQVQ7QUFDSCxHQS9CUyxDQUFWO0FBaUNBaUIsRUFBQUEsSUFBSSxDQUFDLE9BQUQsRUFBVSxNQUFNO0FBQ2hCRSxJQUFBQSxNQUFNLENBQUNELDJCQUFELENBQU4sQ0FBd0JFLFdBQXhCO0FBQ0gsR0FGRyxDQUFKO0FBSUFILEVBQUFBLElBQUksQ0FBQyxnRUFBRCxFQUFtRSxZQUFZO0FBQy9FLFVBQU1aLE1BQU0sQ0FBQ2dCLElBQVAsQ0FBWTtBQUNkVCxNQUFBQSxNQUFNLEVBQUUsTUFETTtBQUVkVSxNQUFBQSxJQUFJLEVBQUUsR0FGUTtBQUdkQyxNQUFBQSxXQUFXLEVBQUUsbUNBSEM7QUFJZEMsTUFBQUEsSUFBSSxFQUFFO0FBQ0ZDLFFBQUFBLENBQUMsRUFBRSxHQUREO0FBRUZDLFFBQUFBLENBQUMsRUFBRTtBQUZEO0FBSlEsS0FBWixDQUFOO0FBVUFQLElBQUFBLE1BQU0sQ0FBQ1osa0JBQUQsQ0FBTixDQUFjb0Isb0JBQWQsQ0FDSSxjQURKLEVBRUlSLE1BQU0sQ0FBQ1MsZ0JBQVAsQ0FBd0I7QUFDcEJDLE1BQUFBLElBQUksRUFBRTtBQURjLEtBQXhCLENBRko7QUFNSCxHQWpCRyxDQUFKO0FBbUJBWixFQUFBQSxJQUFJLENBQUMsd0NBQUQsRUFBMkMsWUFBWTtBQUN2RFosSUFBQUEsTUFBTSxHQUFHLElBQUlhLDJCQUFKLENBQW9CWSxNQUFNLENBQUNDLE1BQVAsQ0FBYztBQUFFQyxNQUFBQSxPQUFPLEVBQUU7QUFBWCxLQUFkLEVBQWlDaEMsTUFBakMsQ0FBcEIsQ0FBVDtBQUVBLFVBQU1LLE1BQU0sQ0FBQ2dCLElBQVAsQ0FBWTtBQUNkVCxNQUFBQSxNQUFNLEVBQUUsTUFETTtBQUVkVSxNQUFBQSxJQUFJLEVBQUUsR0FGUTtBQUdkVyxNQUFBQSxLQUFLLEVBQUU7QUFITyxLQUFaLENBQU47QUFNQWQsSUFBQUEsTUFBTSxDQUFDWixrQkFBRCxDQUFOLENBQWNvQixvQkFBZCxDQUNJLGNBREosRUFFSVIsTUFBTSxDQUFDUyxnQkFBUCxDQUF3QjtBQUNwQk0sTUFBQUEsT0FBTyxFQUFFZixNQUFNLENBQUNTLGdCQUFQLENBQXdCO0FBQUVPLFFBQUFBLGFBQWEsRUFBRTtBQUFqQixPQUF4QjtBQURXLEtBQXhCLENBRko7QUFNSCxHQWZHLENBQUo7QUFpQkFsQixFQUFBQSxJQUFJLENBQUMseUNBQUQsRUFBNEMsWUFBWTtBQUN4RFosSUFBQUEsTUFBTSxHQUFHLElBQUlhLDJCQUFKLENBQW9CWSxNQUFNLENBQUNDLE1BQVAsQ0FBYztBQUFFSyxNQUFBQSxTQUFTLEVBQUUsQ0FBQyxJQUFELEVBQU8sSUFBUDtBQUFiLEtBQWQsRUFBMkNwQyxNQUEzQyxDQUFwQixDQUFUO0FBRUEsVUFBTUssTUFBTSxDQUFDZ0IsSUFBUCxDQUFZO0FBQ2RULE1BQUFBLE1BQU0sRUFBRSxNQURNO0FBRWRVLE1BQUFBLElBQUksRUFBRSxHQUZRO0FBR2RXLE1BQUFBLEtBQUssRUFBRTtBQUhPLEtBQVosQ0FBTjtBQU1BZCxJQUFBQSxNQUFNLENBQUNaLGtCQUFELENBQU4sQ0FBY29CLG9CQUFkLENBQ0ksY0FESixFQUVJUixNQUFNLENBQUNTLGdCQUFQLENBQXdCO0FBQ3BCTSxNQUFBQSxPQUFPLEVBQUVmLE1BQU0sQ0FBQ1MsZ0JBQVAsQ0FBd0I7QUFBRSx1QkFBZTtBQUFqQixPQUF4QjtBQURXLEtBQXhCLENBRko7QUFNSCxHQWZHLENBQUo7QUFpQkFYLEVBQUFBLElBQUksQ0FBQyx1Q0FBRCxFQUEwQyxZQUFZO0FBQ3REWixJQUFBQSxNQUFNLEdBQUcsSUFBSWEsMkJBQUosQ0FBb0JZLE1BQU0sQ0FBQ0MsTUFBUCxDQUFjO0FBQUVDLE1BQUFBLE9BQU8sRUFBRTtBQUFYLEtBQWQsRUFBaUNoQyxNQUFqQyxDQUFwQixDQUFUO0FBRUEsVUFBTUssTUFBTSxDQUFDZ0IsSUFBUCxDQUFZO0FBQ2RULE1BQUFBLE1BQU0sRUFBRSxNQURNO0FBRWRVLE1BQUFBLElBQUksRUFBRSxHQUZRO0FBR2RXLE1BQUFBLEtBQUssRUFBRTtBQUhPLEtBQVosQ0FBTjtBQU1BZCxJQUFBQSxNQUFNLENBQUNaLGtCQUFELENBQU4sQ0FBY29CLG9CQUFkLENBQ0ksY0FESixFQUVJUixNQUFNLENBQUNTLGdCQUFQLENBQXdCO0FBQ3BCTSxNQUFBQSxPQUFPLEVBQUVmLE1BQU0sQ0FBQ1MsZ0JBQVAsQ0FBd0I7QUFBRSxxQkFBYTtBQUFmLE9BQXhCO0FBRFcsS0FBeEIsQ0FGSjtBQU1ILEdBZkcsQ0FBSjtBQWlCQVgsRUFBQUEsSUFBSSxDQUFDLDJDQUFELEVBQThDLFlBQVk7QUFDMUQsVUFBTVosTUFBTSxDQUFDZ0IsSUFBUCxDQUFZO0FBQ2RULE1BQUFBLE1BQU0sRUFBRSxNQURNO0FBRWRVLE1BQUFBLElBQUksRUFBRSxHQUZRO0FBR2RXLE1BQUFBLEtBQUssRUFBRSxLQUhPO0FBSWRJLE1BQUFBLEtBQUssRUFBRTtBQUpPLEtBQVosQ0FBTjtBQU9BbEIsSUFBQUEsTUFBTSxDQUFDWixrQkFBRCxDQUFOLENBQWNvQixvQkFBZCxDQUNJLGNBREosRUFFSVIsTUFBTSxDQUFDUyxnQkFBUCxDQUF3QjtBQUNwQk0sTUFBQUEsT0FBTyxFQUFFZixNQUFNLENBQUNTLGdCQUFQLENBQXdCO0FBQUUseUJBQWlCO0FBQW5CLE9BQXhCO0FBRFcsS0FBeEIsQ0FGSjtBQU1ILEdBZEcsQ0FBSjtBQWdCQVgsRUFBQUEsSUFBSSxDQUFDLHVCQUFELEVBQTBCLFlBQVk7QUFDdENFLElBQUFBLE1BQU0sQ0FBQ21CLFVBQVAsQ0FBa0IsQ0FBbEI7O0FBRUEsUUFBSTtBQUNBLFlBQU1qQyxNQUFNLENBQUNnQixJQUFQLENBQVk7QUFDZFQsUUFBQUEsTUFBTSxFQUFFLFVBRE07QUFFZFUsUUFBQUEsSUFBSSxFQUFFO0FBRlEsT0FBWixDQUFOO0FBSUgsS0FMRCxDQUtFLE9BQU9pQixDQUFQLEVBQVU7QUFDUnBCLE1BQUFBLE1BQU0sQ0FBQ29CLENBQUMsQ0FBQ0MsT0FBSCxDQUFOLENBQWtCQyxPQUFsQixDQUEwQixZQUExQjtBQUNIO0FBQ0osR0FYRyxDQUFKO0FBYUF4QixFQUFBQSxJQUFJLENBQUMsc0JBQUQsRUFBeUIsWUFBWTtBQUNyQ0UsSUFBQUEsTUFBTSxDQUFDbUIsVUFBUCxDQUFrQixDQUFsQjs7QUFFQSxRQUFJO0FBQ0EsWUFBTWpDLE1BQU0sQ0FBQ2dCLElBQVAsQ0FBWTtBQUNkVCxRQUFBQSxNQUFNLEVBQUUsaUJBRE07QUFFZFUsUUFBQUEsSUFBSSxFQUFFO0FBRlEsT0FBWixDQUFOO0FBSUgsS0FMRCxDQUtFLE9BQU9pQixDQUFQLEVBQVU7QUFDUnBCLE1BQUFBLE1BQU0sQ0FBQ29CLENBQUMsQ0FBQ0MsT0FBSCxDQUFOLENBQWtCQyxPQUFsQixDQUEwQixhQUExQjtBQUNIO0FBQ0osR0FYRyxDQUFKO0FBWUgsQ0F2Sk8sQ0FBUiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAnamVzdCc7XG5pbXBvcnQgZmV0Y2gsIHsgUmVxdWVzdEluZm8sIFJlcXVlc3RJbml0LCBGZXRjaEVycm9yIH0gZnJvbSAnbm9kZS1mZXRjaCc7XG5pbXBvcnQgeyBOb2RlRmV0Y2hDbGllbnQgfSBmcm9tICcuL25vZGUtZmV0Y2guY2xpZW50JztcblxuY29uc3QgeyBSZXNwb25zZSB9ID0gamVzdC5yZXF1aXJlQWN0dWFsKCdub2RlLWZldGNoJyk7XG5qZXN0Lm1vY2soJ25vZGUtZmV0Y2gnKTtcblxuY29uc3QgQ09ORklHID0ge1xuICAgIHVybDogJ2h0dHBzOi8vZm9vJyxcbiAgICBjbGllbnRJZDogJ215LWFwcDpkZWZhdWx0JyxcbiAgICBjbGllbnRTZWNyZXQ6ICdTRUtSSVQnLFxufTtcblxuZGVzY3JpYmUoJ05vZGUgRmV0Y2ggQ2xpZW50IHNob3VsZC4uLicsICgpID0+IHtcbiAgICBsZXQgY2xpZW50OiBOb2RlRmV0Y2hDbGllbnQ7XG5cbiAgICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICAgICAgLy8gTW9jayByZXNwb25zZSBmcm9tIG5vZGUtZmV0Y2hcbiAgICAgICAgKGZldGNoIGFzIGplc3QuTW9ja2VkRnVuY3Rpb248dHlwZW9mIGZldGNoPikubW9ja0ltcGxlbWVudGF0aW9uKFxuICAgICAgICAgICAgYXN5bmMgKHVybDogUmVxdWVzdEluZm8sIGluaXQ/OiBSZXF1ZXN0SW5pdCkgPT4ge1xuICAgICAgICAgICAgICAgIGxldCBzdGF0dXMgPSAyMDA7XG4gICAgICAgICAgICAgICAgbGV0IHN0YXR1c1RleHQgPSAnT0snO1xuXG4gICAgICAgICAgICAgICAgaWYgKGluaXQubWV0aG9kID09PSAnVEVTVC01MDAnKSB7XG4gICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IDUwMDtcbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzVGV4dCA9ICdTb21ldGhpbmcgd2VudCB3cm9uZyAoSFRUUCknO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChpbml0Lm1ldGhvZCA9PT0gJ1RFU1QtRkVUQ0hFUlJPUicpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEZldGNoRXJyb3IoJ1NvbWV0aGluZyB3ZW50IHdyb25nIChGRVRDSCknLCAnVEVTVCcpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gbmV3IFJlc3BvbnNlKFxuICAgICAgICAgICAgICAgICAgICBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICAgICAgICAgICAgICB0ZXN0OiAnVEVTVCcsXG4gICAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMsXG4gICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXNUZXh0LFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzcG9uc2U7XG4gICAgICAgICAgICB9LFxuICAgICAgICApO1xuXG4gICAgICAgIGNsaWVudCA9IG5ldyBOb2RlRmV0Y2hDbGllbnQoQ09ORklHKTtcbiAgICB9KTtcblxuICAgIHRlc3QoJ2V4aXN0JywgKCkgPT4ge1xuICAgICAgICBleHBlY3QoTm9kZUZldGNoQ2xpZW50KS50b0JlRGVmaW5lZCgpO1xuICAgIH0pO1xuXG4gICAgdGVzdCgnc2VuZCBwYXJhbXMgYXMga2V5LXZhbHVlIHBhaXJzIGZvciBmb3JtLXVybGVuY29kZWQgY29udGVudFR5cGUnLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIGF3YWl0IGNsaWVudC5zZW5kKHtcbiAgICAgICAgICAgIG1ldGhvZDogJ1RFU1QnLFxuICAgICAgICAgICAgcGF0aDogJy8nLFxuICAgICAgICAgICAgY29udGVudFR5cGU6ICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnLFxuICAgICAgICAgICAgZGF0YToge1xuICAgICAgICAgICAgICAgIGE6ICdiJyxcbiAgICAgICAgICAgICAgICB4OiAneScsXG4gICAgICAgICAgICB9LFxuICAgICAgICB9KTtcblxuICAgICAgICBleHBlY3QoZmV0Y2gpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKFxuICAgICAgICAgICAgJ2h0dHBzOi8vZm9vLycsXG4gICAgICAgICAgICBleHBlY3Qub2JqZWN0Q29udGFpbmluZyh7XG4gICAgICAgICAgICAgICAgYm9keTogJ2E9YiZ4PXknLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICk7XG4gICAgfSk7XG5cbiAgICB0ZXN0KCdzZW5kIEJlYXJlciBoZWFkZXIgd2hlbiB0b2tlbiBwcm92aWRlZCcsIGFzeW5jICgpID0+IHtcbiAgICAgICAgY2xpZW50ID0gbmV3IE5vZGVGZXRjaENsaWVudChPYmplY3QuYXNzaWduKHsgZmxhdHRlbjogdHJ1ZSB9LCBDT05GSUcpKTtcblxuICAgICAgICBhd2FpdCBjbGllbnQuc2VuZCh7XG4gICAgICAgICAgICBtZXRob2Q6ICdURVNUJyxcbiAgICAgICAgICAgIHBhdGg6ICcvJyxcbiAgICAgICAgICAgIHRva2VuOiAnYWJjJyxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgZXhwZWN0KGZldGNoKS50b0hhdmVCZWVuQ2FsbGVkV2l0aChcbiAgICAgICAgICAgICdodHRwczovL2Zvby8nLFxuICAgICAgICAgICAgZXhwZWN0Lm9iamVjdENvbnRhaW5pbmcoe1xuICAgICAgICAgICAgICAgIGhlYWRlcnM6IGV4cGVjdC5vYmplY3RDb250YWluaW5nKHsgQXV0aG9yaXphdGlvbjogJ0JlYXJlciBhYmMnIH0pLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICk7XG4gICAgfSk7XG5cbiAgICB0ZXN0KCdzZW5kIFgtTGFuZ3VhZ2VzIGhlYWRlciB3aGVuIGNvbmZpZ3VyZWQnLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIGNsaWVudCA9IG5ldyBOb2RlRmV0Y2hDbGllbnQoT2JqZWN0LmFzc2lnbih7IGxhbmd1YWdlczogWydlbicsICdlcyddIH0sIENPTkZJRykpO1xuXG4gICAgICAgIGF3YWl0IGNsaWVudC5zZW5kKHtcbiAgICAgICAgICAgIG1ldGhvZDogJ1RFU1QnLFxuICAgICAgICAgICAgcGF0aDogJy8nLFxuICAgICAgICAgICAgdG9rZW46ICdhYmMnLFxuICAgICAgICB9KTtcblxuICAgICAgICBleHBlY3QoZmV0Y2gpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKFxuICAgICAgICAgICAgJ2h0dHBzOi8vZm9vLycsXG4gICAgICAgICAgICBleHBlY3Qub2JqZWN0Q29udGFpbmluZyh7XG4gICAgICAgICAgICAgICAgaGVhZGVyczogZXhwZWN0Lm9iamVjdENvbnRhaW5pbmcoeyAnWC1MYW5ndWFnZXMnOiAnZW4sZXMnIH0pLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICk7XG4gICAgfSk7XG5cbiAgICB0ZXN0KCdzZW5kIFgtRmxhdHRlbiBoZWFkZXIgd2hlbiBjb25maWd1cmVkJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICBjbGllbnQgPSBuZXcgTm9kZUZldGNoQ2xpZW50KE9iamVjdC5hc3NpZ24oeyBmbGF0dGVuOiB0cnVlIH0sIENPTkZJRykpO1xuXG4gICAgICAgIGF3YWl0IGNsaWVudC5zZW5kKHtcbiAgICAgICAgICAgIG1ldGhvZDogJ1RFU1QnLFxuICAgICAgICAgICAgcGF0aDogJy8nLFxuICAgICAgICAgICAgdG9rZW46ICdhYmMnLFxuICAgICAgICB9KTtcblxuICAgICAgICBleHBlY3QoZmV0Y2gpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKFxuICAgICAgICAgICAgJ2h0dHBzOi8vZm9vLycsXG4gICAgICAgICAgICBleHBlY3Qub2JqZWN0Q29udGFpbmluZyh7XG4gICAgICAgICAgICAgICAgaGVhZGVyczogZXhwZWN0Lm9iamVjdENvbnRhaW5pbmcoeyAnWC1GbGF0dGVuJzogJ3RydWUnIH0pLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICk7XG4gICAgfSk7XG5cbiAgICB0ZXN0KCdzZW5kIFgtVW5wdWJsaXNoZWQgaGVhZGVyIHdoZW4gY29uZmlndXJlZCcsIGFzeW5jICgpID0+IHtcbiAgICAgICAgYXdhaXQgY2xpZW50LnNlbmQoe1xuICAgICAgICAgICAgbWV0aG9kOiAnVEVTVCcsXG4gICAgICAgICAgICBwYXRoOiAnLycsXG4gICAgICAgICAgICB0b2tlbjogJ2FiYycsXG4gICAgICAgICAgICBkcmFmdDogdHJ1ZSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgZXhwZWN0KGZldGNoKS50b0hhdmVCZWVuQ2FsbGVkV2l0aChcbiAgICAgICAgICAgICdodHRwczovL2Zvby8nLFxuICAgICAgICAgICAgZXhwZWN0Lm9iamVjdENvbnRhaW5pbmcoe1xuICAgICAgICAgICAgICAgIGhlYWRlcnM6IGV4cGVjdC5vYmplY3RDb250YWluaW5nKHsgJ1gtVW5wdWJsaXNoZWQnOiAndHJ1ZScgfSksXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgKTtcbiAgICB9KTtcblxuICAgIHRlc3QoJ2hhbmRsZXMgc2VydmVyIGVycm9ycycsIGFzeW5jICgpID0+IHtcbiAgICAgICAgZXhwZWN0LmFzc2VydGlvbnMoMSk7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGF3YWl0IGNsaWVudC5zZW5kKHtcbiAgICAgICAgICAgICAgICBtZXRob2Q6ICdURVNULTUwMCcsXG4gICAgICAgICAgICAgICAgcGF0aDogJy8nLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGV4cGVjdChlLm1lc3NhZ2UpLnRvTWF0Y2goL0hUVFAgZXJyb3IvKTtcbiAgICAgICAgfVxuICAgIH0pO1xuXG4gICAgdGVzdCgnaGFuZGxlcyBmZXRjaCBlcnJvcnMnLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIGV4cGVjdC5hc3NlcnRpb25zKDEpO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCBjbGllbnQuc2VuZCh7XG4gICAgICAgICAgICAgICAgbWV0aG9kOiAnVEVTVC1GRVRDSEVSUk9SJyxcbiAgICAgICAgICAgICAgICBwYXRoOiAnLycsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgZXhwZWN0KGUubWVzc2FnZSkudG9NYXRjaCgvRmV0Y2ggZXJyb3IvKTtcbiAgICAgICAgfVxuICAgIH0pO1xufSk7XG4iXX0=