joiful
Version:
TypeScript Declarative Validation. Decorate your class properties to validate them using Joi.
50 lines • 1.89 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.createPropertyDecorator = exports.NotImplemented = void 0;
const core_1 = require("../core");
class NotImplemented extends Error {
constructor(feature) {
super(`${feature} is not implemented`);
}
}
exports.NotImplemented = NotImplemented;
function forEachModifierProvider(modifierProviders, callback) {
Object
.keys(modifierProviders)
.forEach((modifierName) => {
const modifierProvider = modifierProviders[modifierName];
callback(modifierName, modifierProvider);
});
}
function indexable(value) {
return value;
}
const createPropertyDecorator = () => ((getBaseSchema, getModifierProviders, options) => {
let schema;
let modifiersToApply = [];
const modifierProviders = getModifierProviders(() => core_1.getJoi(options));
const decoratorUntyped = (target, propertyKey) => {
const joi = core_1.getJoi(options);
schema = getBaseSchema({ joi, target, propertyKey });
if (options.labelProvider) {
const label = options.labelProvider(propertyKey, target);
if (typeof label === 'string') {
schema = schema.label(label);
}
}
modifiersToApply.forEach((modifierToApply) => {
schema = modifierToApply({ schema: schema, options });
});
core_1.updateWorkingSchema(target, propertyKey, schema);
};
const decorator = decoratorUntyped;
forEachModifierProvider(modifierProviders, (modifierName, modifierProvider) => {
indexable(decoratorUntyped)[modifierName] = (...args) => {
modifiersToApply.push(modifierProvider(...args));
return decorator;
};
});
return decorator;
});
exports.createPropertyDecorator = createPropertyDecorator;
//# sourceMappingURL=common.js.map