UNPKG

funval

Version:

A minimalist library for data validation using functions interfaces.

153 lines (97 loc) 14.7 kB
"use strict"; require("mocha"); var _chai = require("chai"); var _chaiAsPromised = _interopRequireDefault(require("chai-as-promised")); 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('String', () => { const validator = (0, _Schema.default)(String); _chai.assert.equal(validator('foo'), 'foo'); _chai.assert.equal(validator(123), '123'); _chai.assert.equal(validator(12.3), '12.3'); _chai.assert.equal(validator(0), '0'); _chai.assert.equal(validator(NaN), 'NaN'); _chai.assert.equal(validator(undefined), 'undefined'); _chai.assert.equal(validator(true), 'true'); _chai.assert.equal(validator(null), 'null'); _chai.assert.equal(validator({}), '[object Object]'); }); it('Number', () => { const validator = (0, _Schema.default)(Number); _chai.assert.equal(validator(123), 123); _chai.assert.equal(validator(12.3), 12.3); _chai.assert.equal(validator(-12.3), -12.3); _chai.assert.equal(validator(0), 0); _chai.assert.isNaN(validator(NaN)); _chai.assert.isNaN(validator('NaN')); _chai.assert.equal(validator('123'), 123); _chai.assert.equal(validator('1.23'), 1.23); _chai.assert.equal(validator('-1.23'), -1.23); _chai.assert.isNaN(validator(undefined)); _chai.assert.equal(validator(true), 1); _chai.assert.equal(validator(false), 0); _chai.assert.equal(validator(null), 0); _chai.assert.isNaN(validator({})); }); it('Boolean', () => { const validator = (0, _Schema.default)(Boolean); _chai.assert.equal(validator(true), true); _chai.assert.equal(validator(false), false); _chai.assert.equal(validator(0), false); _chai.assert.equal(validator(1), true); _chai.assert.equal(validator('foo'), true); _chai.assert.equal(validator('true'), true); }); it('RegExp', () => { const validator = (0, _Schema.default)(/^Foo/); _chai.assert.equal(validator('Foo'), 'Foo'); _chai.assert.equal(validator('FooBar'), 'FooBar'); _chai.assert.throws(() => validator('foo'), TypeError); }); it('object', () => { const validator = (0, _Schema.default)({ foo: String, bar: Number }); _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), TypeError); }); it('null', () => { const validator = (0, _Schema.default)(null); _chai.assert.equal(validator(null), null); // eslint-disable-next-line @typescript-eslint/no-explicit-any _chai.assert.throws(() => validator(12), TypeError); }); it('Array', () => { const validator = (0, _Schema.default)([1, 'foo']); _chai.assert.deepEqual(validator([1, 'foo']), [1, 'foo']); _chai.assert.throws(() => validator([1, 'foo', 1]), TypeError); _chai.assert.throws(() => validator([1]), TypeError); // eslint-disable-next-line @typescript-eslint/no-explicit-any _chai.assert.throws(() => validator([2, 'foo']), TypeError); // eslint-disable-next-line @typescript-eslint/no-explicit-any _chai.assert.throws(() => validator({ foo: 1 }), TypeError); }); it('Async', async () => { const validator = (0, _Schema.default)((0, _Schema.Async)((0, _Schema.default)('foo'))); _chai.assert.equal((await validator('foo')), 'foo'); // eslint-disable-next-line @typescript-eslint/no-explicit-any await _chai.assert.isRejected(validator('bar')); }); }); //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9TY2hlbWEudGVzdC50cyJdLCJuYW1lcyI6WyJjaGFpQXNQcm9taXNlZCIsImRlc2NyaWJlIiwiaXQiLCJ2YWxpZGF0b3IiLCJTdHJpbmciLCJhc3NlcnQiLCJlcXVhbCIsIk5hTiIsInVuZGVmaW5lZCIsIk51bWJlciIsImlzTmFOIiwiQm9vbGVhbiIsInRocm93cyIsIlR5cGVFcnJvciIsImZvbyIsImJhciIsImRlZXBFcXVhbCIsImlzUmVqZWN0ZWQiXSwibWFwcGluZ3MiOiI7O0FBQUE7O0FBQ0E7O0FBQ0E7O0FBSUE7Ozs7Ozs7O0FBRkEsZUFBSUEsdUJBQUo7QUFJQUMsUUFBUSxDQUFDLFFBQUQsRUFBVyxNQUFNO0FBQ3ZCQyxFQUFBQSxFQUFFLENBQUMsUUFBRCxFQUFXLE1BQU07QUFDakIsVUFBTUMsU0FBUyxHQUFHLHFCQUFPQyxNQUFQLENBQWxCOztBQUVBQyxpQkFBT0MsS0FBUCxDQUFhSCxTQUFTLENBQUMsS0FBRCxDQUF0QixFQUErQixLQUEvQjs7QUFDQUUsaUJBQU9DLEtBQVAsQ0FBYUgsU0FBUyxDQUFDLEdBQUQsQ0FBdEIsRUFBNkIsS0FBN0I7O0FBQ0FFLGlCQUFPQyxLQUFQLENBQWFILFNBQVMsQ0FBQyxJQUFELENBQXRCLEVBQThCLE1BQTlCOztBQUNBRSxpQkFBT0MsS0FBUCxDQUFhSCxTQUFTLENBQUMsQ0FBRCxDQUF0QixFQUEyQixHQUEzQjs7QUFDQUUsaUJBQU9DLEtBQVAsQ0FBYUgsU0FBUyxDQUFDSSxHQUFELENBQXRCLEVBQTZCLEtBQTdCOztBQUNBRixpQkFBT0MsS0FBUCxDQUFhSCxTQUFTLENBQUNLLFNBQUQsQ0FBdEIsRUFBbUMsV0FBbkM7O0FBQ0FILGlCQUFPQyxLQUFQLENBQWFILFNBQVMsQ0FBQyxJQUFELENBQXRCLEVBQThCLE1BQTlCOztBQUNBRSxpQkFBT0MsS0FBUCxDQUFhSCxTQUFTLENBQUMsSUFBRCxDQUF0QixFQUE4QixNQUE5Qjs7QUFDQUUsaUJBQU9DLEtBQVAsQ0FBYUgsU0FBUyxD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QUNBUixpQkFBT08sTUFBUCxDQUFjLE1BQU1ULFNBQVMsQ0FBQyxDQUFDLENBQUQsQ0FBRCxDQUE3QixFQUFvQ1UsU0FBcEMsRUFOZ0IsQ0FPaEI7OztBQUNBUixpQkFBT08sTUFBUCxDQUFjLE1BQU1ULFNBQVMsQ0FBQyxDQUFDLENBQUQsRUFBSSxLQUFKLENBQUQsQ0FBN0IsRUFBa0RVLFNBQWxELEVBUmdCLENBU2hCOzs7QUFDQVIsaUJBQU9PLE1BQVAsQ0FBYyxNQUFNVCxTQUFTLENBQUM7QUFBRVcsTUFBQUEsR0FBRyxFQUFFO0FBQVAsS0FBRCxDQUE3QixFQUFrREQsU0FBbEQ7QUFDRCxHQVhDLENBQUY7QUFhQVgsRUFBQUEsRUFBRSxDQUFDLE9BQUQsRUFBVSxZQUFZO0FBQ3RCLFVBQU1DLFNBQVMsR0FBRyxxQkFBTyxtQkFBTSxxQkFBTyxLQUFQLENBQU4sQ0FBUCxDQUFsQjs7QUFFQUUsaUJBQU9DLEtBQVAsRUFBYSxNQUFNSCxTQUFTLENBQUMsS0FBRCxDQUE1QixHQUFxQyxLQUFyQyxFQUhzQixDQUt0Qjs7O0FBQ0EsVUFBTUUsYUFBT1ksVUFBUCxDQUFrQmQsU0FBUyxDQUFDLEtBQUQsQ0FBM0IsQ0FBTjtBQUNELEdBUEMsQ0FBRjtBQVFELENBcEdPLENBQVIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgJ21vY2hhJztcbmltcG9ydCB7IGFzc2VydCwgdXNlIH0gZnJvbSAnY2hhaSc7XG5pbXBvcnQgY2hhaUFzUHJvbWlzZWQgZnJvbSAnY2hhaS1hcy1wcm9taXNlZCc7XG5cbnVzZShjaGFpQXNQcm9taXNlZCk7XG5cbmltcG9ydCBTY2hlbWEsIHsgQXN5bmMgfSBmcm9tICcuL1NjaGVtYSc7XG5cbmRlc2NyaWJlKCdTY2hlbWEnLCAoKSA9PiB7XG4gIGl0KCdTdHJpbmcnLCAoKSA9PiB7XG4gICAgY29uc3QgdmFsaWRhdG9yID0gU2NoZW1hKFN0cmluZyk7XG5cbiAgICBhc3NlcnQuZXF1YWwodmFsaWRhdG9yKCdmb28nKSwgJ2ZvbycpO1xuICAgIGFzc2VydC5lcXVhbCh2YWxpZGF0b3IoMTIzKSwgJzEyMycpO1xuICAgIGFzc2VydC5lcXVhbCh2YWxpZGF0b3IoMTIuMyksICcxMi4zJyk7XG4gICAgYXNzZXJ0LmVxdWFsKHZhbGlkYXRvcigwKSwgJzAnKTtcbiAgICBhc3NlcnQuZXF1YWwodmFsaWRhdG9yKE5hTiksICdOYU4nKTtcbiAgICBhc3NlcnQuZXF1YWwodmFsaWRhdG9yKHVuZGVmaW5lZCksICd1bmRlZmluZWQnKTtcbiAgICBhc3NlcnQuZXF1YWwodmFsaWRhdG9yKHRydWUpLCAndHJ1ZScpO1xuICAgIGFzc2VydC5lcXVhbCh2YWxpZGF0b3IobnVsbCksICdudWxsJyk7XG4gICAgYXNzZXJ0LmVxdWFsKHZhbGlkYXRvcih7fSksICdbb2JqZWN0IE9iamVjdF0nKTtcbiAgfSk7XG5cbiAgaXQoJ051bWJlcicsICgpID0+IHtcbiAgICBjb25zdCB2YWxpZGF0b3IgPSBTY2hlbWEoTnVtYmVyKTtcblxuICAgIGFzc2VydC5lcXVhbCh2YWxpZGF0b3IoMTIzKSwgMTIzKTtcbiAgICBhc3NlcnQuZXF1YWwodmFsaWRhdG9yKDEyLjMpLCAxMi4zKTtcbiAgICBhc3NlcnQuZXF1YWwodmFsaWRhdG9yKC0xMi4zKSwgLTEyLjMpO1xuICAgIGFzc2VydC5lcXVhbCh2YWxpZGF0b3IoMCksIDApO1xuICAgIGFzc2VydC5pc05hTih2YWxpZGF0b3IoTmFOKSk7XG4gICAgYXNzZXJ0LmlzTmFOKHZhbGlkYXRvcignTmFOJykpO1xuICAgIGFzc2VydC5lcXVhbCh2YWxpZGF0b3IoJzEyMycpLCAxMjMpO1xuICAgIGFzc2VydC5lcXVhbCh2YWxpZGF0b3IoJzEuMjMnKSwgMS4yMyk7XG4gICAgYXNzZXJ0LmVxdWFsKHZhbGlkYXRvcignLTEuMjMnKSwgLTEuMjMpO1xuICAgIGFzc2VydC5pc05hTih2YWxpZGF0b3IodW5kZWZpbmVkKSk7XG4gICAgYXNzZXJ0LmVxdWFsKHZhbGlkYXRvcih0cnVlKSwgMSk7XG4gICAgYXNzZXJ0LmVxdWFsKHZhbGlkYXRvcihmYWxzZSksIDApO1xuICAgIGFzc2VydC5lcXVhbCh2YWxpZGF0b3IobnVsbCksIDApO1xuICAgIGFzc2VydC5pc05hTih2YWxpZGF0b3Ioe30pKTtcbiAgfSk7XG5cbiAgaXQoJ0Jvb2xlYW4nLCAoKSA9PiB7XG4gICAgY29uc3QgdmFsaWRhdG9yID0gU2NoZW1hKEJvb2xlYW4pO1xuXG4gICAgYXNzZXJ0LmVxdWFsKHZhbGlkYXRvcih0cnVlKSwgdHJ1ZSk7XG4gICAgYXNzZXJ0LmVxdWFsKHZhbGlkYXRvcihmYWxzZSksIGZhbHNlKTtcbiAgICBhc3NlcnQuZXF1YWwodmFsaWRhdG9yKDApLCBmYWxzZSk7XG4gICAgYXNzZXJ0LmVxdWFsKHZhbGlkYXRvcigxKSwgdHJ1ZSk7XG4gICAgYXNzZXJ0LmVxdWFsKHZhbGlkYXRvcignZm9vJyksIHRydWUpO1xuICAgIGFzc2VydC5lcXVhbCh2YWxpZGF0b3IoJ3RydWUnKSwgdHJ1ZSk7XG4gIH0pO1xuXG4gIGl0KCdSZWdFeHAnLCAoKSA9PiB7XG4gICAgY29uc3QgdmFsaWRhdG9yID0gU2NoZW1hKC9eRm9vLyk7XG5cbiAgICBhc3NlcnQuZXF1YWwodmFsaWRhdG9yKCdGb28nKSwgJ0ZvbycpO1xuICAgIGFzc2VydC5lcXVhbCh2YWxpZGF0b3IoJ0Zvb0JhcicpLCAnRm9vQmFyJyk7XG5cbiAgICBhc3NlcnQudGhyb3dzKCgpID0+IHZhbGlkYXRvcignZm9vJyksIFR5cGVFcnJvcik7XG4gIH0pO1xuXG4gIGl0KCdvYmplY3QnLCAoKSA9PiB7XG4gICAgY29uc3QgdmFsaWRhdG9yID0gU2NoZW1hKHsgZm9vOiBTdHJpbmcsIGJhcjogTnVtYmVyIH0pO1xuXG4gICAgYXNzZXJ0LmRlZXBFcXVhbCh2YWxpZGF0b3IoeyBmb286ICdmb28nLCBiYXI6IDEyMyB9KSwge1xuICAgICAgZm9vOiAnZm9vJyxcbiAgICAgIGJhcjogMTIzLFxuICAgIH0pO1xuXG4gICAgYXNzZXJ0LmRlZXBFcXVhbCh2YWxpZGF0b3IoeyBmb286IG51bGwsIGJhcjogJzEyMycgfSksIHtcbiAgICAgIGZvbzogJ251bGwnLFxuICAgICAgYmFyOiAxMjMsXG4gICAgfSk7XG5cbiAgICBhc3NlcnQudGhyb3dzKCgpID0+IHZhbGlkYXRvcigxMjMpLCBUeXBlRXJyb3IpO1xuICB9KTtcblxuICBpdCgnbnVsbCcsICgpID0+IHtcbiAgICBjb25zdCB2YWxpZGF0b3IgPSBTY2hlbWEobnVsbCk7XG5cbiAgICBhc3NlcnQuZXF1YWwodmFsaWRhdG9yKG51bGwpLCBudWxsKTtcblxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgYXNzZXJ0LnRocm93cygoKSA9PiB2YWxpZGF0b3IoMTIgYXMgYW55KSwgVHlwZUVycm9yKTtcbiAgfSk7XG5cbiAgaXQoJ0FycmF5JywgKCkgPT4ge1xuICAgIGNvbnN0IHZhbGlkYXRvciA9IFNjaGVtYShbMSBhcyAxLCAnZm9vJyBhcyAnZm9vJ10pO1xuXG4gICAgYXNzZXJ0LmRlZXBFcXVhbCh2YWxpZGF0b3IoWzEsICdmb28nXSksIFsxLCAnZm9vJ10pO1xuXG4gICAgYXNzZXJ0LnRocm93cygoKSA9PiB2YWxpZGF0b3IoWzEsICdmb28nLCAxXSksIFR5cGVFcnJvcik7XG4gICAgYXNzZXJ0LnRocm93cygoKSA9PiB2YWxpZGF0b3IoWzFdKSwgVHlwZUVycm9yKTtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgIGFzc2VydC50aHJvd3MoKCkgPT4gdmFsaWRhdG9yKFsyLCAnZm9vJ10gYXMgYW55KSwgVHlwZUVycm9yKTtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgIGFzc2VydC50aHJvd3MoKCkgPT4gdmFsaWRhdG9yKHsgZm9vOiAxIH0gYXMgYW55KSwgVHlwZUVycm9yKTtcbiAgfSk7XG5cbiAgaXQoJ0FzeW5jJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHZhbGlkYXRvciA9IFNjaGVtYShBc3luYyhTY2hlbWEoJ2ZvbycpKSk7XG5cbiAgICBhc3NlcnQuZXF1YWwoYXdhaXQgdmFsaWRhdG9yKCdmb28nKSwgJ2ZvbycpO1xuXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICBhd2FpdCBhc3NlcnQuaXNSZWplY3RlZCh2YWxpZGF0b3IoJ2JhcicgYXMgYW55KSBhcyBQcm9taXNlTGlrZTxhbnk+KTtcbiAgfSk7XG59KTtcbiJdfQ==