base.d.ts 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187
  1. import { ReadonlyContext } from './context';
  2. export interface Request {
  3. [k: string]: any;
  4. body?: any;
  5. cookies?: Record<string, any>;
  6. headers?: Record<string, any>;
  7. params?: Record<string, any>;
  8. query?: Record<string, any>;
  9. }
  10. export type Middleware = (req: Request, res: any, next: (err?: any) => void) => void;
  11. export type Location = 'body' | 'cookies' | 'headers' | 'params' | 'query';
  12. /**
  13. * Metadata about a validated field.
  14. */
  15. export type Meta = {
  16. /**
  17. * The express request from which the field was validated
  18. */
  19. req: Request;
  20. /**
  21. * Which of the request objects the field was picked from
  22. */
  23. location: Location;
  24. /**
  25. * The full path of the field within the request object.
  26. *
  27. * @example
  28. * const meta = { req, location: 'body', path: 'foo.bar' }; // req.body.foo.bar
  29. */
  30. path: string;
  31. /**
  32. * Values from wildcards/globstars used when selecting fields for validation.
  33. *
  34. * @example
  35. * body('products.*.price').custom((value, { req, pathValues }) => {
  36. * const index = pathValues[0];
  37. * const productName = req.body.products[index].name;
  38. * });
  39. */
  40. pathValues: readonly (string | string[])[];
  41. };
  42. /**
  43. * A function which may
  44. * - return falsy values, a promise that rejects or throw to indicate that a field is invalid;
  45. * - return truthy values or a promise that resolves to indicate that a field is valid.
  46. *
  47. * @param input the field value
  48. * @param meta metadata about the field being validated
  49. */
  50. export type CustomValidator = (input: any, meta: Meta) => any;
  51. export type StandardValidator = (input: string, ...options: any[]) => boolean;
  52. export type CustomSanitizer = (input: any, meta: Meta) => any;
  53. export type StandardSanitizer = (input: string, ...options: any[]) => any;
  54. export interface FieldInstance {
  55. path: string;
  56. originalPath: string;
  57. pathValues: readonly (string | string[])[];
  58. location: Location;
  59. value: any;
  60. }
  61. export type UnknownFieldInstance = Omit<FieldInstance, 'originalPath' | 'pathValues'>;
  62. export type FieldValidationError = {
  63. /**
  64. * Indicates that the error occurred because a field had an invalid value
  65. */
  66. type: 'field';
  67. /**
  68. * The location within the request where this field is
  69. */
  70. location: Location;
  71. /**
  72. * The path to the field which has a validation error
  73. */
  74. path: string;
  75. /**
  76. * The value of the field. It might be unset if the value is hidden.
  77. */
  78. value?: any;
  79. /**
  80. * The error message
  81. */
  82. msg: any;
  83. };
  84. export type UnknownFieldsError = {
  85. /**
  86. * Indicates that the error occurred because one or more fields are unknown in the request
  87. */
  88. type: 'unknown_fields';
  89. /**
  90. * The error message
  91. */
  92. msg: any;
  93. /**
  94. * The list of fields that are unknown
  95. */
  96. fields: UnknownFieldInstance[];
  97. };
  98. export type AlternativeValidationError = {
  99. /**
  100. * Indicates that the error occurred because all alternatives (e.g. in `oneOf()`) were invalid
  101. */
  102. type: 'alternative';
  103. /**
  104. * The error message
  105. */
  106. msg: any;
  107. /**
  108. * The list of underlying validation errors returned by validation chains in `oneOf()`
  109. */
  110. nestedErrors: FieldValidationError[];
  111. };
  112. export type GroupedAlternativeValidationError = {
  113. /**
  114. * Indicates that the error occurred because all alternatives (e.g. in `oneOf()`) were invalid,
  115. * and the nested errors are grouped per alternative.
  116. */
  117. type: 'alternative_grouped';
  118. /**
  119. * The error message
  120. */
  121. msg: any;
  122. /**
  123. * The list of underlying validation errors returned by validation chains in `oneOf()`
  124. */
  125. nestedErrors: FieldValidationError[][];
  126. };
  127. /**
  128. * A validation error as reported by a middleware.
  129. * The properties available in the error object vary according to the type.
  130. *
  131. * @example
  132. * if (error.type === 'alternative') {
  133. * console.log(`There are ${error.nestedErrors.length} errors under this alternative list`);
  134. * } else if (error.type === 'field') {
  135. * console.log(`There's an error with field ${error.path} in the request ${error.location}`);
  136. * }
  137. *
  138. */
  139. export type ValidationError = AlternativeValidationError | GroupedAlternativeValidationError | UnknownFieldsError | FieldValidationError;
  140. /**
  141. * An error message that's not a function, as these are treated as message factories
  142. * by all validation middlewares.
  143. */
  144. export type ErrorMessage = string | number | symbol | boolean | object | any[];
  145. /**
  146. * A function which creates an error message based on a field's value.
  147. *
  148. * @param input the field value
  149. * @param meta metadata about the field that was validated
  150. */
  151. export type FieldMessageFactory = (value: any, meta: Meta) => any;
  152. /**
  153. * A function which creates an error message based on an alternative's nested errors.
  154. *
  155. * @see `oneOf()`
  156. * @param nestedErrors The errors from the invalid alternative(s).
  157. * @param opts
  158. */
  159. export type AlternativeMessageFactory = (nestedErrors: FieldValidationError[], opts: {
  160. req: Request;
  161. }) => any;
  162. /**
  163. * A function which creates an error message based on a group of alternatives nested errors.
  164. *
  165. * @see `oneOf()`
  166. * @param nestedErrors The errors from the invalid alternative groups.
  167. * @param opts
  168. */
  169. export type GroupedAlternativeMessageFactory = (nestedErrors: FieldValidationError[][], opts: {
  170. req: Request;
  171. }) => any;
  172. /**
  173. * A function which creates an error message based on unknown fields.
  174. *
  175. * @see `checkExact()`
  176. * @param unknownFields The unknown fields found in the request
  177. * @param opts
  178. */
  179. export type UnknownFieldMessageFactory = (unknownFields: UnknownFieldInstance[], opts: {
  180. req: Request;
  181. }) => any;
  182. export declare const contextsKey = "express-validator#contexts";
  183. export interface InternalRequest extends Request {
  184. [contextsKey]?: ReadonlyContext[];
  185. }
  186. export declare class ValidationHalt extends Error {
  187. }