mezzanine
Version:
Fantasy land union types with pattern matching
115 lines (79 loc) • 2.54 kB
JavaScript
;
import { is } from 'ramda';
// interface ModelCheck {
// ()
// }
var proofCase = {
native: rule =>
rule === Number ||
rule === String ||
rule === Boolean ||
rule === Object ||
rule === Array ||
rule === Function ||
rule === RegExp ||
rule === Symbol,
func: rule => typeof rule === 'function',
model: rule =>
typeof rule === 'function' &&
rule.ಠ_ಠ !== undefined &&
typeof rule.is === 'function',
obj: rule => typeof rule === 'object'
/**
*
* @deprecated
*/ };
export var isSingleProof = (proof
// proofCase.model(proof)
) => proofCase.native(proof) ||
proofCase.func(proof);
export var isSingleAlike = proof =>
typeof proof === 'object' &&
Object.keys(proof).length === 1 &&
Object.keys(proof)[0] === 'value';
export var validateMono =
proof =>
(data, dataKey) => {
if (proof === Number ||
proof === String ||
proof === Boolean ||
proof === Object ||
proof === Array ||
proof === Function ||
proof === RegExp ||
proof === Symbol) return is(proof, data);else
if (typeof proof === 'function' &&
proof.ಠ_ಠ !== undefined &&
typeof proof.is === 'function')
return proof.is(data);else
if (typeof proof === 'function') return proof(data, dataKey);
return false;
};
var canAccessKeys = data =>
typeof data === 'object' ||
proofCase.model(data);
function validate(proof, data, dataKey) {
if (proofCase.native(proof)) return is(proof, data);
//$FlowIssue
if (proofCase.model(proof)) return proof.is(data);
if (typeof proof === 'function') return proof(data, dataKey);
if (proof == null) return false;
if (data == null) return false;
if (proofCase.obj(proof) && canAccessKeys(data)) {
proof;
var tProof = proof;
var typeKeys = Object.keys(tProof);
if (typeKeys.length === 0) return true;
for (var _iterator = typeKeys, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) {var _ref;if (_isArray) {if (_i >= _iterator.length) break;_ref = _iterator[_i++];} else {_i = _iterator.next();if (_i.done) break;_ref = _i.value;}var typeKey = _ref;
var rule = tProof[typeKey];
//$FlowIssue
var property = data[typeKey];
var result = validate(rule, property, typeKey);
if (!result) return false;
}
return true;
}
return false;
}
export default validate;
//# sourceMappingURL=verify.js.map