altheia-async-data-validator
Version:
A very simple, fast and customizable async data validator
100 lines (99 loc) • 3.61 kB
JavaScript
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.Altheia = void 0;
const isPlainObject_1 = __importDefault(require("lodash/isPlainObject"));
const lang_1 = __importDefault(require("./lang"));
const validator_1 = require("./validator");
const base_1 = require("./validators/base");
// Default extractors
const any_1 = __importDefault(require("./validators/any"));
const array_1 = __importDefault(require("./validators/array"));
const boolean_1 = __importDefault(require("./validators/boolean"));
const date_1 = __importDefault(require("./validators/date"));
const function_1 = __importDefault(require("./validators/function"));
const internet_1 = __importDefault(require("./validators/internet"));
const number_1 = __importDefault(require("./validators/number"));
const object_1 = __importDefault(require("./validators/object"));
const string_1 = __importDefault(require("./validators/string"));
const Instance = (lang) => {
const inst = ((schema) => {
return new validator_1.Validator(schema, inst);
});
inst.langList = Object.assign({}, lang_1.default);
inst.templates = {};
inst.Base = base_1.TypeBase;
inst.instance = (newLang = {}) => {
return Instance(Object.assign(Object.assign({}, inst.langList), newLang));
};
inst.use = (plugin) => {
const test = new plugin.Class();
inst[test.name || test.constructor.name] = () => {
return new plugin.Class(inst);
};
if (plugin.messages) {
inst.lang(plugin.messages);
}
return inst;
};
inst.lang = (key, tpl) => {
if (typeof key === 'object' && (0, isPlainObject_1.default)(key)) {
inst.langList = Object.assign(Object.assign({}, inst.langList), key);
}
else if (typeof key === 'string' && tpl) {
inst.langList[key] = tpl;
}
};
inst.template = (name, schema) => {
inst.templates[name] = schema;
};
inst.is = (name) => {
if (typeof inst.templates[name] === 'undefined') {
throw new Error(`unknow template ${name}`);
}
return inst.templates[name].clone();
};
inst.formatError = ({ type, args, result },
// eslint-disable-next-line default-param-last
label = 'value', position) => {
// Get messages from error
let msg;
if (typeof inst.langList[type] !== 'undefined') {
msg = inst.langList[type](label, args, result);
}
else {
msg = 'Invalid value';
}
const formatted = {
label,
type,
message: msg,
};
if (typeof position === 'number') {
formatted.position = position;
}
// nested errors
if (result && result.errors) {
formatted.errors = result.errors.map((error) => inst.formatError(error.test, error.label, error.position));
}
return formatted;
};
// Declare basic plugins
inst.use(any_1.default);
inst.use(array_1.default);
inst.use(boolean_1.default);
inst.use(date_1.default);
inst.use(function_1.default);
inst.use(internet_1.default);
inst.use(number_1.default);
inst.use(object_1.default);
inst.use(string_1.default);
// Add passed lang object
if (lang && (0, isPlainObject_1.default)(lang)) {
inst.lang(lang);
}
return inst;
};
exports.Altheia = Instance();
;