computed-types
Version:
Runtime validation types for TypeScript.
398 lines (332 loc) • 35.6 kB
JavaScript
"use strict";
require("mocha");
var _chai = require("chai");
var _utils = require("./utils");
var _compiler = _interopRequireDefault(require("./compiler"));
var _chaiAsPromised = _interopRequireDefault(require("chai-as-promised"));
var _errors = require("./errors");
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
(0, _chai.use)(_chaiAsPromised.default);
/* eslint-disable @typescript-eslint/no-explicit-any */
describe('schema', () => {
describe('compiler', () => {
it('exact string', () => {
const validator = (0, _compiler.default)('string');
(0, _utils.typeCheck)('ok');
const ret = validator('string');
(0, _utils.typeCheck)('ok');
_chai.assert.equal(ret, 'string');
_chai.assert.throw(() => validator('foo'), _errors.ValidationError);
});
it('exact number', () => {
const validator = (0, _compiler.default)(2);
(0, _utils.typeCheck)('ok');
const ret = validator(2);
(0, _utils.typeCheck)('ok');
_chai.assert.equal(ret, 2);
_chai.assert.throw(() => validator(3), _errors.ValidationError);
});
it('number validator', () => {
const validator = (0, _compiler.default)(x => x + 1);
(0, _utils.typeCheck)('ok');
const ret = validator(2);
(0, _utils.typeCheck)('ok');
_chai.assert.equal(ret, 3);
_chai.assert.equal(validator(true), 2);
});
it('optional validator', () => {
const validator = (0, _compiler.default)((x = 0) => x + 1);
(0, _utils.typeCheck)('ok');
const ret = validator();
(0, _utils.typeCheck)('ok');
_chai.assert.equal(ret, 1);
});
it('RegExp', () => {
const validator = (0, _compiler.default)(/^Foo/);
(0, _utils.typeCheck)('ok');
_chai.assert.equal(validator('Foo'), 'Foo');
_chai.assert.equal(validator('FooBar'), 'FooBar');
_chai.assert.throws(() => validator('foo'), _errors.ValidationError);
});
it('object', () => {
const validator = (0, _compiler.default)({
foo: String,
bar: Number
});
(0, _utils.typeCheck)('ok');
_chai.assert.deepEqual(validator({
foo: 'foo',
bar: 123
}), {
foo: 'foo',
bar: 123
});
_chai.assert.deepEqual(validator({
foo: null,
bar: '123'
}), {
foo: 'null',
bar: 123
});
_chai.assert.throws(() => validator(123), _errors.ValidationError);
});
it('strict mode: off', () => {
const validator = (0, _compiler.default)({
foo: 'bar',
bar: 123
}, {
strict: false
});
_chai.assert.deepEqual(validator({
foo: 'bar',
bar: 123
}), {
foo: 'bar',
bar: 123
});
_chai.assert.deepEqual(validator({
foo: 'bar',
bar: 123,
hello: 123
}), {
foo: 'bar',
bar: 123
});
_chai.assert.throws(() => validator({
foo: 'bar2',
bar: 123,
hello: 123
}), _errors.ValidationError);
_chai.assert.throws(() => validator({
foo: 'bar',
hello: 123
}), _errors.ValidationError);
});
it('strict mode: on', () => {
const validator = (0, _compiler.default)({
foo: 'bar',
bar: 123
}, {
strict: true
});
_chai.assert.deepEqual(validator({
foo: 'bar',
bar: 123
}), {
foo: 'bar',
bar: 123
});
_chai.assert.throws(() => validator({
foo: 'bar',
bar: 123,
hello: 123
}), _errors.ValidationError, 'Unknown property "hello"');
_chai.assert.throws(() => validator({
foo: 'bar2',
bar: 123,
hello: 123
}), _errors.ValidationError, 'Expect value to equal "bar"');
_chai.assert.throws(() => validator({
foo: 'bar',
hello: 123
}), _errors.ValidationError, 'Expect value to equal "123"');
});
it('deep object', () => {
const validator = (0, _compiler.default)({
foo: String,
bar: {
hello: String,
world: Boolean
}
});
(0, _utils.typeCheck)('ok');
_chai.assert.deepEqual(validator({
foo: 'foo',
bar: {
hello: 'hi'
}
}), {
foo: 'foo',
bar: {
hello: 'hi',
world: false
}
});
_chai.assert.deepEqual(validator({
foo: 'foo',
bar: {
hello: 'hi'
},
test: 2
}), {
foo: 'foo',
bar: {
hello: 'hi',
world: false
}
});
_chai.assert.throws(() => validator({
foo: 'foo',
bar: 123
}), _errors.ValidationError);
});
it('null', () => {
const validator = (0, _compiler.default)(null);
(0, _utils.typeCheck)('ok');
_chai.assert.equal(validator(null), null);
_chai.assert.throws(() => validator(12), _errors.ValidationError);
});
it('array', () => {
const validator = (0, _compiler.default)([1, 'foo']);
(0, _utils.typeCheck)('ok');
_chai.assert.deepEqual(validator([1, 'foo']), [1, 'foo']);
_chai.assert.throws(() => validator(['foo', 1]), _errors.ValidationError);
_chai.assert.throws(() => validator([1, 'foo', 1]), _errors.ValidationError);
_chai.assert.throws(() => validator([1]), _errors.ValidationError);
_chai.assert.throws(() => validator([2, 'foo']), _errors.ValidationError);
_chai.assert.throws(() => validator({
foo: 1
}), _errors.ValidationError);
});
it('async', async () => {
const validator = (0, _compiler.default)(x => x >= 0 ? Promise.resolve(x + 1) : Promise.reject(x));
(0, _utils.typeCheck)('ok');
(0, _utils.typeCheck)(validator);
await _chai.assert.isFulfilled(validator(2));
await _chai.assert.isRejected(validator(-1));
_chai.assert.equal(await validator(1), 2);
});
it('deep async', async () => {
const validator = (0, _compiler.default)({
foo: String,
bar: {
hello: x => Promise.resolve(x * 2),
world: Number
}
});
(0, _utils.typeCheck)('ok');
await _chai.assert.isFulfilled(validator({
bar: {
hello: 1
}
}));
await _chai.assert.isRejected(validator({}));
_chai.assert.deepEqual(await validator({
bar: {
hello: 1
}
}), {
foo: 'undefined',
bar: {
hello: 2,
world: NaN
}
});
});
});
describe('compiler errors', () => {
it('error path', () => {
const validator = (0, _compiler.default)({
foo: input => {
if (typeof input !== 'string') {
throw new RangeError('my range error');
}
return input.toUpperCase();
}
});
_chai.assert.deepEqual(validator({
foo: 'foo'
}), {
foo: 'FOO'
});
try {
validator({
foo: 1
});
_chai.assert.fail('should throw');
} catch (e) {
_chai.assert.equal(e.message, 'foo: my range error');
_chai.assert.isArray(e.errors);
_chai.assert.instanceOf(e.errors[0].error, RangeError);
_chai.assert.equal(e.errors[0].error.message, 'my range error');
_chai.assert.deepEqual(e.errors[0].path, ['foo']);
}
});
it('nested error path', () => {
const validator = (0, _compiler.default)({
foo: {
bar: input => {
if (typeof input !== 'string') {
throw new RangeError('my range error');
}
return input.toUpperCase();
}
}
});
_chai.assert.deepEqual(validator({
foo: {
bar: 'bar'
}
}), {
foo: {
bar: 'BAR'
}
});
try {
validator({
foo: {
bar: 1
}
});
_chai.assert.fail('should throw');
} catch (e) {
_chai.assert.equal(e.message, 'foo.bar: my range error');
_chai.assert.isArray(e.errors);
_chai.assert.instanceOf(e.errors[0].error, RangeError);
_chai.assert.equal(e.errors[0].error.message, 'my range error');
_chai.assert.deepEqual(e.errors[0].path, ['foo', 'bar']);
}
});
it('error change path', () => {
const validator = (0, _compiler.default)({
foo: {
bar: input => {
if (typeof input !== 'string') {
throw {
message: 'my path error',
path: ['test']
};
}
return input.toUpperCase();
}
}
});
_chai.assert.deepEqual(validator({
foo: {
bar: 'foo'
}
}), {
foo: {
bar: 'FOO'
}
});
try {
validator({
foo: {
bar: 1
}
});
_chai.assert.fail('should throw');
} catch (e) {
_chai.assert.equal(e.message, 'test: my path error');
_chai.assert.isArray(e.errors);
_chai.assert.deepEqual(e.errors[0].path, ['test']);
_chai.assert.deepEqual(e.errors[0].error, {
message: 'my path error',
path: ['test']
});
}
});
});
});
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zY2hlbWEvY29tcGlsZXIudGVzdC50cyJdLCJuYW1lcyI6WyJjaGFpQXNQcm9taXNlZCIsImRlc2NyaWJlIiwiaXQiLCJ2YWxpZGF0b3IiLCJyZXQiLCJhc3NlcnQiLCJlcXVhbCIsInRocm93IiwiVmFsaWRhdGlvbkVycm9yIiwieCIsInRocm93cyIsImZvbyIsIlN0cmluZyIsImJhciIsIk51bWJlciIsImRlZXBFcXVhbCIsInN0cmljdCIsImhlbGxvIiwid29ybGQiLCJCb29sZWFuIiwidGVzdCIsIlByb21pc2UiLCJyZXNvbHZlIiwicmVqZWN0IiwiaXNGdWxmaWxsZWQiLCJpc1JlamVjdGVkIiwiTmFOIiwiaW5wdXQiLCJSYW5nZUVycm9yIiwidG9VcHBlckNhc2UiLCJmYWlsIiwiZSIsIm1lc3NhZ2UiLCJpc0FycmF5IiwiZXJyb3JzIiwiaW5zdGFuY2VPZiIsImVycm9yIiwicGF0aCJdLCJtYXBwaW5ncyI6Ijs7QUFBQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7OztBQUVBLGVBQUlBLHVCQUFKO0FBRUE7O0FBRUFDLFFBQVEsQ0FBQyxRQUFELEVBQVcsTUFBTTtBQUN2QkEsRUFBQUEsUUFBUSxDQUFDLFVBQUQsRUFBYSxNQUFNO0FBQ3pCQyxJQUFBQSxFQUFFLENBQUMsY0FBRCxFQUFpQixNQUFNO0FBQ3ZCLFlBQU1DLFNBQVMsR0FBRyx1QkFBUyxRQUFULENBQWxCO0FBQ0EsNEJBQXVELElBQXZEO0FBRUEsWUFBTUMsR0FBRyxHQUFHRCxTQUFTLENBQUMsUUFBRCxDQUFyQjtBQUNBLDRCQUFvQyxJQUFwQzs7QUFDQUUsbUJBQU9DLEtBQVAsQ0FBYUYsR0FBYixFQUFrQixRQUFsQjs7QUFFQUMsbUJBQU9FLEtBQVAsQ0FBYSxNQUFNSixTQUFTLENBQUMsS0FBRCxDQUE1QixFQUFpREssdUJBQWpEO0FBQ0QsS0FUQyxDQUFGO0FBV0FOLElBQUFBLEVBQUUsQ0FBQyxjQUFELEVBQWlCLE1BQU07QUFDdkIsWUFBTUMs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TUFBRDtBQUY0QixTQUFwQztBQUlEO0FBQ0YsS0E5QkMsQ0FBRjtBQStCRCxHQXhGTyxDQUFSO0FBeUZELENBL1RPLENBQVIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgJ21vY2hhJztcbmltcG9ydCB7IGFzc2VydCwgdXNlIH0gZnJvbSAnY2hhaSc7XG5pbXBvcnQgeyB0eXBlQ2hlY2sgfSBmcm9tICcuL3V0aWxzJztcbmltcG9ydCBjb21waWxlciBmcm9tICcuL2NvbXBpbGVyJztcbmltcG9ydCBjaGFpQXNQcm9taXNlZCBmcm9tICdjaGFpLWFzLXByb21pc2VkJztcbmltcG9ydCB7IFZhbGlkYXRpb25FcnJvciB9IGZyb20gJy4vZXJyb3JzJztcblxudXNlKGNoYWlBc1Byb21pc2VkKTtcblxuLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSAqL1xuXG5kZXNjcmliZSgnc2NoZW1hJywgKCkgPT4ge1xuICBkZXNjcmliZSgnY29tcGlsZXInLCAoKSA9PiB7XG4gICAgaXQoJ2V4YWN0IHN0cmluZycsICgpID0+IHtcbiAgICAgIGNvbnN0IHZhbGlkYXRvciA9IGNvbXBpbGVyKCdzdHJpbmcnIGFzIGNvbnN0KTtcbiAgICAgIHR5cGVDaGVjazx0eXBlb2YgdmFsaWRhdG9yLCAoeDogJ3N0cmluZycpID0+ICdzdHJpbmcnPignb2snKTtcblxuICAgICAgY29uc3QgcmV0ID0gdmFsaWRhdG9yKCdzdHJpbmcnKTtcbiAgICAgIHR5cGVDaGVjazxbdHlwZW9mIHJldF0sIFsnc3RyaW5nJ10+KCdvaycpO1xuICAgICAgYXNzZXJ0LmVxdWFsKHJldCwgJ3N0cmluZycpO1xuXG4gICAgICBhc3NlcnQudGhyb3coKCkgPT4gdmFsaWRhdG9yKCdmb28nIGFzICdzdHJpbmcnKSwgVmFsaWRhdGlvbkVycm9yKTtcbiAgICB9KTtcblxuICAgIGl0KCdleGFjdCBudW1iZXInLCAoKSA9PiB7XG4gICAgICBjb25zdCB2YWxpZGF0b3IgPSBjb21waWxlcigyIGFzIGNvbnN0KTtcbiAgICAgIHR5cGVDaGVjazx0eXBlb2YgdmFsaWRhdG9yLCAoeDogMikgPT4gMj4oJ29rJyk7XG5cbiAgICAgIGNvbnN0IHJldCA9IHZhbGlkYXRvcigyKTtcbiAgICAgIHR5cGVDaGVjazx0eXBlb2YgcmV0LCAyPignb2snKTtcbiAgICAgIGFzc2VydC5lcXVhbChyZXQsIDIpO1xuXG4gICAgICBhc3NlcnQudGhyb3coKCkgPT4gdmFsaWRhdG9yKDMgYXMgMiksIFZhbGlkYXRpb25FcnJvcik7XG4gICAgfSk7XG5cbiAgICBpdCgnbnVtYmVyIHZhbGlkYXRvcicsICgpID0+IHtcbiAgICAgIGNvbnN0IHZhbGlkYXRvciA9IGNvbXBpbGVyKCh4OiBudW1iZXIpID0+IHggKyAxKTtcbiAgICAgIHR5cGVDaGVjazx0eXBlb2YgdmFsaWRhdG9yLCAoeDogbnVtYmVyKSA9PiBudW1iZXI+KCdvaycpO1xuXG4gICAgICBjb25zdCByZXQgPSB2YWxpZGF0b3IoMik7XG4gICAgICB0eXBlQ2hlY2s8dHlwZW9mIHJldCwgbnVtYmVyPignb2snKTtcbiAgICAgIGFzc2VydC5lcXVhbChyZXQsIDMpO1xuXG4gICAgICBhc3NlcnQuZXF1YWwodmFsaWRhdG9yKHRydWUgYXMgdW5rbm93biBhcyBudW1iZXIpLCAyKTtcbiAgICB9KTtcblxuICAgIGl0KCdvcHRpb25hbCB2YWxpZGF0b3InLCAoKSA9PiB7XG4gICAgICBjb25zdCB2YWxpZGF0b3IgPSBjb21waWxlcigoeCA9IDApID0+IHggKyAxKTtcbiAgICAgIHR5cGVDaGVjazx0eXBlb2YgdmFsaWRhdG9yLCAoeD86IG51bWJlcikgPT4gbnVtYmVyPignb2snKTtcblxuICAgICAgY29uc3QgcmV0ID0gdmFsaWRhdG9yKCk7XG4gICAgICB0eXBlQ2hlY2s8dHlwZW9mIHJldCwgbnVtYmVyPignb2snKTtcbiAgICAgIGFzc2VydC5lcXVhbChyZXQsIDEpO1xuICAgIH0pO1xuXG4gICAgaXQoJ1JlZ0V4cCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHZhbGlkYXRvciA9IGNvbXBpbGVyKC9eRm9vLyk7XG4gICAgICB0eXBlQ2hlY2s8dHlwZW9mIHZhbGlkYXRvciwgKHg6IHN0cmluZykgPT4gc3RyaW5nPignb2snKTtcblxuICAgICAgYXNzZXJ0LmVxdWFsKHZhbGlkYXRvcignRm9vJyksICdGb28nKTtcbiAgICAgIGFzc2VydC5lcXVhbCh2YWxpZGF0b3IoJ0Zvb0JhcicpLCAnRm9vQmFyJyk7XG5cbiAgICAgIGFzc2VydC50aHJvd3MoKCkgPT4gdmFsaWRhdG9yKCdmb28nKSwgVmFsaWRhdGlvbkVycm9yKTtcbiAgICB9KTtcblxuICAgIGl0KCdvYmplY3QnLCAoKSA9PiB7XG4gICAgICBjb25zdCB2YWxpZGF0b3IgPSBjb21waWxlcih7IGZvbzogU3RyaW5nLCBiYXI6IE51bWJlciB9KTtcbiAgICAgIHR5cGVDaGVjazxcbiAgICAgICAgdHlwZW9mIHZhbGlkYXRvcixcbiAgICAgICAgKHg6IHsgZm9vPzogYW55OyBiYXI/OiBhbnkgfSkgPT4geyBmb286IHN0cmluZzsgYmFyOiBudW1iZXIgfVxuICAgICAgPignb2snKTtcblxuICAgICAgYXNzZXJ0LmRlZXBFcXVhbCh2YWxpZGF0b3IoeyBmb286ICdmb28nLCBiYXI6IDEyMyB9KSwge1xuICAgICAgICBmb286ICdmb28nLFxuICAgICAgICBiYXI6IDEyMyxcbiAgICAgIH0pO1xuXG4gICAgICBhc3NlcnQuZGVlcEVxdWFsKHZhbGlkYXRvcih7IGZvbzogbnVsbCwgYmFyOiAnMTIzJyB9KSwge1xuICAgICAgICBmb286ICdudWxsJyxcbiAgICAgICAgYmFyOiAxMjMsXG4gICAgICB9KTtcblxuICAgICAgYXNzZXJ0LnRocm93cygoKSA9PiB2YWxpZGF0b3IoMTIzIGFzIGFueSksIFZhbGlkYXRpb25FcnJvcik7XG4gICAgfSk7XG5cbiAgICBpdCgnc3RyaWN0IG1vZGU6IG9mZicsICgpID0+IHtcbiAgICAgIGNvbnN0IHZhbGlkYXRvciA9IGNvbXBpbGVyKFxuICAgICAgICB7IGZvbzogJ2JhcicgYXMgY29uc3QsIGJhcjogMTIzIGFzIGNvbnN0IH0sXG4gICAgICAgIHsgc3RyaWN0OiBmYWxzZSB9LFxuICAgICAgKTtcblxuICAgICAgYXNzZXJ0LmRlZXBFcXVhbCh2YWxpZGF0b3IoeyBmb286ICdiYXInLCBiYXI6IDEyMyB9KSwge1xuICAgICAgICBmb286ICdiYXInLFxuICAgICAgICBiYXI6IDEyMyxcbiAgICAgIH0pO1xuXG4gICAgICBhc3NlcnQuZGVlcEVxdWFsKHZhbGlkYXRvcih7IGZvbzogJ2JhcicsIGJhcjogMTIzLCBoZWxsbzogMTIzIH0gYXMgYW55KSwge1xuICAgICAgICBmb286ICdiYXInLFxuICAgICAgICBiYXI6IDEyMyxcbiAgICAgIH0pO1xuXG4gICAgICBhc3NlcnQudGhyb3dzKFxuICAgICAgICAoKSA9PiB2YWxpZGF0b3IoeyBmb286ICdiYXIyJywgYmFyOiAxMjMsIGhlbGxvOiAxMjMgfSBhcyBhbnkpLFxuICAgICAgICBWYWxpZGF0aW9uRXJyb3IsXG4gICAgICApO1xuXG4gICAgICBhc3NlcnQudGhyb3dzKFxuICAgICAgICAoKSA9PiB2YWxpZGF0b3IoeyBmb286ICdiYXInLCBoZWxsbzogMTIzIH0gYXMgYW55KSxcbiAgICAgICAgVmFsaWRhdGlvbkVycm9yLFxuICAgICAgKTtcbiAgICB9KTtcblxuICAgIGl0KCdzdHJpY3QgbW9kZTogb24nLCAoKSA9PiB7XG4gICAgICBjb25zdCB2YWxpZGF0b3IgPSBjb21waWxlcihcbiAgICAgICAgeyBmb286ICdiYXInIGFzIGNvbnN0LCBiYXI6IDEyMyBhcyBjb25zdCB9LFxuICAgICAgICB7IHN0cmljdDogdHJ1ZSB9LFxuICAgICAgKTtcblxuICAgICAgYXNzZXJ0LmRlZXBFcXVhbCh2YWxpZGF0b3IoeyBmb286ICdiYXInLCBiYXI6IDEyMyB9KSwge1xuICAgICAgICBmb286ICdiYXInLFxuICAgICAgICBiYXI6IDEyMyxcbiAgICAgIH0pO1xuXG4gICAgICBhc3NlcnQudGhyb3dzKFxuICAgICAgICAoKSA9PiB2YWxpZGF0b3IoeyBmb286ICdiYXInLCBiYXI6IDEyMywgaGVsbG86IDEyMyB9IGFzIGFueSksXG4gICAgICAgIFZhbGlkYXRpb25FcnJvcixcbiAgICAgICAgJ1Vua25vd24gcHJvcGVydHkgXCJoZWxsb1wiJyxcbiAgICAgICk7XG5cbiAgICAgIGFzc2VydC50aHJvd3MoXG4gICAgICAgICgpID0+IHZhbGlkYXRvcih7IGZvbzogJ2JhcjInLCBiYXI6IDEyMywgaGVsbG86IDEyMyB9IGFzIGFueSksXG4gICAgICAgIFZhbGlkYXRpb25FcnJvcixcbiAgICAgICAgJ0V4cGVjdCB2YWx1ZSB0byBlcXVhbCBcImJhclwiJyxcbiAgICAgICk7XG5cbiAgICAgIGFzc2VydC50aHJvd3MoXG4gICAgICAgICgpID0+IHZhbGlkYXRvcih7IGZvbzogJ2JhcicsIGhlbGxvOiAxMjMgfSBhcyBhbnkpLFxuICAgICAgICBWYWxpZGF0aW9uRXJyb3IsXG4gICAgICAgICdFeHBlY3QgdmFsdWUgdG8gZXF1YWwgXCIxMjNcIicsXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgaXQoJ2RlZXAgb2JqZWN0JywgKCkgPT4ge1xuICAgICAgY29uc3QgdmFsaWRhdG9yID0gY29tcGlsZXIoe1xuICAgICAgICBmb286IFN0cmluZyxcbiAgICAgICAgYmFyOiB7IGhlbGxvOiBTdHJpbmcsIHdvcmxkOiBCb29sZWFuIH0sXG4gICAgICB9KTtcbiAgICAgIHR5cGVDaGVjazxcbiAgICAgICAgdHlwZW9mIHZhbGlkYXRvcixcbiAgICAgICAgKHg6IHsgZm9vPzogYW55OyBiYXI6IHsgaGVsbG8/OiBhbnk7IHdvcmxkPzogdW5rbm93biB9IH0pID0+IHtcbiAgICAgICAgICBmb286IHN0cmluZztcbiAgICAgICAgICBiYXI6IHsgaGVsbG86IHN0cmluZzsgd29ybGQ6IGJvb2xlYW4gfTtcbiAgICAgICAgfVxuICAgICAgPignb2snKTtcblxuICAgICAgYXNzZXJ0LmRlZXBFcXVhbCh2YWxpZGF0b3IoeyBmb286ICdmb28nLCBiYXI6IHsgaGVsbG86ICdoaScgfSB9KSwge1xuICAgICAgICBmb286ICdmb28nLFxuICAgICAgICBiYXI6IHsgaGVsbG86ICdoaScsIHdvcmxkOiBmYWxzZSB9LFxuICAgICAgfSk7XG5cbiAgICAgIGFzc2VydC5kZWVwRXF1YWwoXG4gICAgICAgIHZhbGlkYXRvcih7IGZvbzogJ2ZvbycsIGJhcjogeyBoZWxsbzogJ2hpJyB9LCB0ZXN0OiAyIH0gYXMgYW55KSxcbiAgICAgICAge1xuICAgICAgICAgIGZvbzogJ2ZvbycsXG4gICAgICAgICAgYmFyOiB7IGhlbGxvOiAnaGknLCB3b3JsZDogZmFsc2UgfSxcbiAgICAgICAgfSxcbiAgICAgICk7XG5cbiAgICAgIGFzc2VydC50aHJvd3MoXG4gICAgICAgICgpID0+IHZhbGlkYXRvcih7IGZvbzogJ2ZvbycsIGJhcjogMTIzIH0gYXMgYW55KSxcbiAgICAgICAgVmFsaWRhdGlvbkVycm9yLFxuICAgICAgKTtcbiAgICB9KTtcblxuICAgIGl0KCdudWxsJywgKCkgPT4ge1xuICAgICAgY29uc3QgdmFsaWRhdG9yID0gY29tcGlsZXIobnVsbCk7XG4gICAgICB0eXBlQ2hlY2s8dHlwZW9mIHZhbGlkYXRvciwgKHg6IG51bGwpID0+IG51bGw+KCdvaycpO1xuXG4gICAgICBhc3NlcnQuZXF1YWwodmFsaWRhdG9yKG51bGwpLCBudWxsKTtcblxuICAgICAgYXNzZXJ0LnRocm93cygoKSA9PiB2YWxpZGF0b3IoMTIgYXMgYW55KSwgVmFsaWRhdGlvbkVycm9yKTtcbiAgICB9KTtcblxuICAgIGl0KCdhcnJheScsICgpID0+IHtcbiAgICAgIGNvbnN0IHZhbGlkYXRvciA9IGNvbXBpbGVyKFsxLCAnZm9vJ10gYXMgWzEsICdmb28nXSk7XG4gICAgICB0eXBlQ2hlY2s8dHlwZW9mIHZhbGlkYXRvciwgKHg6IFsxLCAnZm9vJ10pID0+IFsxLCAnZm9vJ10+KCdvaycpO1xuXG4gICAgICBhc3NlcnQuZGVlcEVxdWFsKHZhbGlkYXRvcihbMSwgJ2ZvbyddKSwgWzEsICdmb28nXSk7XG5cbiAgICAgIGFzc2VydC50aHJvd3MoKCkgPT4gdmFsaWRhdG9yKFsnZm9vJywgMV0gYXMgYW55KSwgVmFsaWRhdGlvbkVycm9yKTtcbiAgICAgIGFzc2VydC50aHJvd3MoKCkgPT4gdmFsaWRhdG9yKFsxLCAnZm9vJywgMV0gYXMgYW55KSwgVmFsaWRhdGlvbkVycm9yKTtcbiAgICAgIGFzc2VydC50aHJvd3MoKCkgPT4gdmFsaWRhdG9yKFsxXSBhcyBhbnkpLCBWYWxpZGF0aW9uRXJyb3IpO1xuICAgICAgYXNzZXJ0LnRocm93cygoKSA9PiB2YWxpZGF0b3IoWzIsICdmb28nXSBhcyBhbnkpLCBWYWxpZGF0aW9uRXJyb3IpO1xuICAgICAgYXNzZXJ0LnRocm93cygoKSA9PiB2YWxpZGF0b3IoeyBmb286IDEgfSBhcyBhbnkpLCBWYWxpZGF0aW9uRXJyb3IpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2FzeW5jJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgdmFsaWRhdG9yID0gY29tcGlsZXIoXG4gICAgICAgICh4OiBudW1iZXIpOiBQcm9taXNlTGlrZTxudW1iZXI+ID0+XG4gICAgICAgICAgeCA+PSAwID8gUHJvbWlzZS5yZXNvbHZlKHggKyAxKSA6IFByb21pc2UucmVqZWN0KHgpLFxuICAgICAgKTtcbiAgICAgIHR5cGVDaGVjazx0eXBlb2YgdmFsaWRhdG9yLCAoeDogbnVtYmVyKSA9PiBQcm9taXNlTGlrZTxudW1iZXI+Pignb2snKTtcbiAgICAgIHR5cGVDaGVjazx0eXBlb2YgdmFsaWRhdG9yLCAoeDogc3RyaW5nKSA9PiBQcm9taXNlTGlrZTxudW1iZXI+PihcbiAgICAgICAgdmFsaWRhdG9yLFxuICAgICAgKTtcblxuICAgICAgYXdhaXQgYXNzZXJ0LmlzRnVsZmlsbGVkKHZhbGlkYXRvcigyKSk7XG4gICAgICBhd2FpdCBhc3NlcnQuaXNSZWplY3RlZCh2YWxpZGF0b3IoLTEpKTtcblxuICAgICAgYXNzZXJ0LmVxdWFsKGF3YWl0IHZhbGlkYXRvcigxKSwgMik7XG4gICAgfSk7XG5cbiAgICBpdCgnZGVlcCBhc3luYycsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHZhbGlkYXRvciA9IGNvbXBpbGVyKHtcbiAgICAgICAgZm9vOiBTdHJpbmcsXG4gICAgICAgIGJhcjoge1xuICAgICAgICAgIGhlbGxvOiAoeDogbnVtYmVyKTogUHJvbWlzZTxudW1iZXI+ID0+IFByb21pc2UucmVzb2x2ZSh4ICogMiksXG4gICAgICAgICAgd29ybGQ6IE51bWJlcixcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgICAgdHlwZUNoZWNrPFxuICAgICAgICB0eXBlb2YgdmFsaWRhdG9yLFxuICAgICAgICAoeDogeyBmb28/OiBhbnk7IGJhcjogeyBoZWxsbzogbnVtYmVyOyB3b3JsZD86IGFueSB9IH0pID0+IFByb21pc2VMaWtlPHtcbiAgICAgICAgICBmb286IHN0cmluZztcbiAgICAgICAgICBiYXI6IHsgaGVsbG86IG51bWJlcjsgd29ybGQ6IG51bWJlciB9O1xuICAgICAgICB9PlxuICAgICAgPignb2snKTtcblxuICAgICAgYXdhaXQgYXNzZXJ0LmlzRnVsZmlsbGVkKHZhbGlkYXRvcih7IGJhcjogeyBoZWxsbzogMSB9IH0pKTtcbiAgICAgIGF3YWl0IGFzc2VydC5pc1JlamVjdGVkKHZhbGlkYXRvcih7fSBhcyBhbnkpKTtcblxuICAgICAgYXNzZXJ0LmRlZXBFcXVhbChhd2FpdCB2YWxpZGF0b3IoeyBiYXI6IHsgaGVsbG86IDEgfSB9KSwge1xuICAgICAgICBmb286ICd1bmRlZmluZWQnLFxuICAgICAgICBiYXI6IHtcbiAgICAgICAgICBoZWxsbzogMixcbiAgICAgICAgICB3b3JsZDogTmFOLFxuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdjb21waWxlciBlcnJvcnMnLCAoKSA9PiB7XG4gICAgaXQoJ2Vycm9yIHBhdGgnLCAoKSA9PiB7XG4gICAgICBjb25zdCB2YWxpZGF0b3IgPSBjb21waWxlcih7XG4gICAgICAgIGZvbzogKGlucHV0OiBzdHJpbmcpID0+IHtcbiAgICAgICAgICBpZiAodHlwZW9mIGlucHV0ICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ215IHJhbmdlIGVycm9yJyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIGlucHV0LnRvVXBwZXJDYXNlKCk7XG4gICAgICAgIH0sXG4gICAgICB9KTtcblxuICAgICAgYXNzZXJ0LmRlZXBFcXVhbCh2YWxpZGF0b3IoeyBmb286ICdmb28nIH0pLCB7IGZvbzogJ0ZPTycgfSk7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHZhbGlkYXRvcih7IGZvbzogMSBhcyBuZXZlciB9KTtcbiAgICAgICAgYXNzZXJ0LmZhaWwoJ3Nob3VsZCB0aHJvdycpO1xuICAgICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICAgIGFzc2VydC5lcXVhbChlLm1lc3NhZ2UsICdmb286IG15IHJhbmdlIGVycm9yJyk7XG4gICAgICAgIGFzc2VydC5pc0FycmF5KGUuZXJyb3JzKTtcblxuICAgICAgICBhc3NlcnQuaW5zdGFuY2VPZihlLmVycm9yc1swXS5lcnJvciwgUmFuZ2VFcnJvcik7XG4gICAgICAgIGFzc2VydC5lcXVhbChlLmVycm9yc1swXS5lcnJvci5tZXNzYWdlLCAnbXkgcmFuZ2UgZXJyb3InKTtcbiAgICAgICAgYXNzZXJ0LmRlZXBFcXVhbChlLmVycm9yc1swXS5wYXRoLCBbJ2ZvbyddKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGl0KCduZXN0ZWQgZXJyb3IgcGF0aCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHZhbGlkYXRvciA9IGNvbXBpbGVyKHtcbiAgICAgICAgZm9vOiB7XG4gICAgICAgICAgYmFyOiAoaW5wdXQ6IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBpbnB1dCAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ215IHJhbmdlIGVycm9yJyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBpbnB1dC50b1VwcGVyQ2FzZSgpO1xuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICB9KTtcblxuICAgICAgYXNzZXJ0LmRlZXBFcXVhbCh2YWxpZGF0b3IoeyBmb286IHsgYmFyOiAnYmFyJyB9IH0pLCB7XG4gICAgICAgIGZvbzogeyBiYXI6ICdCQVInIH0sXG4gICAgICB9KTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgdmFsaWRhdG9yKHsgZm9vOiB7IGJhcjogMSB9IGFzIG5ldmVyIH0pO1xuICAgICAgICBhc3NlcnQuZmFpbCgnc2hvdWxkIHRocm93Jyk7XG4gICAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgICAgYXNzZXJ0LmVxdWFsKGUubWVzc2FnZSwgJ2Zvby5iYXI6IG15IHJhbmdlIGVycm9yJyk7XG4gICAgICAgIGFzc2VydC5pc0FycmF5KGUuZXJyb3JzKTtcblxuICAgICAgICBhc3NlcnQuaW5zdGFuY2VPZihlLmVycm9yc1swXS5lcnJvciwgUmFuZ2VFcnJvcik7XG4gICAgICAgIGFzc2VydC5lcXVhbChlLmVycm9yc1swXS5lcnJvci5tZXNzYWdlLCAnbXkgcmFuZ2UgZXJyb3InKTtcbiAgICAgICAgYXNzZXJ0LmRlZXBFcXVhbChlLmVycm9yc1swXS5wYXRoLCBbJ2ZvbycsICdiYXInXSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBpdCgnZXJyb3IgY2hhbmdlIHBhdGgnLCAoKSA9PiB7XG4gICAgICBjb25zdCB2YWxpZGF0b3IgPSBjb21waWxlcih7XG4gICAgICAgIGZvbzoge1xuICAgICAgICAgIGJhcjogKGlucHV0OiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgaW5wdXQgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgIHRocm93IHsgbWVzc2FnZTogJ215IHBhdGggZXJyb3InLCBwYXRoOiBbJ3Rlc3QnXSB9O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gaW5wdXQudG9VcHBlckNhc2UoKTtcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgfSk7XG5cbiAgICAgIGFzc2VydC5kZWVwRXF1YWwodmFsaWRhdG9yKHsgZm9vOiB7IGJhcjogJ2ZvbycgfSB9KSwge1xuICAgICAgICBmb286IHsgYmFyOiAnRk9PJyB9LFxuICAgICAgfSk7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHZhbGlkYXRvcih7IGZvbzogeyBiYXI6IDEgYXMgbmV2ZXIgfSB9KTtcbiAgICAgICAgYXNzZXJ0LmZhaWwoJ3Nob3VsZCB0aHJvdycpO1xuICAgICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICAgIGFzc2VydC5lcXVhbChlLm1lc3NhZ2UsICd0ZXN0OiBteSBwYXRoIGVycm9yJyk7XG4gICAgICAgIGFzc2VydC5pc0FycmF5KGUuZXJyb3JzKTtcblxuICAgICAgICBhc3NlcnQuZGVlcEVxdWFsKGUuZXJyb3JzWzBdLnBhdGgsIFsndGVzdCddKTtcbiAgICAgICAgYXNzZXJ0LmRlZXBFcXVhbChlLmVycm9yc1swXS5lcnJvciwge1xuICAgICAgICAgIG1lc3NhZ2U6ICdteSBwYXRoIGVycm9yJyxcbiAgICAgICAgICBwYXRoOiBbJ3Rlc3QnXSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXX0=