| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125 |
- "use strict";
- Object.defineProperty(exports, "__esModule", { value: true });
- exports.ExpressValidator = void 0;
- const matched_data_1 = require("./matched-data");
- const check_1 = require("./middlewares/check");
- const exact_1 = require("./middlewares/exact");
- const one_of_1 = require("./middlewares/one-of");
- const schema_1 = require("./middlewares/schema");
- const validation_result_1 = require("./validation-result");
- /* eslint-enable no-use-before-define */
- class ExpressValidator {
- constructor(validators, sanitizers, options) {
- this.validators = validators;
- this.sanitizers = sanitizers;
- this.options = options;
- /**
- * Creates a middleware/validation chain for one or more fields that may be located in
- * any of the following:
- *
- * - `req.body`
- * - `req.cookies`
- * - `req.headers`
- * - `req.params`
- * - `req.query`
- *
- * @param fields a string or array of field names to validate/sanitize
- * @param message an error message to use when failed validations don't specify a custom message.
- * Defaults to `Invalid Value`.
- */
- this.check = this.buildCheckFunction(['body', 'cookies', 'headers', 'params', 'query']);
- /**
- * Same as {@link ExpressValidator.check}, but only validates in `req.body`.
- */
- this.body = this.buildCheckFunction(['body']);
- /**
- * Same as {@link ExpressValidator.check}, but only validates in `req.cookies`.
- */
- this.cookie = this.buildCheckFunction(['cookies']);
- /**
- * Same as {@link ExpressValidator.check}, but only validates in `req.headers`.
- */
- this.header = this.buildCheckFunction(['headers']);
- /**
- * Same as {@link ExpressValidator.check}, but only validates in `req.params`.
- */
- this.param = this.buildCheckFunction(['params']);
- /**
- * Same as {@link ExpressValidator.check}, but only validates in `req.query`.
- */
- this.query = this.buildCheckFunction(['query']);
- /**
- * Checks whether the request contains exactly only those fields that have been validated.
- *
- * This method is here for convenience; it does exactly the same as `checkExact`.
- *
- * @see {@link checkExact}
- */
- this.checkExact = exact_1.checkExact;
- /**
- * Creates an express middleware with validations for multiple fields at once in the form of
- * a schema object.
- *
- * @param schema the schema to validate.
- * @param defaultLocations which locations to validate in each field. Defaults to every location.
- */
- // NOTE: This method references its own type, so the type cast is necessary.
- this.checkSchema = (0, schema_1.createCheckSchema)((...args) => this.createChain(...args), Object.keys(this.validators || {}), Object.keys(this.sanitizers || {}));
- /**
- * Extracts the validation errors of an express request using the default error formatter of this
- * instance.
- *
- * @see {@link validationResult()}
- * @param req the express request object
- * @returns a `Result` which will by default use the error formatter passed when
- * instantiating `ExpressValidator`.
- */
- this.validationResult = (req) => {
- const formatter = this.options?.errorFormatter;
- const result = (0, validation_result_1.validationResult)(req);
- return formatter ? result.formatWith(formatter) : result;
- };
- this.validatorEntries = Object.entries(validators || {});
- this.sanitizerEntries = Object.entries(sanitizers || {});
- // Can't use arrow function in the declaration of `buildCheckFunction` due to the following
- // error which only happens when tests are run without Jest cache (so CI only):
- //
- // 'buildCheckFunction' implicitly has type 'any' because it does not have a type annotation
- // and is referenced directly or indirectly in its own initializer
- this.buildCheckFunction = this.buildCheckFunction.bind(this);
- }
- createChain(fields = '', locations = [], message) {
- const middleware = (0, check_1.check)(fields, locations, message);
- const boundValidators = Object.fromEntries(this.validatorEntries.map(([name, fn]) => [name, () => middleware.custom(fn)]));
- const boundSanitizers = Object.fromEntries(this.sanitizerEntries.map(([name, fn]) => [name, () => middleware.customSanitizer(fn)]));
- return Object.assign(middleware, boundValidators, boundSanitizers);
- }
- buildCheckFunction(locations) {
- return (fields, message) => this.createChain(fields, locations, message);
- }
- /**
- * Creates a middleware that will ensure that at least one of the given validation chains
- * or validation chain groups are valid.
- *
- * If none are, a single error of type `alternative` is added to the request,
- * with the errors of each chain made available under the `nestedErrors` property.
- *
- * @param chains an array of validation chains to check if are valid.
- * If any of the items of `chains` is an array of validation chains, then all of them
- * must be valid together for the request to be considered valid.
- */
- oneOf(chains, options) {
- return (0, one_of_1.oneOf)(chains, options);
- }
- /**
- * Extracts data validated or sanitized from the request, and builds an object with them.
- *
- * This method is a shortcut for `matchedData`; it does nothing different than it.
- *
- * @see {@link matchedData}
- */
- matchedData(req, options) {
- return (0, matched_data_1.matchedData)(req, options);
- }
- }
- exports.ExpressValidator = ExpressValidator;
|