UNPKG

computed-types

Version:

Runtime validation types for TypeScript.

342 lines (229 loc) 39.5 kB
"use strict"; require("mocha"); var _chai = require("chai"); var _utils = require("./schema/utils"); var _Validator = _interopRequireDefault(require("./Validator")); var _chaiAsPromised = _interopRequireDefault(require("chai-as-promised")); var _errors = require("./schema/errors"); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } (0, _chai.use)(_chaiAsPromised.default); /* eslint-disable @typescript-eslint/no-explicit-any */ describe('Validator', () => { describe('positiveNumber', () => { const positiveNumber = new _Validator.default(number => { if (typeof number !== 'number') { throw new _errors.ValidationError('Expected type to be number'); } if (number <= 0) { throw new RangeError(`Expected number to be positive`); } return number; }).proxy(); it('Types', () => { (0, _utils.typeCheck)('ok'); (0, _utils.typeCheck)('ok'); }); it('()', () => { const res = positiveNumber(1); (0, _utils.typeCheck)('ok'); _chai.assert.equal(positiveNumber(1), 1); _chai.assert.equal(positiveNumber(100), 100); _chai.assert.throws(() => positiveNumber(0), RangeError); _chai.assert.throws(() => positiveNumber(-6), RangeError); _chai.assert.throws(() => positiveNumber(undefined), _errors.ValidationError); _chai.assert.throws(() => positiveNumber(null), _errors.ValidationError); _chai.assert.throws(() => positiveNumber({}), _errors.ValidationError); _chai.assert.throws(() => positiveNumber('5'), _errors.ValidationError); }); it('.test()', () => { _chai.assert.equal(positiveNumber.test(num => num < 100)(4), 4); _chai.assert.equal(positiveNumber.test(num => num < 100)(99), 99); _chai.assert.throws(() => positiveNumber.test(num => num < 100)(100), _errors.ValidationError); _chai.assert.throws(() => positiveNumber.test(num => num < 100)(0), RangeError); _chai.assert.throws(() => positiveNumber.test(num => num < 100)('ddd'), _errors.ValidationError); }); it('.test().test()', () => { const first = positiveNumber.test(num => num < 100); _chai.assert.equal(first(4), 4); _chai.assert.equal(first(99), 99); _chai.assert.throws(() => first(100), _errors.ValidationError); _chai.assert.throws(() => first(0), RangeError); _chai.assert.throws(() => first('ddd'), _errors.ValidationError); const second = first.test(num => num > 10); _chai.assert.equal(second(11), 11); _chai.assert.equal(second(40), 40); _chai.assert.throws(() => second(100), _errors.ValidationError); _chai.assert.throws(() => second(9), _errors.ValidationError); _chai.assert.throws(() => second(0), RangeError); _chai.assert.throws(() => second('ddd'), _errors.ValidationError); _chai.assert.throws(() => first.test(num => num > 10)(100), _errors.ValidationError); _chai.assert.equal(first(4), 4); _chai.assert.throws(() => first(100), _errors.ValidationError); }); it('.equals()', () => { const val = positiveNumber.equals(5); (0, _utils.typeCheck)('ok'); (0, _utils.typeCheck)('ok'); const res = positiveNumber.equals(5)(5); (0, _utils.typeCheck)('ok'); _chai.assert.equal(positiveNumber.equals(4)(4), 4); _chai.assert.throws(() => positiveNumber.equals(4)(5), _errors.ValidationError); _chai.assert.throws(() => positiveNumber.equals(4)(1), _errors.ValidationError); _chai.assert.throws(() => positiveNumber.equals(4)(0), RangeError); _chai.assert.throws(() => positiveNumber.equals(4)(-30), RangeError); _chai.assert.throws(() => positiveNumber.equals(4)('ddd'), _errors.ValidationError); }); it('.transform(string)', () => { const validator = positiveNumber.transform(input => { if (input === 1000) { throw new ReferenceError('fail'); } return `${-input}`; }); _chai.assert.equal(validator(11), '-11'); _chai.assert.equal(validator(40), '-40'); _chai.assert.throws(() => validator(0), RangeError); _chai.assert.throws(() => validator(-9), RangeError); _chai.assert.throws(() => validator(1000), ReferenceError, 'fail'); }); it('.construct()', () => { const validator = positiveNumber.construct(input => { if (input === 'error') { throw new ReferenceError('error'); } return [Number(input || 0)]; }); _chai.assert.equal(validator(11), 11); _chai.assert.equal(validator(40), 40); _chai.assert.equal(validator('12'), 12); _chai.assert.equal(validator('12.4'), 12.4); _chai.assert.isNaN(validator('foo')); _chai.assert.throws(() => validator(null), RangeError); _chai.assert.throws(() => validator(undefined), RangeError); _chai.assert.throws(() => validator('error'), ReferenceError); }); describe('.optional', () => { it('()', () => { const validator = positiveNumber.optional(); (0, _utils.typeCheck)('ok'); _chai.assert.equal(validator(1), 1); _chai.assert.equal(validator(), undefined); _chai.assert.equal(validator(undefined), undefined); _chai.assert.equal(validator(''), undefined); }); it('(123)', () => { const validator = positiveNumber.optional(123); (0, _utils.typeCheck)('ok'); _chai.assert.equal(validator(1), 1); _chai.assert.equal(validator(), 123); _chai.assert.equal(validator(''), 123); _chai.assert.equal(validator(undefined), 123); }); }); describe('.strictOptional', () => { it('()', () => { const validator = positiveNumber.strictOptional(); (0, _utils.typeCheck)('ok'); _chai.assert.equal(validator(1), 1); _chai.assert.equal(validator(), undefined); _chai.assert.equal(validator(undefined), undefined); _chai.assert.throw(() => validator('')); _chai.assert.throw(() => validator(false)); }); it('(123)', () => { const validator = positiveNumber.strictOptional(123); (0, _utils.typeCheck)('ok'); _chai.assert.equal(validator(1), 1); _chai.assert.equal(validator(), 123); _chai.assert.equal(validator(undefined), 123); _chai.assert.throw(() => validator(null)); _chai.assert.throw(() => validator(false)); }); }); it('.destruct()', () => { const validator = positiveNumber.destruct(); _chai.assert.deepEqual(validator(11), [null, 11]); _chai.assert.deepEqual(validator(40), [null, 40]); const res1 = validator(0); _chai.assert.equal(res1.length, 1); _chai.assert.instanceOf(res1[0], RangeError); const res2 = validator('foo'); _chai.assert.equal(res2.length, 1); _chai.assert.instanceOf(res2[0], _errors.ValidationError); }); it('.error(string)', () => { const error = 'test message'; const validator = positiveNumber.error(error); _chai.assert.equal(validator(11), 11); _chai.assert.equal(validator(40), 40); _chai.assert.throws(() => validator(0), _errors.ValidationError, error); _chai.assert.throws(() => validator('foo'), _errors.ValidationError, error); }); it('.error(Error)', () => { const error = new ReferenceError('my error'); const validator = positiveNumber.error(error); _chai.assert.equal(validator(11), 11); _chai.assert.equal(validator(40), 40); _chai.assert.throws(() => validator(0), ReferenceError, error.message); _chai.assert.throws(() => validator('foo'), ReferenceError, error.message); }); it('.error(function)', () => { const validator = positiveNumber.error(input => `error: ${input}`); _chai.assert.equal(validator(11), 11); _chai.assert.equal(validator(40), 40); _chai.assert.throws(() => validator(0), _errors.ValidationError, 'error: 0'); _chai.assert.throws(() => validator('foo'), _errors.ValidationError, 'error: foo'); }); }); describe('yesOrNo', () => { const validator = new _Validator.default(input => input === 'random' ? Math.random() <= 0.5 ? 'yes' : 'no' : input).proxy(); it('Types', () => { (0, _utils.typeCheck)('ok'); (0, _utils.typeCheck)('ok'); }); it('(random)', () => { const res = validator('random'); (0, _utils.typeCheck)('ok'); _chai.assert.equal(validator('yes'), 'yes'); _chai.assert.equal(validator('no'), 'no'); _chai.assert.match(validator('random'), /^(yes|no)$/); }); }); describe('async positiveNumber', () => { const positiveNumber = new _Validator.default(async number => { if (typeof number !== 'number') { throw new _errors.ValidationError('Expected type to be number'); } if (number <= 0) { throw new RangeError(`Expected number to be positive`); } return number; }).proxy(); it('Types', () => { (0, _utils.typeCheck)('ok'); (0, _utils.typeCheck)('ok'); }); it('.destruct()', async () => { const validator = positiveNumber.destruct(); _chai.assert.deepEqual(await validator(11), [null, 11]); _chai.assert.deepEqual(await validator(40), [null, 40]); const res1 = await validator(0); _chai.assert.equal(res1.length, 1); _chai.assert.instanceOf(res1[0], RangeError); const res2 = await validator('foo'); _chai.assert.equal(res2.length, 1); _chai.assert.instanceOf(res2[0], _errors.ValidationError); }); it('.message(string)', async () => { const error = 'test message'; const validator = positiveNumber.error(error); _chai.assert.equal(await validator(11), 11); _chai.assert.equal(await validator(40), 40); await _chai.assert.isRejected(validator(0)); await _chai.assert.isRejected(validator('foo')); await _chai.assert.becomes(validator(0).catch(err => err.message), error); await _chai.assert.becomes(validator('foo').catch(err => err.message), error); }); }); }); //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9WYWxpZGF0b3IudGVzdC50cyJdLCJuYW1lcyI6WyJjaGFpQXNQcm9taXNlZCIsImRlc2NyaWJlIiwicG9zaXRpdmVOdW1iZXIiLCJWYWxpZGF0b3IiLCJudW1iZXIiLCJWYWxpZGF0aW9uRXJyb3IiLCJSYW5nZUVycm9yIiwicHJveHkiLCJpdCIsInJlcyIsImFzc2VydCIsImVxdWFsIiwidGhyb3dzIiwidW5kZWZpbmVkIiwidGVzdCIsIm51bSIsImZpcnN0Iiwic2Vjb25kIiwidmFsIiwiZXF1YWxzIiwidmFsaWRhdG9yIiwidHJhbnNmb3JtIiwiaW5wdXQiLCJSZWZlcmVuY2VFcnJvciIsImNvbnN0cnVjdCIsIk51bWJlciIsImlzTmFOIiwib3B0aW9uYWwiLCJzdHJpY3RPcHRpb25hbCIsInRocm93IiwiZGVzdHJ1Y3QiLCJkZWVwRXF1YWwiLCJyZXMxIiwibGVuZ3RoIiwiaW5zdGFuY2VPZiIsInJlczIiLCJlcnJvciIsIm1lc3NhZ2UiLCJNYXRoIiwicmFuZG9tIiwibWF0Y2giLCJpc1JlamVjdGVkIiwiYmVjb21lcyIsImNhdGNoIiwiZXJyIl0sIm1hcHBpbmdzIjoiOztBQUFBOztBQUNBOztBQUNBOztBQUNBOztBQUVBOztBQUNBOzs7O0FBQ0EsZUFBSUEsdUJBQUo7QUFFQTs7QUFFQUMsUUFBUSxDQUFDLFdBQUQsRUFBYyxNQUFNO0FBQzFCQSxFQUFBQSxRQUFRLENBQUMsZ0JBQUQsRUFBbUIsTUFBTTtBQUMvQixVQUFNQyxjQUFjLEdBQUcsSUFBSUMsa0JBQUosQ0FBZUMsTUFBRCxJQUE0QjtBQUMvRCxVQUFJLE9BQU9BLE1BQVAsS0FBa0IsUUFBdEIsRUFBZ0M7QUFDOUIsY0FBTSxJQUFJQyx1QkFBSixDQUFvQiw0QkFBcEIsQ0FBTjtBQUNEOztBQUVELFVBQUlELE1BQU0sSUFBSSxDQUFkLEVBQWlCO0FBQ2YsY0FBTSxJQUFJRSxVQUFKLENBQWdCLGdDQUFoQixDQUFOO0FBQ0Q7O0FBRUQsYUFBT0YsTUFBUDtBQUNELEtBVnNC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QUEzQixDQUFOO0FBQ0EsWUFBTVYsYUFBTytCLFVBQVAsQ0FBa0JyQixTQUFTLENBQUMsS0FBRCxDQUEzQixDQUFOO0FBRUEsWUFBTVYsYUFBT2dDLE9BQVAsQ0FDSnRCLFNBQVMsQ0FBQyxDQUFELENBQVQsQ0FBYXVCLEtBQWIsQ0FBb0JDLEdBQUQsSUFBU0EsR0FBRyxDQUFDUCxPQUFoQyxDQURJLEVBRUpELEtBRkksQ0FBTjtBQUtBLFlBQU0xQixhQUFPZ0MsT0FBUCxDQUNKdEIsU0FBUyxDQUFDLEtBQUQsQ0FBVCxDQUF3QnVCLEtBQXhCLENBQStCQyxHQUFELElBQVNBLEdBQUcsQ0FBQ1AsT0FBM0MsQ0FESSxFQUVKRCxLQUZJLENBQU47QUFJRCxLQW5CQyxDQUFGO0FBb0JELEdBdkRPLENBQVI7QUF3REQsQ0FoVU8sQ0FBUiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAnbW9jaGEnO1xuaW1wb3J0IHsgYXNzZXJ0LCB1c2UgfSBmcm9tICdjaGFpJztcbmltcG9ydCB7IHR5cGVDaGVjayB9IGZyb20gJy4vc2NoZW1hL3V0aWxzJztcbmltcG9ydCBWYWxpZGF0b3IgZnJvbSAnLi9WYWxpZGF0b3InO1xuXG5pbXBvcnQgY2hhaUFzUHJvbWlzZWQgZnJvbSAnY2hhaS1hcy1wcm9taXNlZCc7XG5pbXBvcnQgeyBWYWxpZGF0aW9uRXJyb3IgfSBmcm9tICcuL3NjaGVtYS9lcnJvcnMnO1xudXNlKGNoYWlBc1Byb21pc2VkKTtcblxuLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSAqL1xuXG5kZXNjcmliZSgnVmFsaWRhdG9yJywgKCkgPT4ge1xuICBkZXNjcmliZSgncG9zaXRpdmVOdW1iZXInLCAoKSA9PiB7XG4gICAgY29uc3QgcG9zaXRpdmVOdW1iZXIgPSBuZXcgVmFsaWRhdG9yKChudW1iZXI6IG51bWJlcik6IG51bWJlciA9PiB7XG4gICAgICBpZiAodHlwZW9mIG51bWJlciAhPT0gJ251bWJlcicpIHtcbiAgICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcignRXhwZWN0ZWQgdHlwZSB0byBiZSBudW1iZXInKTtcbiAgICAgIH1cblxuICAgICAgaWYgKG51bWJlciA8PSAwKSB7XG4gICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKGBFeHBlY3RlZCBudW1iZXIgdG8gYmUgcG9zaXRpdmVgKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG51bWJlcjtcbiAgICB9KS5wcm94eSgpO1xuXG4gICAgaXQoJ1R5cGVzJywgKCkgPT4ge1xuICAgICAgdHlwZUNoZWNrPFJldHVyblR5cGU8dHlwZW9mIHBvc2l0aXZlTnVtYmVyPiwgbnVtYmVyPignb2snKTtcbiAgICAgIHR5cGVDaGVjazxQYXJhbWV0ZXJzPHR5cGVvZiBwb3NpdGl2ZU51bWJlcj4sIFtudW1iZXJdPignb2snKTtcbiAgICB9KTtcblxuICAgIGl0KCcoKScsICgpID0+IHtcbiAgICAgIGNvbnN0IHJlcyA9IHBvc2l0aXZlTnVtYmVyKDEpO1xuICAgICAgdHlwZUNoZWNrPHR5cGVvZiByZXMsIG51bWJlcj4oJ29rJyk7XG5cbiAgICAgIGFzc2VydC5lcXVhbChwb3NpdGl2ZU51bWJlcigxKSwgMSk7XG4gICAgICBhc3NlcnQuZXF1YWwocG9zaXRpdmVOdW1iZXIoMTAwKSwgMTAwKTtcblxuICAgICAgYXNzZXJ0LnRocm93cygoKSA9PiBwb3NpdGl2ZU51bWJlcigwKSwgUmFuZ2VFcnJvcik7XG4gICAgICBhc3NlcnQudGhyb3dzKCgpID0+IHBvc2l0aXZlTnVtYmVyKC02KSwgUmFuZ2VFcnJvcik7XG4gICAgICBhc3NlcnQudGhyb3dzKCgpID0+IHBvc2l0aXZlTnVtYmVyKHVuZGVmaW5lZCBhcyBhbnkpLCBWYWxpZGF0aW9uRXJyb3IpO1xuICAgICAgYXNzZXJ0LnRocm93cygoKSA9PiBwb3NpdGl2ZU51bWJlcihudWxsIGFzIGFueSksIFZhbGlkYXRpb25FcnJvcik7XG4gICAgICBhc3NlcnQudGhyb3dzKCgpID0+IHBvc2l0aXZlTnVtYmVyKHt9IGFzIGFueSksIFZhbGlkYXRpb25FcnJvcik7XG4gICAgICBhc3NlcnQudGhyb3dzKCgpID0+IHBvc2l0aXZlTnVtYmVyKCc1JyBhcyBhbnkpLCBWYWxpZGF0aW9uRXJyb3IpO1xuICAgIH0pO1xuXG4gICAgaXQoJy50ZXN0KCknLCAoKSA9PiB7XG4gICAgICBhc3NlcnQuZXF1YWwocG9zaXRpdmVOdW1iZXIudGVzdCgobnVtKTogYm9vbGVhbiA9PiBudW0gPCAxMDApKDQpLCA0KTtcbiAgICAgIGFzc2VydC5lcXVhbChwb3NpdGl2ZU51bWJlci50ZXN0KChudW0pOiBib29sZWFuID0+IG51bSA8IDEwMCkoOTkpLCA5OSk7XG5cbiAgICAgIGFzc2VydC50aHJvd3MoXG4gICAgICAgICgpID0+IHBvc2l0aXZlTnVtYmVyLnRlc3QoKG51bSk6IGJvb2xlYW4gPT4gbnVtIDwgMTAwKSgxMDApLFxuICAgICAgICBWYWxpZGF0aW9uRXJyb3IsXG4gICAgICApO1xuICAgICAgYXNzZXJ0LnRocm93cyhcbiAgICAgICAgKCkgPT4gcG9zaXRpdmVOdW1iZXIudGVzdCgobnVtKTogYm9vbGVhbiA9PiBudW0gPCAxMDApKDApLFxuICAgICAgICBSYW5nZUVycm9yLFxuICAgICAgKTtcbiAgICAgIGFzc2VydC50aHJvd3MoXG4gICAgICAgICgpID0+IHBvc2l0aXZlTnVtYmVyLnRlc3QoKG51bSk6IGJvb2xlYW4gPT4gbnVtIDwgMTAwKSgnZGRkJyBhcyBhbnkpLFxuICAgICAgICBWYWxpZGF0aW9uRXJyb3IsXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgaXQoJy50ZXN0KCkudGVzdCgpJywgKCkgPT4ge1xuICAgICAgY29uc3QgZmlyc3QgPSBwb3NpdGl2ZU51bWJlci50ZXN0KChudW0pOiBib29sZWFuID0+IG51bSA8IDEwMCk7XG5cbiAgICAgIGFzc2VydC5lcXVhbChmaXJzdCg0KSwgNCk7XG4gICAgICBhc3NlcnQuZXF1YWwoZmlyc3QoOTkpLCA5OSk7XG5cbiAgICAgIGFzc2VydC50aHJvd3MoKCkgPT4gZmlyc3QoMTAwKSwgVmFsaWRhdGlvbkVycm9yKTtcbiAgICAgIGFzc2VydC50aHJvd3MoKCkgPT4gZmlyc3QoMCksIFJhbmdlRXJyb3IpO1xuICAgICAgYXNzZXJ0LnRocm93cygoKSA9PiBmaXJzdCgnZGRkJyBhcyBhbnkpLCBWYWxpZGF0aW9uRXJyb3IpO1xuXG4gICAgICBjb25zdCBzZWNvbmQgPSBmaXJzdC50ZXN0KChudW0pOiBib29sZWFuID0+IG51bSA+IDEwKTtcblxuICAgICAgYXNzZXJ0LmVxdWFsKHNlY29uZCgxMSksIDExKTtcbiAgICAgIGFzc2VydC5lcXVhbChzZWNvbmQoNDApLCA0MCk7XG5cbiAgICAgIGFzc2VydC50aHJvd3MoKCkgPT4gc2Vjb25kKDEwMCksIFZhbGlkYXRpb25FcnJvcik7XG4gICAgICBhc3NlcnQudGhyb3dzKCgpID0+IHNlY29uZCg5KSwgVmFsaWRhdGlvbkVycm9yKTtcbiAgICAgIGFzc2VydC50aHJvd3MoKCkgPT4gc2Vjb25kKDApLCBSYW5nZUVycm9yKTtcbiAgICAgIGFzc2VydC50aHJvd3MoKCkgPT4gc2Vjb25kKCdkZGQnIGFzIGFueSksIFZhbGlkYXRpb25FcnJvcik7XG5cbiAgICAgIGFzc2VydC50aHJvd3MoXG4gICAgICAgICgpID0+IGZpcnN0LnRlc3QoKG51bSk6IGJvb2xlYW4gPT4gbnVtID4gMTApKDEwMCksXG4gICAgICAgIFZhbGlkYXRpb25FcnJvcixcbiAgICAgICk7XG5cbiAgICAgIGFzc2VydC5lcXVhbChmaXJzdCg0KSwgNCk7XG4gICAgICBhc3NlcnQudGhyb3dzKCgpID0+IGZpcnN0KDEwMCksIFZhbGlkYXRpb25FcnJvcik7XG4gICAgfSk7XG5cbiAgICBpdCgnLmVxdWFscygpJywgKCkgPT4ge1xuICAgICAgY29uc3QgdmFsID0gcG9zaXRpdmVOdW1iZXIuZXF1YWxzKDUpO1xuICAgICAgdHlwZUNoZWNrPFJldHVyblR5cGU8dHlwZW9mIHZhbD4sIDU+KCdvaycpO1xuICAgICAgdHlwZUNoZWNrPFBhcmFtZXRlcnM8dHlwZW9mIHZhbD4sIFtudW1iZXJdPignb2snKTtcblxuICAgICAgY29uc3QgcmVzID0gcG9zaXRpdmVOdW1iZXIuZXF1YWxzKDUpKDUgYXMgMyk7XG4gICAgICB0eXBlQ2hlY2s8dHlwZW9mIHJlcywgNT4oJ29rJyk7XG5cbiAgICAgIGFzc2VydC5lcXVhbChwb3NpdGl2ZU51bWJlci5lcXVhbHMoNCkoNCksIDQpO1xuXG4gICAgICBhc3NlcnQudGhyb3dzKCgpID0+IHBvc2l0aXZlTnVtYmVyLmVxdWFscyg0KSg1KSwgVmFsaWRhdGlvbkVycm9yKTtcbiAgICAgIGFzc2VydC50aHJvd3MoKCkgPT4gcG9zaXRpdmVOdW1iZXIuZXF1YWxzKDQpKDEpLCBWYWxpZGF0aW9uRXJyb3IpO1xuICAgICAgYXNzZXJ0LnRocm93cygoKSA9PiBwb3NpdGl2ZU51bWJlci5lcXVhbHMoNCkoMCksIFJhbmdlRXJyb3IpO1xuICAgICAgYXNzZXJ0LnRocm93cygoKSA9PiBwb3NpdGl2ZU51bWJlci5lcXVhbHMoNCkoLTMwKSwgUmFuZ2VFcnJvcik7XG4gICAgICBhc3NlcnQudGhyb3dzKFxuICAgICAgICAoKSA9PiBwb3NpdGl2ZU51bWJlci5lcXVhbHMoNCkoJ2RkZCcgYXMgYW55KSxcbiAgICAgICAgVmFsaWRhdGlvbkVycm9yLFxuICAgICAgKTtcbiAgICB9KTtcblxuICAgIGl0KCcudHJhbnNmb3JtKHN0cmluZyknLCAoKSA9PiB7XG4gICAgICBjb25zdCB2YWxpZGF0b3IgPSBwb3NpdGl2ZU51bWJlci50cmFuc2Zvcm0oKGlucHV0KTogc3RyaW5nID0+IHtcbiAgICAgICAgaWYgKGlucHV0ID09PSAxMDAwKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKCdmYWlsJyk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYCR7LWlucHV0fWA7XG4gICAgICB9KTtcblxuICAgICAgYXNzZXJ0LmVxdWFsKHZhbGlkYXRvcigxMSksICctMTEnKTtcbiAgICAgIGFzc2VydC5lcXVhbCh2YWxpZGF0b3IoNDApLCAnLTQwJyk7XG5cbiAgICAgIGFzc2VydC50aHJvd3MoKCkgPT4gdmFsaWRhdG9yKDApLCBSYW5nZUVycm9yKTtcbiAgICAgIGFzc2VydC50aHJvd3MoKCkgPT4gdmFsaWRhdG9yKC05KSwgUmFuZ2VFcnJvcik7XG4gICAgICBhc3NlcnQudGhyb3dzKCgpID0+IHZhbGlkYXRvcigxMDAwKSwgUmVmZXJlbmNlRXJyb3IsICdmYWlsJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnLmNvbnN0cnVjdCgpJywgKCkgPT4ge1xuICAgICAgY29uc3QgdmFsaWRhdG9yID0gcG9zaXRpdmVOdW1iZXIuY29uc3RydWN0KChpbnB1dDogdW5rbm93bikgPT4ge1xuICAgICAgICBpZiAoaW5wdXQgPT09ICdlcnJvcicpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoJ2Vycm9yJyk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gW051bWJlcihpbnB1dCB8fCAwKV07XG4gICAgICB9KTtcblxuICAgICAgYXNzZXJ0LmVxdWFsKHZhbGlkYXRvcigxMSksIDExKTtcbiAgICAgIGFzc2VydC5lcXVhbCh2YWxpZGF0b3IoNDApLCA0MCk7XG4gICAgICBhc3NlcnQuZXF1YWwodmFsaWRhdG9yKCcxMicpLCAxMik7XG4gICAgICBhc3NlcnQuZXF1YWwodmFsaWRhdG9yKCcxMi40JyksIDEyLjQpO1xuICAgICAgYXNzZXJ0LmlzTmFOKHZhbGlkYXRvcignZm9vJykpO1xuXG4gICAgICBhc3NlcnQudGhyb3dzKCgpID0+IHZhbGlkYXRvcihudWxsKSwgUmFuZ2VFcnJvcik7XG4gICAgICBhc3NlcnQudGhyb3dzKCgpID0+IHZhbGlkYXRvcih1bmRlZmluZWQpLCBSYW5nZUVycm9yKTtcbiAgICAgIGFzc2VydC50aHJvd3MoKCkgPT4gdmFsaWRhdG9yKCdlcnJvcicpLCBSZWZlcmVuY2VFcnJvcik7XG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnLm9wdGlvbmFsJywgKCkgPT4ge1xuICAgICAgaXQoJygpJywgKCkgPT4ge1xuICAgICAgICBjb25zdCB2YWxpZGF0b3IgPSBwb3NpdGl2ZU51bWJlci5vcHRpb25hbCgpO1xuXG4gICAgICAgIHR5cGVDaGVjazx0eXBlb2YgdmFsaWRhdG9yLCAoeD86IG51bWJlciB8IG51bGwpID0+IG51bWJlciB8IHVuZGVmaW5lZD4oXG4gICAgICAgICAgJ29rJyxcbiAgICAgICAgKTtcbiAgICAgICAgYXNzZXJ0LmVxdWFsKHZhbGlkYXRvcigxKSwgMSk7XG4gICAgICAgIGFzc2VydC5lcXVhbCh2YWxpZGF0b3IoKSwgdW5kZWZpbmVkKTtcbiAgICAgICAgYXNzZXJ0LmVxdWFsKHZhbGlkYXRvcih1bmRlZmluZWQpLCB1bmRlZmluZWQpO1xuICAgICAgICBhc3NlcnQuZXF1YWwodmFsaWRhdG9yKCcnIGFzIGFueSksIHVuZGVmaW5lZCk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJygxMjMpJywgKCkgPT4ge1xuICAgICAgICBjb25zdCB2YWxpZGF0b3IgPSBwb3NpdGl2ZU51bWJlci5vcHRpb25hbCgxMjMpO1xuXG4gICAgICAgIHR5cGVDaGVjazx0eXBlb2YgdmFsaWRhdG9yLCAoeD86IG51bWJlciB8IG51bGwpID0+IG51bWJlcj4oJ29rJyk7XG4gICAgICAgIGFzc2VydC5lcXVhbCh2YWxpZGF0b3IoMSksIDEpO1xuICAgICAgICBhc3NlcnQuZXF1YWwodmFsaWRhdG9yKCksIDEyMyk7XG4gICAgICAgIGFzc2VydC5lcXVhbCh2YWxpZGF0b3IoJycgYXMgYW55KSwgMTIzKTtcbiAgICAgICAgYXNzZXJ0LmVxdWFsKHZhbGlkYXRvcih1bmRlZmluZWQpLCAxMjMpO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnLnN0cmljdE9wdGlvbmFsJywgKCkgPT4ge1xuICAgICAgaXQoJygpJywgKCkgPT4ge1xuICAgICAgICBjb25zdCB2YWxpZGF0b3IgPSBwb3NpdGl2ZU51bWJlci5zdHJpY3RPcHRpb25hbCgpO1xuXG4gICAgICAgIHR5cGVDaGVjazx0eXBlb2YgdmFsaWRhdG9yLCAoeD86IG51bWJlcikgPT4gbnVtYmVyIHwgdW5kZWZpbmVkPignb2snKTtcbiAgICAgICAgYXNzZXJ0LmVxdWFsKHZhbGlkYXRvcigxKSwgMSk7XG4gICAgICAgIGFzc2VydC5lcXVhbCh2YWxpZGF0b3IoKSwgdW5kZWZpbmVkKTtcbiAgICAgICAgYXNzZXJ0LmVxdWFsKHZhbGlkYXRvcih1bmRlZmluZWQpLCB1bmRlZmluZWQpO1xuICAgICAgICBhc3NlcnQudGhyb3coKCkgPT4gdmFsaWRhdG9yKCcnIGFzIGFueSkpO1xuICAgICAgICBhc3NlcnQudGhyb3coKCkgPT4gdmFsaWRhdG9yKGZhbHNlIGFzIGFueSkpO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCcoMTIzKScsICgpID0+IHtcbiAgICAgICAgY29uc3QgdmFsaWRhdG9yID0gcG9zaXRpdmVOdW1iZXIuc3RyaWN0T3B0aW9uYWwoMTIzKTtcblxuICAgICAgICB0eXBlQ2hlY2s8dHlwZW9mIHZhbGlkYXRvciwgKHg/OiBudW1iZXIpID0+IG51bWJlcj4oJ29rJyk7XG4gICAgICAgIGFzc2VydC5lcXVhbCh2YWxpZGF0b3IoMSksIDEpO1xuICAgICAgICBhc3NlcnQuZXF1YWwodmFsaWRhdG9yKCksIDEyMyk7XG4gICAgICAgIGFzc2VydC5lcXVhbCh2YWxpZGF0b3IodW5kZWZpbmVkKSwgMTIzKTtcbiAgICAgICAgYXNzZXJ0LnRocm93KCgpID0+IHZhbGlkYXRvcihudWxsIGFzIGFueSkpO1xuICAgICAgICBhc3NlcnQudGhyb3coKCkgPT4gdmFsaWRhdG9yKGZhbHNlIGFzIGFueSkpO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBpdCgnLmRlc3RydWN0KCknLCAoKSA9PiB7XG4gICAgICBjb25zdCB2YWxpZGF0b3IgPSBwb3NpdGl2ZU51bWJlci5kZXN0cnVjdCgpO1xuXG4gICAgICBhc3NlcnQuZGVlcEVxdWFsKHZhbGlkYXRvcigxMSksIFtudWxsLCAxMV0pO1xuICAgICAgYXNzZXJ0LmRlZXBFcXVhbCh2YWxpZGF0b3IoNDApLCBbbnVsbCwgNDBdKTtcblxuICAgICAgY29uc3QgcmVzMSA9IHZhbGlkYXRvcigwKTtcbiAgICAgIGFzc2VydC5lcXVhbChyZXMxLmxlbmd0aCwgMSk7XG4gICAgICBhc3NlcnQuaW5zdGFuY2VPZihyZXMxWzBdLCBSYW5nZUVycm9yKTtcblxuICAgICAgY29uc3QgcmVzMiA9IHZhbGlkYXRvcignZm9vJyBhcyBhbnkpO1xuICAgICAgYXNzZXJ0LmVxdWFsKHJlczIubGVuZ3RoLCAxKTtcbiAgICAgIGFzc2VydC5pbnN0YW5jZU9mKHJlczJbMF0sIFZhbGlkYXRpb25FcnJvcik7XG4gICAgfSk7XG5cbiAgICBpdCgnLmVycm9yKHN0cmluZyknLCAoKSA9PiB7XG4gICAgICBjb25zdCBlcnJvciA9ICd0ZXN0IG1lc3NhZ2UnO1xuICAgICAgY29uc3QgdmFsaWRhdG9yID0gcG9zaXRpdmVOdW1iZXIuZXJyb3IoZXJyb3IpO1xuXG4gICAgICBhc3NlcnQuZXF1YWwodmFsaWRhdG9yKDExKSwgMTEpO1xuICAgICAgYXNzZXJ0LmVxdWFsKHZhbGlkYXRvcig0MCksIDQwKTtcblxuICAgICAgYXNzZXJ0LnRocm93cygoKSA9PiB2YWxpZGF0b3IoMCksIFZhbGlkYXRpb25FcnJvciwgZXJyb3IpO1xuICAgICAgYXNzZXJ0LnRocm93cygoKSA9PiB2YWxpZGF0b3IoJ2ZvbycgYXMgYW55KSwgVmFsaWRhdGlvbkVycm9yLCBlcnJvcik7XG4gICAgfSk7XG5cbiAgICBpdCgnLmVycm9yKEVycm9yKScsICgpID0+IHtcbiAgICAgIGNvbnN0IGVycm9yID0gbmV3IFJlZmVyZW5jZUVycm9yKCdteSBlcnJvcicpO1xuICAgICAgY29uc3QgdmFsaWRhdG9yID0gcG9zaXRpdmVOdW1iZXIuZXJyb3IoZXJyb3IpO1xuXG4gICAgICBhc3NlcnQuZXF1YWwodmFsaWRhdG9yKDExKSwgMTEpO1xuICAgICAgYXNzZXJ0LmVxdWFsKHZhbGlkYXRvcig0MCksIDQwKTtcblxuICAgICAgYXNzZXJ0LnRocm93cygoKSA9PiB2YWxpZGF0b3IoMCksIFJlZmVyZW5jZUVycm9yLCBlcnJvci5tZXNzYWdlKTtcbiAgICAgIGFzc2VydC50aHJvd3MoXG4gICAgICAgICgpID0+IHZhbGlkYXRvcignZm9vJyBhcyBhbnkpLFxuICAgICAgICBSZWZlcmVuY2VFcnJvcixcbiAgICAgICAgZXJyb3IubWVzc2FnZSxcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICBpdCgnLmVycm9yKGZ1bmN0aW9uKScsICgpID0+IHtcbiAgICAgIGNvbnN0IHZhbGlkYXRvciA9IHBvc2l0aXZlTnVtYmVyLmVycm9yKChpbnB1dCkgPT4gYGVycm9yOiAke2lucHV0fWApO1xuXG4gICAgICBhc3NlcnQuZXF1YWwodmFsaWRhdG9yKDExKSwgMTEpO1xuICAgICAgYXNzZXJ0LmVxdWFsKHZhbGlkYXRvcig0MCksIDQwKTtcblxuICAgICAgYXNzZXJ0LnRocm93cygoKSA9PiB2YWxpZGF0b3IoMCksIFZhbGlkYXRpb25FcnJvciwgJ2Vycm9yOiAwJyk7XG4gICAgICBhc3NlcnQudGhyb3dzKFxuICAgICAgICAoKSA9PiB2YWxpZGF0b3IoJ2ZvbycgYXMgYW55KSxcbiAgICAgICAgVmFsaWRhdGlvbkVycm9yLFxuICAgICAgICAnZXJyb3I6IGZvbycsXG4gICAgICApO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgneWVzT3JObycsICgpID0+IHtcbiAgICBjb25zdCB2YWxpZGF0b3IgPSBuZXcgVmFsaWRhdG9yKFxuICAgICAgKGlucHV0OiAneWVzJyB8ICdubycgfCAncmFuZG9tJyk6ICd5ZXMnIHwgJ25vJyA9PlxuICAgICAgICBpbnB1dCA9PT0gJ3JhbmRvbScgPyAoTWF0aC5yYW5kb20oKSA8PSAwLjUgPyAneWVzJyA6ICdubycpIDogaW5wdXQsXG4gICAgKS5wcm94eSgpO1xuXG4gICAgaXQoJ1R5cGVzJywgKCkgPT4ge1xuICAgICAgdHlwZUNoZWNrPFJldHVyblR5cGU8dHlwZW9mIHZhbGlkYXRvcj4sICd5ZXMnIHwgJ25vJz4oJ29rJyk7XG4gICAgICB0eXBlQ2hlY2s8UGFyYW1ldGVyczx0eXBlb2YgdmFsaWRhdG9yPiwgWyd5ZXMnIHwgJ25vJyB8ICdyYW5kb20nXT4oJ29rJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnKHJhbmRvbSknLCAoKSA9PiB7XG4gICAgICBjb25zdCByZXMgPSB2YWxpZGF0b3IoJ3JhbmRvbScpO1xuXG4gICAgICB0eXBlQ2hlY2s8dHlwZW9mIHJlcywgJ3llcycgfCAnbm8nPignb2snKTtcblxuICAgICAgYXNzZXJ0LmVxdWFsKHZhbGlkYXRvcigneWVzJyksICd5ZXMnKTtcbiAgICAgIGFzc2VydC5lcXVhbCh2YWxpZGF0b3IoJ25vJyksICdubycpO1xuICAgICAgYXNzZXJ0Lm1hdGNoKHZhbGlkYXRvcigncmFuZG9tJyksIC9eKHllc3xubykkLyk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdhc3luYyBwb3NpdGl2ZU51bWJlcicsICgpID0+IHtcbiAgICBjb25zdCBwb3NpdGl2ZU51bWJlciA9IG5ldyBWYWxpZGF0b3IoXG4gICAgICBhc3luYyAobnVtYmVyOiBudW1iZXIpOiBQcm9taXNlPG51bWJlcj4gPT4ge1xuICAgICAgICBpZiAodHlwZW9mIG51bWJlciAhPT0gJ251bWJlcicpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKCdFeHBlY3RlZCB0eXBlIHRvIGJlIG51bWJlcicpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG51bWJlciA8PSAwKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoYEV4cGVjdGVkIG51bWJlciB0byBiZSBwb3NpdGl2ZWApO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG51bWJlcjtcbiAgICAgIH0sXG4gICAgKS5wcm94eSgpO1xuXG4gICAgaXQoJ1R5cGVzJywgKCkgPT4ge1xuICAgICAgdHlwZUNoZWNrPFJldHVyblR5cGU8dHlwZW9mIHBvc2l0aXZlTnVtYmVyPiwgUHJvbWlzZTxudW1iZXI+Pignb2snKTtcbiAgICAgIHR5cGVDaGVjazxQYXJhbWV0ZXJzPHR5cGVvZiBwb3NpdGl2ZU51bWJlcj4sIFtudW1iZXJdPignb2snKTtcbiAgICB9KTtcblxuICAgIGl0KCcuZGVzdHJ1Y3QoKScsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHZhbGlkYXRvciA9IHBvc2l0aXZlTnVtYmVyLmRlc3RydWN0KCk7XG5cbiAgICAgIGFzc2VydC5kZWVwRXF1YWwoYXdhaXQgdmFsaWRhdG9yKDExKSwgW251bGwsIDExXSk7XG4gICAgICBhc3NlcnQuZGVlcEVxdWFsKGF3YWl0IHZhbGlkYXRvcig0MCksIFtudWxsLCA0MF0pO1xuXG4gICAgICBjb25zdCByZXMxID0gYXdhaXQgdmFsaWRhdG9yKDApO1xuICAgICAgYXNzZXJ0LmVxdWFsKHJlczEubGVuZ3RoLCAxKTtcbiAgICAgIGFzc2VydC5pbnN0YW5jZU9mKHJlczFbMF0sIFJhbmdlRXJyb3IpO1xuXG4gICAgICBjb25zdCByZXMyID0gYXdhaXQgdmFsaWRhdG9yKCdmb28nIGFzIGFueSk7XG4gICAgICBhc3NlcnQuZXF1YWwocmVzMi5sZW5ndGgsIDEpO1xuICAgICAgYXNzZXJ0Lmluc3RhbmNlT2YocmVzMlswXSwgVmFsaWRhdGlvbkVycm9yKTtcbiAgICB9KTtcblxuICAgIGl0KCcubWVzc2FnZShzdHJpbmcpJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgZXJyb3IgPSAndGVzdCBtZXNzYWdlJztcbiAgICAgIGNvbnN0IHZhbGlkYXRvciA9IHBvc2l0aXZlTnVtYmVyLmVycm9yKGVycm9yKTtcblxuICAgICAgYXNzZXJ0LmVxdWFsKGF3YWl0IHZhbGlkYXRvcigxMSksIDExKTtcbiAgICAgIGFzc2VydC5lcXVhbChhd2FpdCB2YWxpZGF0b3IoNDApLCA0MCk7XG5cbiAgICAgIGF3YWl0IGFzc2VydC5pc1JlamVjdGVkKHZhbGlkYXRvcigwKSk7XG4gICAgICBhd2FpdCBhc3NlcnQuaXNSZWplY3RlZCh2YWxpZGF0b3IoJ2ZvbycgYXMgYW55KSk7XG5cbiAgICAgIGF3YWl0IGFzc2VydC5iZWNvbWVzKFxuICAgICAgICB2YWxpZGF0b3IoMCkuY2F0Y2goKGVycikgPT4gZXJyLm1lc3NhZ2UpLFxuICAgICAgICBlcnJvcixcbiAgICAgICk7XG5cbiAgICAgIGF3YWl0IGFzc2VydC5iZWNvbWVzKFxuICAgICAgICB2YWxpZGF0b3IoJ2ZvbycgYXMgYW55KS5jYXRjaCgoZXJyKSA9PiBlcnIubWVzc2FnZSksXG4gICAgICAgIGVycm9yLFxuICAgICAgKTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdfQ==