joi-schema-validator
Version:
A world-class Joi validation error formatter for structured, user-friendly error handling.
100 lines • 4.12 kB
JavaScript
;
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.validate = validate;
exports.validateAsync = validateAsync;
exports.validateMiddleware = validateMiddleware;
const formatter_1 = require("./formatter");
const joiErrorMessages_1 = require("./joiErrorMessages");
/**
* Merge custom error messages with default error messages.
* Custom messages override defaults if provided.
*
* This supports:
* - Global error message overrides.
* - Field-level error message overrides (e.g., "name.string.min").
*/
function mergeMessages(custom) {
return custom
? Object.assign(Object.assign({}, joiErrorMessages_1.defaultErrorMessages), custom) : joiErrorMessages_1.defaultErrorMessages;
}
/**
* validate
* Synchronous validation function.
*
* Field-Level Error Message Overrides & Custom Error Formatting Options:
* The error messages are formatted using the provided (or default) error messages.
* You can supply field-specific messages in the custom messages object. For instance:
* { 'name.string.min': 'Name must have at least {#limit} characters.' }
*
* @param schema - Joi schema definition.
* @param input - Data to validate.
* @param options - Optional Joi validation options.
* @param messages - Custom error message overrides.
* @returns ValidationResult<T>
*/
function validate(schema, input, messages, options) {
const mergedMessages = mergeMessages(messages);
const { error, value } = schema.validate(input, Object.assign(Object.assign({}, options), { abortEarly: false }));
return {
value,
error: error ? (0, formatter_1.formatError)(error, mergedMessages) : null
};
}
/**
* validateAsync
* Async Validation Support:
* Handles asynchronous Joi validation, which is useful when validations involve async operations,
* such as database lookups or external API calls.
*
* @param schema - Joi schema definition.
* @param input - Data to validate.
* @param options - Optional Joi validation options.
* @param messages - Custom error message overrides.
* @returns Promise resolving to ValidationResult<T>
*/
function validateAsync(schema, input, messages, options) {
return __awaiter(this, void 0, void 0, function* () {
const mergedMessages = mergeMessages(messages);
try {
const value = yield schema.validateAsync(input, Object.assign(Object.assign({}, options), { abortEarly: false }));
return { value, error: null };
}
catch (err) {
const error = err || null;
return {
value: input,
error: (0, formatter_1.formatError)(error, mergedMessages)
};
}
});
}
/**
* validateMiddleware
* Express Middleware for Validation:
* Returns an Express middleware that validates req.body against the provided schema.
* If validation fails, it sends a 400 response with formatted errors.
*
* @param schema - Joi schema definition.
* @param messages - Custom error message overrides.
* @returns Express middleware function.
*/
function validateMiddleware(schema, messages) {
const mergedMessages = mergeMessages(messages);
return (req, res, next) => {
const { error } = validate(schema, req.body, mergedMessages);
if (error) {
return res.status(400).json({ success: false, errors: error });
}
next();
};
}
//# sourceMappingURL=index.js.map