UNPKG

typedconverter

Version:

Convert object into classes match with TypeScript type annotation

63 lines (62 loc) 2.91 kB
"use strict"; 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;