UNPKG

computed-types

Version:

Runtime validation types for TypeScript.

258 lines (156 loc) 28.1 kB
"use strict"; require("mocha"); var _chai = require("chai"); var _unknown = _interopRequireDefault(require("./unknown")); var _utils = require("./schema/utils"); var _errors = require("./schema/errors"); var _string = _interopRequireDefault(require("./string")); var _number = _interopRequireDefault(require("./number")); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } /* eslint-disable @typescript-eslint/no-explicit-any */ describe('unknown', () => { it('unknown()', () => { const s = Symbol('s'); const obj = { foo: 1 }; _chai.assert.equal((0, _unknown.default)(true), true); _chai.assert.equal((0, _unknown.default)(false), false); _chai.assert.equal((0, _unknown.default)('string'), 'string'); _chai.assert.equal((0, _unknown.default)(1234), 1234); _chai.assert.equal((0, _unknown.default)(s), s); _chai.assert.equal((0, _unknown.default)(null), null); _chai.assert.equal((0, _unknown.default)(undefined), undefined); _chai.assert.equal((0, _unknown.default)(obj), obj); }); it('.boolean()', () => { _chai.assert.equal(_unknown.default.boolean()('true'), true); _chai.assert.equal(_unknown.default.boolean()('false'), false); _chai.assert.equal(_unknown.default.boolean()('1'), true); _chai.assert.equal(_unknown.default.boolean()('0'), false); _chai.assert.equal(_unknown.default.boolean()('t'), true); _chai.assert.equal(_unknown.default.boolean()('f'), false); _chai.assert.equal(_unknown.default.boolean()('T'), true); _chai.assert.equal(_unknown.default.boolean()('F'), false); _chai.assert.equal(_unknown.default.boolean()('True'), true); _chai.assert.equal(_unknown.default.boolean()('False'), false); _chai.assert.equal(_unknown.default.boolean()('Yes'), true); _chai.assert.equal(_unknown.default.boolean()('No'), false); _chai.assert.equal(_unknown.default.boolean()('Y'), true); _chai.assert.equal(_unknown.default.boolean()('N'), false); _chai.assert.equal(_unknown.default.boolean()(1), true); _chai.assert.equal(_unknown.default.boolean()(0), false); _chai.assert.equal(_unknown.default.boolean()([1]), true); _chai.assert.equal(_unknown.default.boolean()([0]), false); _chai.assert.throws(() => _unknown.default.boolean()([]), _errors.ValidationError); _chai.assert.throws(() => _unknown.default.boolean()('hello'), _errors.ValidationError); _chai.assert.throws(() => _unknown.default.boolean()(''), _errors.ValidationError); _chai.assert.throws(() => _unknown.default.boolean()(undefined), _errors.ValidationError); _chai.assert.throws(() => _unknown.default.boolean()(null), _errors.ValidationError); _chai.assert.throws(() => _unknown.default.boolean()({}), _errors.ValidationError); _chai.assert.throws(() => _unknown.default.boolean()({ foo: 1 }), _errors.ValidationError); _chai.assert.throws(() => _unknown.default.boolean('undefined')(undefined), _errors.ValidationError, 'undefined'); }); it('.string()', () => { _chai.assert.equal(_unknown.default.string()('hello'), 'hello'); _chai.assert.equal(_unknown.default.string()(false), 'false'); _chai.assert.equal(_unknown.default.string()(true), 'true'); _chai.assert.equal(_unknown.default.string()(1), '1'); _chai.assert.equal(_unknown.default.string()(0), '0'); _chai.assert.equal(_unknown.default.string()(-0.65), '-0.65'); _chai.assert.equal(_unknown.default.string()(['hi']), 'hi'); _chai.assert.equal(_unknown.default.string()(['hi', 'me']), 'hi,me'); _chai.assert.equal(_unknown.default.string()([]), ''); _chai.assert.equal(_unknown.default.string()({ toString() { return 'foo'; } }), 'foo'); _chai.assert.equal(_unknown.default.string().toLowerCase().trim()('Hello! '), 'hello!'); _chai.assert.throws(() => _unknown.default.string()({}), _errors.ValidationError); _chai.assert.throws(() => _unknown.default.string()(undefined), _errors.ValidationError); _chai.assert.throws(() => _unknown.default.string()(null), _errors.ValidationError); _chai.assert.throws(() => _unknown.default.string()({}), _errors.ValidationError); _chai.assert.throws(() => _unknown.default.string()({ foo: 1 }), _errors.ValidationError); _chai.assert.throws(() => _unknown.default.string('undefined')(undefined), _errors.ValidationError, 'undefined'); }); it('.number()', () => { _chai.assert.equal(_unknown.default.number()(1), 1); _chai.assert.equal(_unknown.default.number()(1.1), 1.1); _chai.assert.equal(_unknown.default.number()('1.1'), 1.1); _chai.assert.equal(_unknown.default.number()('-10.1'), -10.1); _chai.assert.isNaN(_unknown.default.number()('NaN')); _chai.assert.equal(_unknown.default.number()([1]), 1); _chai.assert.equal(_unknown.default.number()([-1.44]), -1.44); _chai.assert.equal(_unknown.default.number()(true), 1); _chai.assert.equal(_unknown.default.number()(false), 0); _chai.assert.equal(_unknown.default.number()(null), 0); _chai.assert.equal(_unknown.default.number()([]), 0); _chai.assert.equal(_unknown.default.number()(''), 0); _chai.assert.throws(() => _unknown.default.number()({}), _errors.ValidationError); _chai.assert.throws(() => _unknown.default.number()(undefined), _errors.ValidationError); _chai.assert.throws(() => _unknown.default.number()([1, 2]), _errors.ValidationError); _chai.assert.throws(() => _unknown.default.number()({ foo: 1 }), _errors.ValidationError); _chai.assert.throws(() => _unknown.default.number('undefined')(undefined), _errors.ValidationError, 'undefined'); }); it('.array().of()', () => { const fooArr = _unknown.default.array().of('foo'); (0, _utils.typeCheck)('ok'); (0, _utils.typeCheck)('ok'); _chai.assert.deepEqual(fooArr(['foo']), ['foo']); _chai.assert.deepEqual(fooArr([]), []); _chai.assert.deepEqual(fooArr(['foo', 'foo']), ['foo', 'foo']); _chai.assert.throws(() => fooArr(['foo', 'bar']), _errors.ValidationError); _chai.assert.throws(() => fooArr(['foo', 1]), _errors.ValidationError); }); it('.date()', () => { _chai.assert.deepEqual(_unknown.default.date()(1), new Date(1)); _chai.assert.deepEqual(_unknown.default.date()('1970-01-01T00:00:00.050Z'), new Date('1970-01-01T00:00:00.050Z')); _chai.assert.throws(() => _unknown.default.date()({}), _errors.ValidationError); _chai.assert.throws(() => _unknown.default.date()(undefined), _errors.ValidationError); _chai.assert.throws(() => _unknown.default.date()([1, 2]), _errors.ValidationError); _chai.assert.throws(() => _unknown.default.date()({ foo: 1 }), _errors.ValidationError); _chai.assert.throws(() => _unknown.default.date()(NaN), _errors.ValidationError); _chai.assert.throws(() => _unknown.default.date()(''), _errors.ValidationError); _chai.assert.throws(() => _unknown.default.date('undefined')(undefined), _errors.ValidationError, 'undefined'); }); it('.enum()', () => { let Mixed; (function (Mixed) { Mixed["Foo"] = "foo"; Mixed[Mixed["Bar"] = 1] = "Bar"; })(Mixed || (Mixed = {})); const validator = _unknown.default.enum(Mixed); (0, _utils.typeCheck)('ok'); (0, _utils.typeCheck)('ok'); _chai.assert.equal(validator('foo'), Mixed.Foo); _chai.assert.equal(validator(1), Mixed.Bar); _chai.assert.throws(() => validator(2), _errors.ValidationError); _chai.assert.throws(() => validator('Foo'), _errors.ValidationError); }); it('.record()', () => { const validator = _unknown.default.record(_string.default, _number.default); (0, _utils.typeCheck)('ok'); (0, _utils.typeCheck)('ok'); _chai.assert.deepEqual(validator({ foo: 1 }), { foo: 1 }); _chai.assert.deepEqual(validator({}), {}); _chai.assert.throws(() => validator(2), _errors.ValidationError); _chai.assert.throws(() => validator('Foo'), _errors.ValidationError); _chai.assert.throws(() => validator({ foo: 'foo' }), _errors.ValidationError); }); }); //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy91bmtub3duLnRlc3QudHMiXSwibmFtZXMiOlsiZGVzY3JpYmUiLCJpdCIsInMiLCJTeW1ib2wiLCJvYmoiLCJmb28iLCJhc3NlcnQiLCJlcXVhbCIsInVuZGVmaW5lZCIsInVua25vd24iLCJib29sZWFuIiwidGhyb3dzIiwiVmFsaWRhdGlvbkVycm9yIiwic3RyaW5nIiwidG9TdHJpbmciLCJ0b0xvd2VyQ2FzZSIsInRyaW0iLCJudW1iZXIiLCJpc05hTiIsImZvb0FyciIsImFycmF5Iiwib2YiLCJkZWVwRXF1YWwiLCJkYXRlIiwiRGF0ZSIsIk5hTiIsIk1peGVkIiwidmFsaWRhdG9yIiwiZW51bSIsIkZvbyIsIkJhciIsInJlY29yZCJdLCJtYXBwaW5ncyI6Ijs7QUFBQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7OztBQUVBO0FBRUFBLFFBQVEsQ0FBQyxTQUFELEVBQVksTUFBTTtBQUN4QkMsRUFBQUEsRUFBRSxDQUFDLFdBQUQsRUFBYyxNQUFNO0FBQ3BCLFVBQU1DLENBQUMsR0FBR0MsTUFBTSxDQUFDLEdBQUQsQ0FBaEI7QUFDQSxVQUFNQyxHQUFHLEdBQUc7QUFBRUMsTUFBQUEsR0FBRyxFQUFFO0FBQVAsS0FBWjs7QUFFQUMsaUJBQU9DLEtBQVAsQ0FBYSxzQkFBUSxJQUFSLENBQWIsRUFBNEIsSUFBNUI7O0FBQ0FELGlCQUFPQyxLQUFQLENBQWEsc0JBQVEsS0FBUixDQUFiLEVBQTZCLEtBQTdCOztBQUNBRCxpQkFBT0MsS0FBUCxDQUFhLHNCQUFRLFFBQVIsQ0FBYixFQUFnQyxRQUFoQzs7QUFDQUQsaUJBQU9DLEtBQVAsQ0FBYSxzQkFBUSxJQUFSLENBQWIsRUFBNEIsSUFBNUI7O0FBQ0FELGlCQUFPQyxLQUFQLENBQWEsc0JBQVFMLENBQVIsQ0FBYixFQUF5QkEsQ0FBekI7O0FBQ0FJLGlCQUFPQyxLQUFQLENBQWEsc0JBQVEsSUFBUixDQUFiLEVBQTRCLElBQTVCOztBQUNBRCxpQkFBT0MsS0FBUCxD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cG9ydCB7IGFzc2VydCB9IGZyb20gJ2NoYWknO1xuaW1wb3J0IHVua25vd24gZnJvbSAnLi91bmtub3duJztcbmltcG9ydCB7IHR5cGVDaGVjayB9IGZyb20gJy4vc2NoZW1hL3V0aWxzJztcbmltcG9ydCB7IFZhbGlkYXRpb25FcnJvciB9IGZyb20gJy4vc2NoZW1hL2Vycm9ycyc7XG5pbXBvcnQgc3RyaW5nIGZyb20gJy4vc3RyaW5nJztcbmltcG9ydCBudW1iZXIgZnJvbSAnLi9udW1iZXInO1xuXG4vKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55ICovXG5cbmRlc2NyaWJlKCd1bmtub3duJywgKCkgPT4ge1xuICBpdCgndW5rbm93bigpJywgKCkgPT4ge1xuICAgIGNvbnN0IHMgPSBTeW1ib2woJ3MnKTtcbiAgICBjb25zdCBvYmogPSB7IGZvbzogMSB9O1xuXG4gICAgYXNzZXJ0LmVxdWFsKHVua25vd24odHJ1ZSksIHRydWUpO1xuICAgIGFzc2VydC5lcXVhbCh1bmtub3duKGZhbHNlKSwgZmFsc2UpO1xuICAgIGFzc2VydC5lcXVhbCh1bmtub3duKCdzdHJpbmcnKSwgJ3N0cmluZycpO1xuICAgIGFzc2VydC5lcXVhbCh1bmtub3duKDEyMzQpLCAxMjM0KTtcbiAgICBhc3NlcnQuZXF1YWwodW5rbm93bihzKSwgcyk7XG4gICAgYXNzZXJ0LmVxdWFsKHVua25vd24obnVsbCksIG51bGwpO1xuICAgIGFzc2VydC5lcXVhbCh1bmtub3duKHVuZGVmaW5lZCksIHVuZGVmaW5lZCk7XG4gICAgYXNzZXJ0LmVxdWFsKHVua25vd24ob2JqKSwgb2JqKTtcbiAgfSk7XG5cbiAgaXQoJy5ib29sZWFuKCknLCAoKSA9PiB7XG4gICAgYXNzZXJ0LmVxdWFsKHVua25vd24uYm9vbGVhbigpKCd0cnVlJyksIHRydWUpO1xuICAgIGFzc2VydC5lcXVhbCh1bmtub3duLmJvb2xlYW4oKSgnZmFsc2UnKSwgZmFsc2UpO1xuICAgIGFzc2VydC5lcXVhbCh1bmtub3duLmJvb2xlYW4oKSgnMScpLCB0cnVlKTtcbiAgICBhc3NlcnQuZXF1YWwodW5rbm93bi5ib29sZWFuKCkoJzAnKSwgZmFsc2UpO1xuICAgIGFzc2VydC5lcXVhbCh1bmtub3duLmJvb2xlYW4oKSgndCcpLCB0cnVlKTtcbiAgICBhc3NlcnQuZXF1YWwodW5rbm93bi5ib29sZWFuKCkoJ2YnKSwgZmFsc2UpO1xuICAgIGFzc2VydC5lcXVhbCh1bmtub3duLmJvb2xlYW4oKSgnVCcpLCB0cnVlKTtcbiAgICBhc3NlcnQuZXF1YWwodW5rbm93bi5ib29sZWFuKCkoJ0YnKSwgZmFsc2UpO1xuICAgIGFzc2VydC5lcXVhbCh1bmtub3duLmJvb2xlYW4oKSgnVHJ1ZScpLCB0cnVlKTtcbiAgICBhc3NlcnQuZXF1YWwodW5rbm93bi5ib29sZWFuKCkoJ0ZhbHNlJyksIGZhbHNlKTtcbiAgICBhc3NlcnQuZXF1YWwodW5rbm93bi5ib29sZWFuKCkoJ1llcycpLCB0cnVlKTtcbiAgICBhc3NlcnQuZXF1YWwodW5rbm93bi5ib29sZWFuKCkoJ05vJyksIGZhbHNlKTtcbiAgICBhc3NlcnQuZXF1YWwodW5rbm93bi5ib29sZWFuKCkoJ1knKSwgdHJ1ZSk7XG4gICAgYXNzZXJ0LmVxdWFsKHVua25vd24uYm9vbGVhbigpKCdOJyksIGZhbHNlKTtcbiAgICBhc3NlcnQuZXF1YWwodW5rbm93bi5ib29sZWFuKCkoMSksIHRydWUpO1xuICAgIGFzc2VydC5lcXVhbCh1bmtub3duLmJvb2xlYW4oKSgwKSwgZmFsc2UpO1xuICAgIGFzc2VydC5lcXVhbCh1bmtub3duLmJvb2xlYW4oKShbMV0pLCB0cnVlKTtcbiAgICBhc3NlcnQuZXF1YWwodW5rbm93bi5ib29sZWFuKCkoWzBdKSwgZmFsc2UpO1xuXG4gICAgYXNzZXJ0LnRocm93cygoKSA9PiB1bmtub3duLmJvb2xlYW4oKShbXSksIFZhbGlkYXRpb25FcnJvcik7XG4gICAgYXNzZXJ0LnRocm93cygoKSA9PiB1bmtub3duLmJvb2xlYW4oKSgnaGVsbG8nKSwgVmFsaWRhdGlvbkVycm9yKTtcbiAgICBhc3NlcnQudGhyb3dzKCgpID0+IHVua25vd24uYm9vbGVhbigpKCcnKSwgVmFsaWRhdGlvbkVycm9yKTtcbiAgICBhc3NlcnQudGhyb3dzKCgpID0+IHVua25vd24uYm9vbGVhbigpKHVuZGVmaW5lZCksIFZhbGlkYXRpb25FcnJvcik7XG4gICAgYXNzZXJ0LnRocm93cygoKSA9PiB1bmtub3duLmJvb2xlYW4oKShudWxsKSwgVmFsaWRhdGlvbkVycm9yKTtcbiAgICBhc3NlcnQudGhyb3dzKCgpID0+IHVua25vd24uYm9vbGVhbigpKHt9KSwgVmFsaWRhdGlvbkVycm9yKTtcbiAgICBhc3NlcnQudGhyb3dzKCgpID0+IHVua25vd24uYm9vbGVhbigpKHsgZm9vOiAxIH0pLCBWYWxpZGF0aW9uRXJyb3IpO1xuXG4gICAgYXNzZXJ0LnRocm93cyhcbiAgICAgICgpID0+IHVua25vd24uYm9vbGVhbigndW5kZWZpbmVkJykodW5kZWZpbmVkKSxcbiAgICAgIFZhbGlkYXRpb25FcnJvcixcbiAgICAgICd1bmRlZmluZWQnLFxuICAgICk7XG4gIH0pO1xuXG4gIGl0KCcuc3RyaW5nKCknLCAoKSA9PiB7XG4gICAgYXNzZXJ0LmVxdWFsKHVua25vd24uc3RyaW5nKCkoJ2hlbGxvJyksICdoZWxsbycpO1xuICAgIGFzc2VydC5lcXVhbCh1bmtub3duLnN0cmluZygpKGZhbHNlKSwgJ2ZhbHNlJyk7XG4gICAgYXNzZXJ0LmVxdWFsKHVua25vd24uc3RyaW5nKCkodHJ1ZSksICd0cnVlJyk7XG4gICAgYXNzZXJ0LmVxdWFsKHVua25vd24uc3RyaW5nKCkoMSksICcxJyk7XG4gICAgYXNzZXJ0LmVxdWFsKHVua25vd24uc3RyaW5nKCkoMCksICcwJyk7XG4gICAgYXNzZXJ0LmVxdWFsKHVua25vd24uc3RyaW5nKCkoLTAuNjUpLCAnLTAuNjUnKTtcbiAgICBhc3NlcnQuZXF1YWwodW5rbm93bi5zdHJpbmcoKShbJ2hpJ10pLCAnaGknKTtcbiAgICBhc3NlcnQuZXF1YWwodW5rbm93bi5zdHJpbmcoKShbJ2hpJywgJ21lJ10pLCAnaGksbWUnKTtcbiAgICBhc3NlcnQuZXF1YWwodW5rbm93bi5zdHJpbmcoKShbXSksICcnKTtcbiAgICBhc3NlcnQuZXF1YWwoXG4gICAgICB1bmtub3duLnN0cmluZygpKHtcbiAgICAgICAgdG9TdHJpbmcoKSB7XG4gICAgICAgICAgcmV0dXJuICdmb28nO1xuICAgICAgICB9LFxuICAgICAgfSksXG4gICAgICAnZm9vJyxcbiAgICApO1xuICAgIGFzc2VydC5lcXVhbCh1bmtub3duLnN0cmluZygpLnRvTG93ZXJDYXNlKCkudHJpbSgpKCdIZWxsbyEgJyksICdoZWxsbyEnKTtcblxuICAgIGFzc2VydC50aHJvd3MoKCkgPT4gdW5rbm93bi5zdHJpbmcoKSh7fSksIFZhbGlkYXRpb25FcnJvcik7XG4gICAgYXNzZXJ0LnRocm93cygoKSA9PiB1bmtub3duLnN0cmluZygpKHVuZGVmaW5lZCksIFZhbGlkYXRpb25FcnJvcik7XG4gICAgYXNzZXJ0LnRocm93cygoKSA9PiB1bmtub3duLnN0cmluZygpKG51bGwpLCBWYWxpZGF0aW9uRXJyb3IpO1xuICAgIGFzc2VydC50aHJvd3MoKCkgPT4gdW5rbm93bi5zdHJpbmcoKSh7fSksIFZhbGlkYXRpb25FcnJvcik7XG4gICAgYXNzZXJ0LnRocm93cygoKSA9PiB1bmtub3duLnN0cmluZygpKHsgZm9vOiAxIH0pLCBWYWxpZGF0aW9uRXJyb3IpO1xuXG4gICAgYXNzZXJ0LnRocm93cyhcbiAgICAgICgpID0+IHVua25vd24uc3RyaW5nKCd1bmRlZmluZWQnKSh1bmRlZmluZWQpLFxuICAgICAgVmFsaWRhdGlvbkVycm9yLFxuICAgICAgJ3VuZGVmaW5lZCcsXG4gICAgKTtcbiAgfSk7XG5cbiAgaXQoJy5udW1iZXIoKScsICgpID0+IHtcbiAgICBhc3NlcnQuZXF1YWwodW5rbm93bi5udW1iZXIoKSgxKSwgMSk7XG4gICAgYXNzZXJ0LmVxdWFsKHVua25vd24ubnVtYmVyKCkoMS4xKSwgMS4xKTtcbiAgICBhc3NlcnQuZXF1YWwodW5rbm93bi5udW1iZXIoKSgnMS4xJyksIDEuMSk7XG4gICAgYXNzZXJ0LmVxdWFsKHVua25vd24ubnVtYmVyKCkoJy0xMC4xJyksIC0xMC4xKTtcbiAgICBhc3NlcnQuaXNOYU4odW5rbm93bi5udW1iZXIoKSgnTmFOJykpO1xuICAgIGFzc2VydC5lcXVhbCh1bmtub3duLm51bWJlcigpKFsxXSksIDEpO1xuICAgIGFzc2VydC5lcXVhbCh1bmtub3duLm51bWJlcigpKFstMS40NF0pLCAtMS40NCk7XG4gICAgYXNzZXJ0LmVxdWFsKHVua25vd24ubnVtYmVyKCkodHJ1ZSksIDEpO1xuICAgIGFzc2VydC5lcXVhbCh1bmtub3duLm51bWJlcigpKGZhbHNlKSwgMCk7XG4gICAgYXNzZXJ0LmVxdWFsKHVua25vd24ubnVtYmVyKCkobnVsbCksIDApO1xuICAgIGFzc2VydC5lcXVhbCh1bmtub3duLm51bWJlcigpKFtdKSwgMCk7XG4gICAgYXNzZXJ0LmVxdWFsKHVua25vd24ubnVtYmVyKCkoJycpLCAwKTtcblxuICAgIGFzc2VydC50aHJvd3MoKCkgPT4gdW5rbm93bi5udW1iZXIoKSh7fSksIFZhbGlkYXRpb25FcnJvcik7XG4gICAgYXNzZXJ0LnRocm93cygoKSA9PiB1bmtub3duLm51bWJlcigpKHVuZGVmaW5lZCksIFZhbGlkYXRpb25FcnJvcik7XG4gICAgYXNzZXJ0LnRocm93cygoKSA9PiB1bmtub3duLm51bWJlcigpKFsxLCAyXSksIFZhbGlkYXRpb25FcnJvcik7XG4gICAgYXNzZXJ0LnRocm93cygoKSA9PiB1bmtub3duLm51bWJlcigpKHsgZm9vOiAxIH0pLCBWYWxpZGF0aW9uRXJyb3IpO1xuXG4gICAgYXNzZXJ0LnRocm93cyhcbiAgICAgICgpID0+IHVua25vd24ubnVtYmVyKCd1bmRlZmluZWQnKSh1bmRlZmluZWQpLFxuICAgICAgVmFsaWRhdGlvbkVycm9yLFxuICAgICAgJ3VuZGVmaW5lZCcsXG4gICAgKTtcbiAgfSk7XG5cbiAgaXQoJy5hcnJheSgpLm9mKCknLCAoKSA9PiB7XG4gICAgY29uc3QgZm9vQXJyID0gdW5rbm93bi5hcnJheSgpLm9mKCdmb28nIGFzIGNvbnN0KTtcbiAgICB0eXBlQ2hlY2s8UmV0dXJuVHlwZTx0eXBlb2YgZm9vQXJyPiwgJ2ZvbydbXT4oJ29rJyk7XG4gICAgdHlwZUNoZWNrPFBhcmFtZXRlcnM8dHlwZW9mIGZvb0Fycj4sIFt1bmtub3duXT4oJ29rJyk7XG5cbiAgICBhc3NlcnQuZGVlcEVxdWFsKGZvb0FycihbJ2ZvbyddKSwgWydmb28nXSk7XG4gICAgYXNzZXJ0LmRlZXBFcXVhbChmb29BcnIoW10pLCBbXSk7XG4gICAgYXNzZXJ0LmRlZXBFcXVhbChmb29BcnIoWydmb28nLCAnZm9vJ10pLCBbJ2ZvbycsICdmb28nXSk7XG5cbiAgICBhc3NlcnQudGhyb3dzKCgpID0+IGZvb0FycihbJ2ZvbycsICdiYXInXSBhcyBhbnkpLCBWYWxpZGF0aW9uRXJyb3IpO1xuICAgIGFzc2VydC50aHJvd3MoKCkgPT4gZm9vQXJyKFsnZm9vJywgMV0gYXMgYW55KSwgVmFsaWRhdGlvbkVycm9yKTtcbiAgfSk7XG5cbiAgaXQoJy5kYXRlKCknLCAoKSA9PiB7XG4gICAgYXNzZXJ0LmRlZXBFcXVhbCh1bmtub3duLmRhdGUoKSgxKSwgbmV3IERhdGUoMSkpO1xuICAgIGFzc2VydC5kZWVwRXF1YWwoXG4gICAgICB1bmtub3duLmRhdGUoKSgnMTk3MC0wMS0wMVQwMDowMDowMC4wNTBaJyksXG4gICAgICBuZXcgRGF0ZSgnMTk3MC0wMS0wMVQwMDowMDowMC4wNTBaJyksXG4gICAgKTtcblxuICAgIGFzc2VydC50aHJvd3MoKCkgPT4gdW5rbm93bi5kYXRlKCkoe30pLCBWYWxpZGF0aW9uRXJyb3IpO1xuICAgIGFzc2VydC50aHJvd3MoKCkgPT4gdW5rbm93bi5kYXRlKCkodW5kZWZpbmVkKSwgVmFsaWRhdGlvbkVycm9yKTtcbiAgICBhc3NlcnQudGhyb3dzKCgpID0+IHVua25vd24uZGF0ZSgpKFsxLCAyXSksIFZhbGlkYXRpb25FcnJvcik7XG4gICAgYXNzZXJ0LnRocm93cygoKSA9PiB1bmtub3duLmRhdGUoKSh7IGZvbzogMSB9KSwgVmFsaWRhdGlvbkVycm9yKTtcbiAgICBhc3NlcnQudGhyb3dzKCgpID0+IHVua25vd24uZGF0ZSgpKE5hTiksIFZhbGlkYXRpb25FcnJvcik7XG4gICAgYXNzZXJ0LnRocm93cygoKSA9PiB1bmtub3duLmRhdGUoKSgnJyksIFZhbGlkYXRpb25FcnJvcik7XG5cbiAgICBhc3NlcnQudGhyb3dzKFxuICAgICAgKCkgPT4gdW5rbm93bi5kYXRlKCd1bmRlZmluZWQnKSh1bmRlZmluZWQpLFxuICAgICAgVmFsaWRhdGlvbkVycm9yLFxuICAgICAgJ3VuZGVmaW5lZCcsXG4gICAgKTtcbiAgfSk7XG5cbiAgaXQoJy5lbnVtKCknLCAoKSA9PiB7XG4gICAgZW51bSBNaXhlZCB7XG4gICAgICBGb28gPSAnZm9vJyxcbiAgICAgIEJhciA9IDEsXG4gICAgfVxuXG4gICAgY29uc3QgdmFsaWRhdG9yID0gdW5rbm93bi5lbnVtKE1peGVkKTtcbiAgICB0eXBlQ2hlY2s8UmV0dXJuVHlwZTx0eXBlb2YgdmFsaWRhdG9yPiwgTWl4ZWQ+KCdvaycpO1xuICAgIHR5cGVDaGVjazxQYXJhbWV0ZXJzPHR5cGVvZiB2YWxpZGF0b3I+LCBbdW5rbm93bl0+KCdvaycpO1xuXG4gICAgYXNzZXJ0LmVxdWFsKHZhbGlkYXRvcignZm9vJyksIE1peGVkLkZvbyk7XG4gICAgYXNzZXJ0LmVxdWFsKHZhbGlkYXRvcigxKSwgTWl4ZWQuQmFyKTtcblxuICAgIGFzc2VydC50aHJvd3MoKCkgPT4gdmFsaWRhdG9yKDIpLCBWYWxpZGF0aW9uRXJyb3IpO1xuICAgIGFzc2VydC50aHJvd3MoKCkgPT4gdmFsaWRhdG9yKCdGb28nKSwgVmFsaWRhdGlvbkVycm9yKTtcbiAgfSk7XG5cbiAgaXQoJy5yZWNvcmQoKScsICgpID0+IHtcbiAgICBjb25zdCB2YWxpZGF0b3IgPSB1bmtub3duLnJlY29yZChzdHJpbmcsIG51bWJlcik7XG5cbiAgICB0eXBlQ2hlY2s8UmV0dXJuVHlwZTx0eXBlb2YgdmFsaWRhdG9yPiwgUmVjb3JkPHN0cmluZywgbnVtYmVyPj4oJ29rJyk7XG4gICAgdHlwZUNoZWNrPFBhcmFtZXRlcnM8dHlwZW9mIHZhbGlkYXRvcj4sIFt1bmtub3duXT4oJ29rJyk7XG5cbiAgICBhc3NlcnQuZGVlcEVxdWFsKHZhbGlkYXRvcih7IGZvbzogMSB9KSwgeyBmb286IDEgfSk7XG4gICAgYXNzZXJ0LmRlZXBFcXVhbCh2YWxpZGF0b3Ioe30pLCB7fSk7XG5cbiAgICBhc3NlcnQudGhyb3dzKCgpID0+IHZhbGlkYXRvcigyKSwgVmFsaWRhdGlvbkVycm9yKTtcbiAgICBhc3NlcnQudGhyb3dzKCgpID0+IHZhbGlkYXRvcignRm9vJyksIFZhbGlkYXRpb25FcnJvcik7XG4gICAgYXNzZXJ0LnRocm93cygoKSA9PiB2YWxpZGF0b3IoeyBmb286ICdmb28nIH0pLCBWYWxpZGF0aW9uRXJyb3IpO1xuICB9KTtcbn0pO1xuIl19