typedconverter
Version:
Convert object into classes match with TypeScript type annotation
63 lines (62 loc) • 2.91 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.RequiredValidator = exports.PartialValidator = exports.validatorVisitor = exports.partial = exports.required = exports.createValidation = void 0;
const tslib_1 = require("tslib");
const tinspector_1 = tslib_1.__importStar(require("tinspector"));
const visitor_1 = require("./visitor");
const converter_1 = require("./converter");
const RequiredValidator = Symbol("tc:required");
exports.RequiredValidator = RequiredValidator;
const PartialValidator = Symbol("tc:partial");
exports.PartialValidator = PartialValidator;
// --------------------------------------------------------------------- //
// ----------------------------- DECORATORS ---------------------------- //
// --------------------------------------------------------------------- //
function createValidation(validator) {
return tinspector_1.decorateProperty({ type: "tc:validator", validator });
}
exports.createValidation = createValidation;
function required() {
return createValidation(RequiredValidator);
}
exports.required = required;
function partial(type) {
return tinspector_1.mergeDecorator(tinspector_1.default.type(type), createValidation(PartialValidator));
}
exports.partial = partial;
// --------------------------------------------------------------------- //
// ------------------------------ HELPERS ------------------------------ //
// --------------------------------------------------------------------- //
function isPartial(i) {
return i.parent && i.parent.decorators.find((x) => x.validator === PartialValidator);
}
function isEmpty(result) {
return (result.value === "" || result.value === undefined || result.value === null);
}
// --------------------------------------------------------------------- //
// ------------------------------ VISITORS ----------------------------- //
// --------------------------------------------------------------------- //
function getValidators(i) {
return i.decorators
.filter((x) => x.validator !== PartialValidator && x.type === "tc:validator");
}
function validatorVisitor(i) {
const validators = getValidators(i);
const result = i.proceed();
if (!isPartial(i) && isEmpty(result) && validators.some(x => x.validator === RequiredValidator))
return visitor_1.Result.error(i.value, i.path, "Required");
if (isEmpty(result) || validators.length === 0)
return result;
else {
const messages = [];
for (const validator of validators) {
if (typeof validator.validator === "function") {
const msg = validator.validator(converter_1.safeToString(i.value));
if (msg)
messages.push(msg);
}
}
return messages.length > 0 ? visitor_1.Result.error(i.value, i.path, messages) : result;
}
}
exports.validatorVisitor = validatorVisitor;