funval
Version:
A minimalist library for data validation using functions interfaces.
234 lines (130 loc) • 25.9 kB
JavaScript
require("mocha");
var _chai = require("chai");
var _chaiAsPromised = _interopRequireDefault(require("chai-as-promised"));
var _schema = require("./schema");
var _Schema = _interopRequireWildcard(require("../Schema"));
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; }
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
(0, _chai.use)(_chaiAsPromised.default);
describe('schema', () => {
it('Maybe', () => {
const foo = (0, _schema.Maybe)('foo');
_chai.assert.equal(foo('foo'), 'foo');
_chai.assert.equal(foo(), undefined);
_chai.assert.equal(foo(undefined), undefined); // eslint-disable-next-line @typescript-eslint/no-explicit-any
_chai.assert.throws(() => foo(null), TypeError); // eslint-disable-next-line @typescript-eslint/no-explicit-any
_chai.assert.throws(() => foo('foo2'), TypeError);
});
it('Optional', () => {
const foo = (0, _schema.Optional)('foo');
_chai.assert.equal(foo('foo'), 'foo');
_chai.assert.equal(foo(), undefined);
_chai.assert.equal(foo(undefined), undefined);
_chai.assert.equal(foo(null), undefined); // eslint-disable-next-line @typescript-eslint/no-explicit-any
_chai.assert.throws(() => foo('foo2'), TypeError);
});
it('Default', () => {
const foo = (0, _schema.Default)('foo', 123);
_chai.assert.equal(foo('foo'), 'foo');
_chai.assert.equal(foo(), 123);
_chai.assert.equal(foo(undefined), 123); // eslint-disable-next-line @typescript-eslint/no-explicit-any
_chai.assert.throws(() => foo(null), TypeError); // eslint-disable-next-line @typescript-eslint/no-explicit-any
_chai.assert.throws(() => foo(123), TypeError); // eslint-disable-next-line @typescript-eslint/no-explicit-any
_chai.assert.throws(() => foo('foo2'), TypeError);
});
it('Required', () => {
const foo = (0, _schema.Required)('foo');
_chai.assert.equal(foo('foo'), 'foo'); // eslint-disable-next-line @typescript-eslint/no-explicit-any
_chai.assert.throws(() => foo(null), TypeError); // eslint-disable-next-line @typescript-eslint/no-explicit-any
_chai.assert.throws(() => foo(undefined), TypeError); // eslint-disable-next-line @typescript-eslint/ban-ts-ignore
// @ts-ignore
_chai.assert.throws(() => foo(), TypeError); // eslint-disable-next-line @typescript-eslint/no-explicit-any
_chai.assert.throws(() => foo('foo2'), TypeError);
});
it('Truthy', () => {
_chai.assert.equal((0, _schema.Truthy)('123'), '123');
_chai.assert.equal((0, _schema.Truthy)(1), 1);
_chai.assert.throws(() => (0, _schema.Truthy)(0), TypeError);
_chai.assert.throws(() => (0, _schema.Truthy)(false), TypeError);
_chai.assert.throws(() => (0, _schema.Truthy)(''), TypeError);
_chai.assert.throws(() => (0, _schema.Truthy)(undefined), TypeError);
_chai.assert.throws(() => (0, _schema.Truthy)(null), TypeError);
});
describe('Or', () => {
it('foo', () => {
const foo = (0, _schema.Or)('foo');
_chai.assert.equal(foo('foo'), 'foo'); // eslint-disable-next-line @typescript-eslint/no-explicit-any
_chai.assert.throws(() => foo('hello'), TypeError); // eslint-disable-next-line @typescript-eslint/no-explicit-any
_chai.assert.throws(() => foo(undefined), TypeError);
});
it('foo | bar', () => {
const fooBar = (0, _schema.Or)('foo', 'bar');
_chai.assert.equal(fooBar('foo'), 'foo');
_chai.assert.equal(fooBar('bar'), 'bar'); // eslint-disable-next-line @typescript-eslint/no-explicit-any
_chai.assert.throws(() => fooBar('hello'), TypeError); // eslint-disable-next-line @typescript-eslint/no-explicit-any
_chai.assert.throws(() => fooBar(undefined), TypeError);
});
it('foo | bar | 123', () => {
const fooBar = (0, _schema.Or)('foo', 'bar', 123);
_chai.assert.equal(fooBar('foo'), 'foo');
_chai.assert.equal(fooBar('bar'), 'bar');
_chai.assert.equal(fooBar(123), 123); // eslint-disable-next-line @typescript-eslint/no-explicit-any
_chai.assert.throws(() => fooBar('hello'), TypeError); // eslint-disable-next-line @typescript-eslint/no-explicit-any
_chai.assert.throws(() => fooBar(12), TypeError); // eslint-disable-next-line @typescript-eslint/no-explicit-any
_chai.assert.throws(() => fooBar(undefined), TypeError);
});
it('foo | Async(bar)', async () => {
const fooBar = (0, _schema.Or)('foo', (0, _Schema.Async)((0, _Schema.default)('bar')));
_chai.assert.equal(fooBar('foo'), 'foo');
_chai.assert.instanceOf(fooBar('bar'), Promise);
_chai.assert.equal((await fooBar('bar')), 'bar'); // eslint-disable-next-line @typescript-eslint/no-explicit-any
await _chai.assert.isRejected(fooBar('hello')); // eslint-disable-next-line @typescript-eslint/no-explicit-any
await _chai.assert.isRejected(fooBar(12)); // eslint-disable-next-line @typescript-eslint/no-explicit-any
await _chai.assert.isRejected(fooBar(undefined));
});
});
it('ArrayOf', () => {
const foo = (0, _schema.ArrayOf)('foo');
_chai.assert.deepEqual(foo(['foo']), ['foo']);
_chai.assert.deepEqual(foo(['foo', 'foo']), ['foo', 'foo']);
_chai.assert.deepEqual(foo([]), []); // eslint-disable-next-line @typescript-eslint/no-explicit-any
_chai.assert.throws(() => foo(['bar']), TypeError); // eslint-disable-next-line @typescript-eslint/no-explicit-any
_chai.assert.throws(() => foo(['foo', 'bar']), TypeError);
});
it('TypeOf', () => {
const str = (0, _schema.TypeOf)('string');
_chai.assert.equal(str('foo'), 'foo');
_chai.assert.equal(str('bar'), 'bar'); // eslint-disable-next-line @typescript-eslint/no-explicit-any
_chai.assert.throws(() => str(['bar']), TypeError); // eslint-disable-next-line @typescript-eslint/no-explicit-any
_chai.assert.throws(() => str(123), TypeError); // eslint-disable-next-line @typescript-eslint/no-explicit-any
_chai.assert.throws(() => str(null), TypeError);
});
it('Any', () => {
_chai.assert.equal((0, _schema.Any)('foo'), 'foo');
_chai.assert.equal((0, _schema.Any)('bar'), 'bar');
_chai.assert.equal((0, _schema.Any)(123), 123);
_chai.assert.deepEqual((0, _schema.Any)([1, 2, 3]), [1, 2, 3]);
_chai.assert.equal((0, _schema.Any)(undefined), undefined);
_chai.assert.equal((0, _schema.Any)(null), null);
const objRef = {};
_chai.assert.equal((0, _schema.Any)(objRef), objRef);
});
it('Override', () => {
const foo = (0, _schema.Override)('foo');
_chai.assert.equal(foo('foo'), 'foo');
_chai.assert.equal(foo('bar'), 'foo');
_chai.assert.equal(foo(), 'foo');
_chai.assert.equal(foo(null), 'foo');
_chai.assert.equal(foo(undefined), 'foo');
_chai.assert.equal(foo({}), 'foo');
});
it('Test', () => {
const foo = (0, _schema.Test)(input => input > 10);
_chai.assert.equal(foo(12), 12);
_chai.assert.throws(() => foo(1), TypeError);
_chai.assert.throws(() => foo(NaN), TypeError);
});
});
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy92YWxpZGF0b3JzL3NjaGVtYS50ZXN0LnRzIl0sIm5hbWVzIjpbImNoYWlBc1Byb21pc2VkIiwiZGVzY3JpYmUiLCJpdCIsImZvbyIsImFzc2VydCIsImVxdWFsIiwidW5kZWZpbmVkIiwidGhyb3dzIiwiVHlwZUVycm9yIiwiZm9vQmFyIiwiaW5zdGFuY2VPZiIsIlByb21pc2UiLCJpc1JlamVjdGVkIiwiZGVlcEVxdWFsIiwic3RyIiwib2JqUmVmIiwiaW5wdXQiLCJOYU4iXSwibWFwcGluZ3MiOiI7O0FBQUE7O0FBQ0E7O0FBQ0E7O0FBSUE7O0FBYUE7Ozs7Ozs7O0FBZkEsZUFBSUEsdUJBQUo7QUFpQkFDLFFBQVEsQ0FBQyxRQUFELEVBQVcsTUFBTTtBQUN2QkMsRUFBQUEsRUFBRSxDQUFDLE9BQUQsRUFBVSxNQUFNO0FBQ2hCLFVBQU1DLEdBQUcsR0FBRyxtQkFBTSxLQUFOLENBQVo7O0FBRUFDLGlCQUFPQyxLQUFQLENBQWFGLEdBQUcsQ0FBQyxLQUFELENBQWhCLEVBQXlCLEtBQXpCOztBQUNBQyxpQkFBT0MsS0FBUCxDQUFhRixHQUFHLEVBQWhCLEVBQW9CRyxTQUFwQjs7QUFDQUYsaUJBQU9DLEtBQVAsQ0FBYUYsR0FBRyxDQUFDRyxTQUFELENBQWhCLEVBQTZCQSxTQUE3QixFQUxnQixDQU9oQjs7O0FBQ0FGLGlCQUFPRyxNQUFQLENBQWMsTUFBTUosR0FBRyxDQUFDLElBQUQsQ0FBdkIsRUFBc0NLLFNBQXRDLEVBUmdCLENBU2hCOzs7QUFDQUosaUJBQU9HLE1BQVAsQ0FBYyxNQUFNSixHQUFHLENBQUMsTUFBRCxDQUF2QixFQUF3Q0ssU0FBeEM7QUFDRCxHQVhDLENBQUY7QUFhQU4sRUFBQUEsRUFBRSxDQUFDLFVBQUQsRUFBYSxNQUFNO0FBQ25CLFVBQU1DLEdBQUcsR0FBRyxzQkFBUyxLQUFULENBQVo7O0FBRUFDLGlCQUFPQyxLQUFQLENBQWFGLEdBQUcsQ0FBQyxLQUFELENBQWhCLEVBQXlCLEtBQXpCOztBQUNBQyxp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QUcsRUFBaEMsQ0FBWjs7QUFFQVosaUJBQU9DLEtBQVAsQ0FBYUYsR0FBRyxDQUFDLEVBQUQsQ0FBaEIsRUFBc0IsRUFBdEI7O0FBRUFDLGlCQUFPRyxNQUFQLENBQWMsTUFBTUosR0FBRyxDQUFDLENBQUQsQ0FBdkIsRUFBNEJLLFNBQTVCOztBQUNBSixpQkFBT0csTUFBUCxDQUFjLE1BQU1KLEdBQUcsQ0FBQ2MsR0FBRCxDQUF2QixFQUE4QlQsU0FBOUI7QUFDRCxHQVBDLENBQUY7QUFRRCxDQW5NTyxDQUFSIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICdtb2NoYSc7XG5pbXBvcnQgeyBhc3NlcnQsIHVzZSB9IGZyb20gJ2NoYWknO1xuaW1wb3J0IGNoYWlBc1Byb21pc2VkIGZyb20gJ2NoYWktYXMtcHJvbWlzZWQnO1xuXG51c2UoY2hhaUFzUHJvbWlzZWQpO1xuXG5pbXBvcnQge1xuICBBbnksXG4gIEFycmF5T2YsXG4gIERlZmF1bHQsXG4gIE1heWJlLFxuICBPcHRpb25hbCxcbiAgT3IsXG4gIE92ZXJyaWRlLFxuICBSZXF1aXJlZCxcbiAgVGVzdCxcbiAgVHJ1dGh5LFxuICBUeXBlT2YsXG59IGZyb20gJy4vc2NoZW1hJztcbmltcG9ydCBTY2hlbWEsIHsgQXN5bmMgfSBmcm9tICcuLi9TY2hlbWEnO1xuXG5kZXNjcmliZSgnc2NoZW1hJywgKCkgPT4ge1xuICBpdCgnTWF5YmUnLCAoKSA9PiB7XG4gICAgY29uc3QgZm9vID0gTWF5YmUoJ2ZvbycgYXMgJ2ZvbycpO1xuXG4gICAgYXNzZXJ0LmVxdWFsKGZvbygnZm9vJyksICdmb28nKTtcbiAgICBhc3NlcnQuZXF1YWwoZm9vKCksIHVuZGVmaW5lZCk7XG4gICAgYXNzZXJ0LmVxdWFsKGZvbyh1bmRlZmluZWQpLCB1bmRlZmluZWQpO1xuXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICBhc3NlcnQudGhyb3dzKCgpID0+IGZvbyhudWxsIGFzIGFueSksIFR5cGVFcnJvcik7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICBhc3NlcnQudGhyb3dzKCgpID0+IGZvbygnZm9vMicgYXMgYW55KSwgVHlwZUVycm9yKTtcbiAgfSk7XG5cbiAgaXQoJ09wdGlvbmFsJywgKCkgPT4ge1xuICAgIGNvbnN0IGZvbyA9IE9wdGlvbmFsKCdmb28nIGFzICdmb28nKTtcblxuICAgIGFzc2VydC5lcXVhbChmb28oJ2ZvbycpLCAnZm9vJyk7XG4gICAgYXNzZXJ0LmVxdWFsKGZvbygpLCB1bmRlZmluZWQpO1xuICAgIGFzc2VydC5lcXVhbChmb28odW5kZWZpbmVkKSwgdW5kZWZpbmVkKTtcbiAgICBhc3NlcnQuZXF1YWwoZm9vKG51bGwpLCB1bmRlZmluZWQpO1xuXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICBhc3NlcnQudGhyb3dzKCgpID0+IGZvbygnZm9vMicgYXMgYW55KSwgVHlwZUVycm9yKTtcbiAgfSk7XG5cbiAgaXQoJ0RlZmF1bHQnLCAoKSA9PiB7XG4gICAgY29uc3QgZm9vID0gRGVmYXVsdCgnZm9vJyBhcyAnZm9vJywgMTIzKTtcblxuICAgIGFzc2VydC5lcXVhbChmb28oJ2ZvbycpLCAnZm9vJyk7XG4gICAgYXNzZXJ0LmVxdWFsKGZvbygpLCAxMjMpO1xuICAgIGFzc2VydC5lcXVhbChmb28odW5kZWZpbmVkKSwgMTIzKTtcblxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgYXNzZXJ0LnRocm93cygoKSA9PiBmb28obnVsbCBhcyBhbnkpLCBUeXBlRXJyb3IpO1xuXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICBhc3NlcnQudGhyb3dzKCgpID0+IGZvbygxMjMgYXMgYW55KSwgVHlwZUVycm9yKTtcblxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgYXNzZXJ0LnRocm93cygoKSA9PiBmb28oJ2ZvbzInIGFzIGFueSksIFR5cGVFcnJvcik7XG4gIH0pO1xuXG4gIGl0KCdSZXF1aXJlZCcsICgpID0+IHtcbiAgICBjb25zdCBmb28gPSBSZXF1aXJlZCgnZm9vJyBhcyAnZm9vJyk7XG5cbiAgICBhc3NlcnQuZXF1YWwoZm9vKCdmb28nKSwgJ2ZvbycpO1xuXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICBhc3NlcnQudGhyb3dzKCgpID0+IGZvbyhudWxsIGFzIGFueSksIFR5cGVFcnJvcik7XG5cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgIGFzc2VydC50aHJvd3MoKCkgPT4gZm9vKHVuZGVmaW5lZCBhcyBhbnkpLCBUeXBlRXJyb3IpO1xuXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9iYW4tdHMtaWdub3JlXG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIGFzc2VydC50aHJvd3MoKCkgPT4gZm9vKCksIFR5cGVFcnJvcik7XG5cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgIGFzc2VydC50aHJvd3MoKCkgPT4gZm9vKCdmb28yJyBhcyBhbnkpLCBUeXBlRXJyb3IpO1xuICB9KTtcblxuICBpdCgnVHJ1dGh5JywgKCkgPT4ge1xuICAgIGFzc2VydC5lcXVhbChUcnV0aHkoJzEyMycpLCAnMTIzJyk7XG4gICAgYXNzZXJ0LmVxdWFsKFRydXRoeSgxKSwgMSk7XG5cbiAgICBhc3NlcnQudGhyb3dzKCgpID0+IFRydXRoeSgwKSwgVHlwZUVycm9yKTtcbiAgICBhc3NlcnQudGhyb3dzKCgpID0+IFRydXRoeShmYWxzZSksIFR5cGVFcnJvcik7XG4gICAgYXNzZXJ0LnRocm93cygoKSA9PiBUcnV0aHkoJycpLCBUeXBlRXJyb3IpO1xuICAgIGFzc2VydC50aHJvd3MoKCkgPT4gVHJ1dGh5KHVuZGVmaW5lZCksIFR5cGVFcnJvcik7XG4gICAgYXNzZXJ0LnRocm93cygoKSA9PiBUcnV0aHkobnVsbCksIFR5cGVFcnJvcik7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdPcicsICgpID0+IHtcbiAgICBpdCgnZm9vJywgKCkgPT4ge1xuICAgICAgY29uc3QgZm9vID0gT3IoJ2ZvbycgYXMgJ2ZvbycpO1xuXG4gICAgICBhc3NlcnQuZXF1YWwoZm9vKCdmb28nKSwgJ2ZvbycpO1xuXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgICAgYXNzZXJ0LnRocm93cygoKSA9PiBmb28oJ2hlbGxvJyBhcyBhbnkpLCBUeXBlRXJyb3IpO1xuXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgICAgYXNzZXJ0LnRocm93cygoKSA9PiBmb28odW5kZWZpbmVkIGFzIGFueSksIFR5cGVFcnJvcik7XG4gICAgfSk7XG5cbiAgICBpdCgnZm9vIHwgYmFyJywgKCkgPT4ge1xuICAgICAgY29uc3QgZm9vQmFyID0gT3IoJ2ZvbycgYXMgJ2ZvbycsICdiYXInIGFzICdiYXInKTtcblxuICAgICAgYXNzZXJ0LmVxdWFsKGZvb0JhcignZm9vJyksICdmb28nKTtcbiAgICAgIGFzc2VydC5lcXVhbChmb29CYXIoJ2JhcicpLCAnYmFyJyk7XG5cbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICBhc3NlcnQudGhyb3dzKCgpID0+IGZvb0JhcignaGVsbG8nIGFzIGFueSksIFR5cGVFcnJvcik7XG5cbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICBhc3NlcnQudGhyb3dzKCgpID0+IGZvb0Jhcih1bmRlZmluZWQgYXMgYW55KSwgVHlwZUVycm9yKTtcbiAgICB9KTtcblxuICAgIGl0KCdmb28gfCBiYXIgfCAxMjMnLCAoKSA9PiB7XG4gICAgICBjb25zdCBmb29CYXIgPSBPcignZm9vJyBhcyAnZm9vJywgJ2JhcicgYXMgJ2JhcicsIDEyMyBhcyAxMjMpO1xuXG4gICAgICBhc3NlcnQuZXF1YWwoZm9vQmFyKCdmb28nKSwgJ2ZvbycpO1xuICAgICAgYXNzZXJ0LmVxdWFsKGZvb0JhcignYmFyJyksICdiYXInKTtcbiAgICAgIGFzc2VydC5lcXVhbChmb29CYXIoMTIzKSwgMTIzKTtcblxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgIGFzc2VydC50aHJvd3MoKCkgPT4gZm9vQmFyKCdoZWxsbycgYXMgYW55KSwgVHlwZUVycm9yKTtcblxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgIGFzc2VydC50aHJvd3MoKCkgPT4gZm9vQmFyKDEyIGFzIGFueSksIFR5cGVFcnJvcik7XG5cbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICBhc3NlcnQudGhyb3dzKCgpID0+IGZvb0Jhcih1bmRlZmluZWQgYXMgYW55KSwgVHlwZUVycm9yKTtcbiAgICB9KTtcblxuICAgIGl0KCdmb28gfCBBc3luYyhiYXIpJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgZm9vQmFyID0gT3IoJ2ZvbycgYXMgJ2ZvbycsIEFzeW5jKFNjaGVtYSgnYmFyJyBhcyAnYmFyJykpKTtcblxuICAgICAgYXNzZXJ0LmVxdWFsKGZvb0JhcignZm9vJyksICdmb28nKTtcbiAgICAgIGFzc2VydC5pbnN0YW5jZU9mKGZvb0JhcignYmFyJyksIFByb21pc2UpO1xuICAgICAgYXNzZXJ0LmVxdWFsKGF3YWl0IGZvb0JhcignYmFyJyksICdiYXInKTtcblxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgIGF3YWl0IGFzc2VydC5pc1JlamVjdGVkKGZvb0JhcignaGVsbG8nIGFzIGFueSkgYXMgUHJvbWlzZUxpa2U8YW55Pik7XG5cbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICBhd2FpdCBhc3NlcnQuaXNSZWplY3RlZChmb29CYXIoMTIgYXMgYW55KSBhcyBQcm9taXNlTGlrZTxhbnk+KTtcblxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgIGF3YWl0IGFzc2VydC5pc1JlamVjdGVkKGZvb0Jhcih1bmRlZmluZWQgYXMgYW55KSBhcyBQcm9taXNlTGlrZTxhbnk+KTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgaXQoJ0FycmF5T2YnLCAoKSA9PiB7XG4gICAgY29uc3QgZm9vID0gQXJyYXlPZignZm9vJyBhcyAnZm9vJyk7XG5cbiAgICBhc3NlcnQuZGVlcEVxdWFsKGZvbyhbJ2ZvbyddKSwgWydmb28nXSk7XG4gICAgYXNzZXJ0LmRlZXBFcXVhbChmb28oWydmb28nLCAnZm9vJ10pLCBbJ2ZvbycsICdmb28nXSk7XG4gICAgYXNzZXJ0LmRlZXBFcXVhbChmb28oW10pLCBbXSk7XG5cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgIGFzc2VydC50aHJvd3MoKCkgPT4gZm9vKFsnYmFyJyBhcyBhbnldKSwgVHlwZUVycm9yKTtcblxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgYXNzZXJ0LnRocm93cygoKSA9PiBmb28oWydmb28nLCAnYmFyJyBhcyBhbnldKSwgVHlwZUVycm9yKTtcbiAgfSk7XG5cbiAgaXQoJ1R5cGVPZicsICgpID0+IHtcbiAgICBjb25zdCBzdHIgPSBUeXBlT2YoJ3N0cmluZycpO1xuXG4gICAgYXNzZXJ0LmVxdWFsKHN0cignZm9vJyksICdmb28nKTtcbiAgICBhc3NlcnQuZXF1YWwoc3RyKCdiYXInKSwgJ2JhcicpO1xuXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICBhc3NlcnQudGhyb3dzKCgpID0+IHN0cihbJ2JhciddIGFzIGFueSksIFR5cGVFcnJvcik7XG5cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgIGFzc2VydC50aHJvd3MoKCkgPT4gc3RyKDEyMyBhcyBhbnkpLCBUeXBlRXJyb3IpO1xuXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICBhc3NlcnQudGhyb3dzKCgpID0+IHN0cihudWxsIGFzIGFueSksIFR5cGVFcnJvcik7XG4gIH0pO1xuXG4gIGl0KCdBbnknLCAoKSA9PiB7XG4gICAgYXNzZXJ0LmVxdWFsKEFueSgnZm9vJyksICdmb28nKTtcbiAgICBhc3NlcnQuZXF1YWwoQW55KCdiYXInKSwgJ2JhcicpO1xuICAgIGFzc2VydC5lcXVhbChBbnkoMTIzKSwgMTIzKTtcbiAgICBhc3NlcnQuZGVlcEVxdWFsKEFueShbMSwgMiwgM10pLCBbMSwgMiwgM10pO1xuICAgIGFzc2VydC5lcXVhbChBbnkodW5kZWZpbmVkKSwgdW5kZWZpbmVkKTtcbiAgICBhc3NlcnQuZXF1YWwoQW55KG51bGwpLCBudWxsKTtcblxuICAgIGNvbnN0IG9ialJlZiA9IHt9O1xuICAgIGFzc2VydC5lcXVhbChBbnkob2JqUmVmKSwgb2JqUmVmKTtcbiAgfSk7XG5cbiAgaXQoJ092ZXJyaWRlJywgKCkgPT4ge1xuICAgIGNvbnN0IGZvbyA9IE92ZXJyaWRlKCdmb28nKTtcblxuICAgIGFzc2VydC5lcXVhbChmb28oJ2ZvbycpLCAnZm9vJyk7XG4gICAgYXNzZXJ0LmVxdWFsKGZvbygnYmFyJyksICdmb28nKTtcbiAgICBhc3NlcnQuZXF1YWwoZm9vKCksICdmb28nKTtcbiAgICBhc3NlcnQuZXF1YWwoZm9vKG51bGwpLCAnZm9vJyk7XG4gICAgYXNzZXJ0LmVxdWFsKGZvbyh1bmRlZmluZWQpLCAnZm9vJyk7XG4gICAgYXNzZXJ0LmVxdWFsKGZvbyh7fSksICdmb28nKTtcbiAgfSk7XG5cbiAgaXQoJ1Rlc3QnLCAoKSA9PiB7XG4gICAgY29uc3QgZm9vID0gVGVzdCgoaW5wdXQ6IG51bWJlcikgPT4gaW5wdXQgPiAxMCk7XG5cbiAgICBhc3NlcnQuZXF1YWwoZm9vKDEyKSwgMTIpO1xuXG4gICAgYXNzZXJ0LnRocm93cygoKSA9PiBmb28oMSksIFR5cGVFcnJvcik7XG4gICAgYXNzZXJ0LnRocm93cygoKSA9PiBmb28oTmFOKSwgVHlwZUVycm9yKTtcbiAgfSk7XG59KTtcbiJdfQ==
;