@desaubv/quik 0.1.4 → 0.1.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -116,7 +116,6 @@ var RequiredFieldException = class extends ValidationException {
116
116
  this.field = field;
117
117
  this.name = "RequiredFieldException";
118
118
  }
119
- field;
120
119
  };
121
120
  var InvalidTypeException = class extends ValidationException {
122
121
  constructor(field, expected, received) {
@@ -128,9 +127,6 @@ var InvalidTypeException = class extends ValidationException {
128
127
  this.received = received;
129
128
  this.name = "InvalidTypeException";
130
129
  }
131
- field;
132
- expected;
133
- received;
134
130
  };
135
131
  var EmptyArrayException = class extends ValidationException {
136
132
  constructor(field) {
@@ -138,7 +134,6 @@ var EmptyArrayException = class extends ValidationException {
138
134
  this.field = field;
139
135
  this.name = "EmptyArrayException";
140
136
  }
141
- field;
142
137
  };
143
138
 
144
139
  // src/http/validador.ts
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/http/index.ts","../../src/http/validatorTypes.ts","../../src/http/exceptions.ts","../../src/http/validador.ts","../../src/http/status.ts","../../src/http/file.ts"],"sourcesContent":["export { Types, } from \"./validatorTypes.js\";\r\nexport type { FileFields } from \"./validatorTypes.js\";\r\n\r\nexport { ValidationException } from \"./exceptions.js\";\r\nexport { Validator } from \"./validador.js\";\r\nexport { Status } from \"./status.js\";\r\nexport { MimeTypes } from \"./file.js\";\r\n","import type { ValidationException } from \"./exceptions.js\";\r\n\r\nexport class ArrayType {\r\n type: PrimitiveType[];\r\n description = \"array\";\r\n empty: boolean = false;\r\n\r\n constructor(...type: PrimitiveType[]) {\r\n this.type = [...type];\r\n this.empty = false;\r\n\r\n const types = type.map((t) => t.description);\r\n this.description = `array(${types.join(\" | \")})`;\r\n }\r\n\r\n canBeEmpty() {\r\n this.empty = true;\r\n return this;\r\n }\r\n}\r\n\r\nexport type FieldDefinition = {\r\n type: ValidatorType;\r\n required?: boolean;\r\n validator?: (value: unknown) => unknown | ValidationException;\r\n};\r\n\r\nexport type ObjectFields = {\r\n [name: string]: FieldDefinition;\r\n};\r\n\r\nexport class ObjectType {\r\n fields: ObjectFields;\r\n description = \"object\";\r\n\r\n constructor(fields: ObjectFields) {\r\n this.fields = fields;\r\n\r\n const names = Object.keys(fields);\r\n\r\n this.description = `object{${names.join(\", \")}}`;\r\n }\r\n}\r\n\r\nfunction Array(...type: PrimitiveType[]) {\r\n return new ArrayType(...type);\r\n}\r\n\r\nfunction Struct(fields: ObjectFields) {\r\n return new ObjectType(fields);\r\n}\r\n\r\nexport const Types = {\r\n String: Symbol(\"string\"),\r\n Number: Symbol(\"number\"),\r\n Int: Symbol(\"int\"),\r\n Float: Symbol(\"float\"),\r\n Boolean: Symbol(\"boolean\"),\r\n Object: Symbol(\"object\"),\r\n Null: Symbol(\"null\"),\r\n Any: Symbol(\"any\"),\r\n \r\n Array,\r\n Struct,\r\n};\r\n\r\nexport type FileFields = {\r\n maxSizeMb?: number;\r\n minSizeMb?: number;\r\n\r\n mimeTypes?: string | string[];\r\n extensions?: string | string[];\r\n\r\n canBeEmpty?: boolean;\r\n\r\n maxNumberOfFiles?: number;\r\n minNumberOfFiles?: number;\r\n\r\n fileNamePattern?: RegExp;\r\n}\r\n\r\nexport type PrimitiveType =\r\n | typeof Types.String\r\n | typeof Types.Number\r\n | typeof Types.Int\r\n | typeof Types.Float\r\n | typeof Types.Boolean\r\n | typeof Types.Object\r\n | typeof Types.Null;\r\n\r\nexport type MultiType = PrimitiveType[];\r\n\r\nexport type ValidatorType =\r\n | PrimitiveType\r\n | MultiType\r\n | ArrayType\r\n | ObjectType;","class ValidationException extends Error {\r\n constructor(message: string) {\r\n super(message);\r\n\r\n this.name = \"ValidationException\";\r\n }\r\n}\r\n\r\nclass RequestBodyUndefinedException extends ValidationException {\r\n constructor() {\r\n super(\"Request body is undefined\");\r\n\r\n this.name = \"RequestBodyUndefinedException\";\r\n }\r\n}\r\n\r\nclass InvalidBodyException extends ValidationException {\r\n constructor() {\r\n super(\"Request body must be an object\");\r\n\r\n this.name = \"InvalidBodyException\";\r\n }\r\n}\r\n\r\nclass EmptyBodyException extends ValidationException {\r\n constructor() {\r\n super(\"Body must not be empty\");\r\n\r\n this.name = \"EmptyBodyException\";\r\n }\r\n}\r\n\r\nclass InvalidBodyLengthException extends ValidationException {\r\n constructor(length: number, type: \"min\" | \"max\") {\r\n const message =\r\n type === \"min\"\r\n ? `The body length must be at least ${length} characters`\r\n : `The body length must not exceed ${length} characters`;\r\n\r\n super(message);\r\n\r\n this.name = \"InvalidBodyLengthException\";\r\n }\r\n}\r\n\r\nclass InvalidBodyPatternException extends ValidationException {\r\n constructor(pattern: RegExp) {\r\n super(`The body does not match the required pattern: ${pattern}`);\r\n\r\n this.name = 'InvalidBodyPatternException';\r\n }\r\n}\r\n\r\nclass RequiredFieldException extends ValidationException {\r\n constructor(\r\n public readonly field: string,\r\n ) {\r\n super(`Field \"${field}\" is required`);\r\n\r\n this.name = \"RequiredFieldException\";\r\n }\r\n}\r\n\r\nclass InvalidTypeException extends ValidationException {\r\n constructor(\r\n public readonly field: string,\r\n public readonly expected: string | undefined,\r\n public readonly received: string,\r\n ) {\r\n super(\r\n `Field \"${field}\" must be of type ${expected}, received ${received}`,\r\n );\r\n\r\n this.name = \"InvalidTypeException\";\r\n }\r\n}\r\n\r\nclass CustomValidationException extends ValidationException {\r\n constructor(\r\n public readonly field: string,\r\n ) {\r\n super(`Field \"${field}\" failed custom validation`);\r\n\r\n this.name = \"CustomValidationException\";\r\n }\r\n}\r\n\r\nclass EmptyArrayException extends ValidationException {\r\n constructor(\r\n public readonly field: string,\r\n ) {\r\n super(`Field \"${field}\" must not be an empty array`);\r\n\r\n this.name = \"EmptyArrayException\";\r\n }\r\n}\r\n\r\nexport {\r\n ValidationException,\r\n RequestBodyUndefinedException,\r\n InvalidBodyException,\r\n EmptyBodyException,\r\n InvalidBodyLengthException,\r\n InvalidBodyPatternException,\r\n RequiredFieldException,\r\n InvalidTypeException,\r\n CustomValidationException,\r\n EmptyArrayException\r\n}","import {\r\n ValidationException,\r\n RequestBodyUndefinedException,\r\n InvalidBodyException,\r\n RequiredFieldException,\r\n InvalidTypeException,\r\n EmptyArrayException,\r\n InvalidBodyLengthException,\r\n InvalidBodyPatternException,\r\n EmptyBodyException\r\n} from \"./exceptions.js\";\r\n\r\nimport {\r\n ArrayType,\r\n ObjectType,\r\n Types,\r\n} from \"./validatorTypes.js\";\r\n\r\nimport type {\r\n FileFields,\r\n ValidatorType,\r\n ObjectFields,\r\n} from \"./validatorTypes.js\";\r\n\r\ntype FieldDefinition = {\r\n type: ValidatorType;\r\n required?: boolean;\r\n validator?: (\r\n value: unknown\r\n ) => unknown | ValidationException;\r\n};\r\n\r\ninterface BodyFields {\r\n [name: string]: FieldDefinition;\r\n}\r\n\r\ninterface Body {\r\n [name: string]: unknown;\r\n}\r\n\r\ntype TextValidationOptions = {\r\n minLength?: number;\r\n maxLength?: number;\r\n pattern?: RegExp;\r\n allowEmpty?: boolean;\r\n trim?: boolean;\r\n validator?: (\r\n value: string\r\n ) => string | ValidationException;\r\n};\r\n\r\nconst Validator = {\r\n body(body: Body, fields: BodyFields) {\r\n if (body === undefined) {\r\n throw new RequestBodyUndefinedException();\r\n }\r\n\r\n if (\r\n typeof body !== \"object\" ||\r\n body === null ||\r\n Array.isArray(body)\r\n ) {\r\n throw new InvalidBodyException();\r\n }\r\n\r\n return validateObject(body, fields);\r\n },\r\n\r\n text(body: string, options: TextValidationOptions = {}) {\r\n const {\r\n minLength,\r\n maxLength,\r\n pattern,\r\n allowEmpty = true,\r\n trim = false,\r\n validator = undefined\r\n } = options;\r\n\r\n let value = trim ? body.trim() : body;\r\n\r\n if (!allowEmpty && value.length === 0) {\r\n throw new EmptyBodyException();\r\n }\r\n\r\n if (minLength !== undefined && value.length < minLength) {\r\n throw new InvalidBodyLengthException(minLength, \"min\");\r\n }\r\n\r\n if (maxLength !== undefined && value.length > maxLength) {\r\n throw new InvalidBodyLengthException(maxLength, \"max\");\r\n }\r\n\r\n if (pattern !== undefined && !pattern.test(value)) {\r\n throw new InvalidBodyPatternException(pattern);\r\n }\r\n\r\n if (validator) {\r\n const result = validator(value);\r\n if (result instanceof ValidationException) {\r\n throw result;\r\n }\r\n\r\n value = result;\r\n }\r\n\r\n return value;\r\n },\r\n\r\n file: (file: any, options: FileFields = {}) => {\r\n const {\r\n canBeEmpty = false,\r\n maxNumberOfFiles,\r\n minNumberOfFiles\r\n } = options;\r\n\r\n /*\r\n * No file\r\n */\r\n if (!file) {\r\n if (canBeEmpty) {\r\n return null;\r\n }\r\n\r\n throw new ValidationException(\r\n \"File is required but not provided.\"\r\n );\r\n }\r\n\r\n /*\r\n * Multiple files\r\n */\r\n if (Array.isArray(file)) {\r\n\r\n if (file.length === 0) {\r\n if (canBeEmpty) {\r\n return null;\r\n }\r\n\r\n throw new ValidationException(\r\n \"At least one file is required.\"\r\n );\r\n }\r\n\r\n if (\r\n maxNumberOfFiles !== undefined &&\r\n file.length > maxNumberOfFiles\r\n ) {\r\n throw new ValidationException(\r\n `Maximum number of files allowed is ${maxNumberOfFiles}.`\r\n );\r\n }\r\n\r\n if (\r\n minNumberOfFiles !== undefined &&\r\n file.length < minNumberOfFiles\r\n ) {\r\n throw new ValidationException(\r\n `Minimum number of files required is ${minNumberOfFiles}.`\r\n );\r\n }\r\n\r\n return file.map((f) => validateFile(f, options));\r\n }\r\n\r\n /*\r\n * Single file\r\n */\r\n return validateFile(file, options);\r\n }\r\n};\r\n\r\n\r\nfunction validateFile(\r\n file: any,\r\n options: FileFields = {}\r\n) {\r\n const {\r\n maxSizeMb,\r\n minSizeMb,\r\n mimeTypes,\r\n extensions,\r\n fileNamePattern\r\n } = options;\r\n\r\n\r\n /*\r\n * Validate object\r\n */\r\n if (\r\n typeof file !== \"object\" ||\r\n file === null\r\n ) {\r\n throw new ValidationException(\r\n \"Invalid file.\"\r\n );\r\n }\r\n\r\n\r\n /*\r\n * Validate size\r\n */\r\n if (\r\n typeof file.size !== \"number\" ||\r\n file.size < 0\r\n ) {\r\n throw new ValidationException(\r\n \"Invalid file size.\"\r\n );\r\n }\r\n\r\n\r\n /*\r\n * Maximum size\r\n */\r\n if (\r\n maxSizeMb !== undefined &&\r\n file.size > maxSizeMb * 1024 * 1024\r\n ) {\r\n throw new ValidationException(\r\n `File size exceeds the maximum limit of ${maxSizeMb} MB.`\r\n );\r\n }\r\n\r\n\r\n /*\r\n * Minimum size\r\n */\r\n if (\r\n minSizeMb !== undefined &&\r\n file.size < minSizeMb * 1024 * 1024\r\n ) {\r\n throw new ValidationException(\r\n `File size is below the minimum limit of ${minSizeMb} MB.`\r\n );\r\n }\r\n\r\n\r\n /*\r\n * MIME type\r\n */\r\n if (mimeTypes !== undefined) {\r\n\r\n const allowedMimeTypes = Array.isArray(mimeTypes)\r\n ? mimeTypes\r\n : [mimeTypes];\r\n\r\n if (\r\n typeof file.mimetype !== \"string\" ||\r\n !allowedMimeTypes.includes(file.mimetype)\r\n ) {\r\n throw new ValidationException(\r\n `File type is not allowed. Allowed types are: ${allowedMimeTypes.join(\", \")}`\r\n );\r\n }\r\n }\r\n\r\n\r\n /*\r\n * File extension\r\n */\r\n if (extensions !== undefined) {\r\n\r\n const allowedExtensions = (\r\n Array.isArray(extensions)\r\n ? extensions\r\n : [extensions]\r\n ).map(\r\n extension =>\r\n extension\r\n .replace(/^\\./, \"\")\r\n .toLowerCase()\r\n );\r\n\r\n if (typeof file.originalname !== \"string\") {\r\n throw new ValidationException(\r\n \"Invalid file name.\"\r\n );\r\n }\r\n\r\n const extension = file.originalname\r\n .split(\".\")\r\n .pop()\r\n ?.toLowerCase();\r\n\r\n if (\r\n !extension ||\r\n !allowedExtensions.includes(extension)\r\n ) {\r\n throw new ValidationException(\r\n `File extension is not allowed. Allowed extensions are: ${allowedExtensions.join(\", \")}`\r\n );\r\n }\r\n }\r\n\r\n /*\r\n * File name pattern\r\n */\r\n if (\r\n fileNamePattern !== undefined &&\r\n !fileNamePattern.test(file.originalname)\r\n ) {\r\n throw new ValidationException(\r\n \"File name does not match the required pattern.\"\r\n );\r\n }\r\n\r\n\r\n return file;\r\n}\r\n\r\nfunction validateObject(\r\n body: unknown,\r\n fields: ObjectFields,\r\n parentPath = \"\"\r\n): Record<string, unknown> {\r\n\r\n if (\r\n typeof body !== \"object\" ||\r\n body === null ||\r\n Array.isArray(body)\r\n ) {\r\n throw new InvalidBodyException();\r\n }\r\n\r\n const bodyData = body as Record<string, unknown>;\r\n const data: Record<string, unknown> = {};\r\n\r\n for (const name in fields) {\r\n const field = fields[name];\r\n\r\n if (!field) {\r\n continue;\r\n }\r\n\r\n const fieldPath = parentPath\r\n ? `${parentPath}.${name}`\r\n : name;\r\n\r\n let value = bodyData[name];\r\n\r\n // Required field\r\n if (field.required && value === undefined) {\r\n throw new RequiredFieldException(fieldPath);\r\n }\r\n\r\n // Optional field not provided\r\n if (value === undefined) {\r\n continue;\r\n }\r\n\r\n // Validate type\r\n if (!validateType(field.type, value, fieldPath)) {\r\n const type = getTypeDescription(field.type);\r\n\r\n throw new InvalidTypeException(\r\n fieldPath,\r\n type,\r\n whatTypeIs(value)\r\n );\r\n }\r\n\r\n // Custom validator\r\n if (field.validator) {\r\n const result = field.validator(value);\r\n\r\n if (result instanceof ValidationException) {\r\n throw result;\r\n }\r\n\r\n value = result;\r\n }\r\n\r\n data[name] = value;\r\n }\r\n\r\n return data;\r\n}\r\n\r\nfunction validateType(\r\n type: ValidatorType | undefined,\r\n value: unknown,\r\n fieldName = \"\"\r\n): boolean {\r\n\r\n // Multiple types\r\n if (Array.isArray(type)) {\r\n return type.some((t) =>\r\n validateType(t, value, fieldName)\r\n );\r\n }\r\n\r\n // Array\r\n if (type instanceof ArrayType) {\r\n\r\n if (!Array.isArray(value)) {\r\n return false;\r\n }\r\n\r\n if (!type.empty && value.length === 0) {\r\n throw new EmptyArrayException(fieldName);\r\n }\r\n\r\n for (const item of value) {\r\n if (!validateType(type.type, item, fieldName)) {\r\n return false;\r\n }\r\n }\r\n\r\n return true;\r\n }\r\n\r\n // Object structure\r\n if (type instanceof ObjectType) {\r\n\r\n if (\r\n typeof value !== \"object\" ||\r\n value === null ||\r\n Array.isArray(value)\r\n ) {\r\n return false;\r\n }\r\n\r\n validateObject(\r\n value,\r\n type.fields,\r\n fieldName\r\n );\r\n\r\n return true;\r\n }\r\n\r\n // Primitive types\r\n switch (type?.description) {\r\n case \"any\":\r\n return true;\r\n\r\n case \"null\":\r\n return value === null;\r\n\r\n case \"string\":\r\n return typeof value === \"string\";\r\n\r\n case \"number\":\r\n case \"float\":\r\n return typeof value === \"number\";\r\n\r\n case \"int\":\r\n return (\r\n typeof value === \"number\" &&\r\n Number.isInteger(value)\r\n );\r\n\r\n case \"boolean\":\r\n return typeof value === \"boolean\";\r\n\r\n case \"object\":\r\n return (\r\n typeof value === \"object\" &&\r\n value !== null &&\r\n !Array.isArray(value)\r\n );\r\n }\r\n\r\n return false;\r\n}\r\n\r\nfunction getTypeDescription(\r\n type: ValidatorType\r\n): string {\r\n\r\n if (Array.isArray(type)) {\r\n return type\r\n .map((t) => getTypeDescription(t))\r\n .join(\" | \");\r\n }\r\n\r\n return type.description || \"\";\r\n}\r\n\r\nfunction whatTypeIs(value: unknown): string {\r\n\r\n if (\r\n typeof value === \"number\" &&\r\n Number.isInteger(value)\r\n ) {\r\n return \"int\";\r\n }\r\n\r\n if (Array.isArray(value)) {\r\n return \"array\";\r\n }\r\n\r\n if (value === null) {\r\n return \"null\";\r\n }\r\n\r\n return typeof value;\r\n}\r\n\r\nexport {\r\n Validator\r\n};","const Status = {\r\n // 1xx Informational\r\n CONTINUE: 100,\r\n SWITCHING_PROTOCOLS: 101,\r\n PROCESSING: 102,\r\n EARLY_HINTS: 103,\r\n\r\n // 2xx Success\r\n OK: 200,\r\n CREATED: 201,\r\n ACCEPTED: 202,\r\n NON_AUTHORITATIVE_INFORMATION: 203,\r\n NO_CONTENT: 204,\r\n RESET_CONTENT: 205,\r\n PARTIAL_CONTENT: 206,\r\n MULTI_STATUS: 207,\r\n ALREADY_REPORTED: 208,\r\n IM_USED: 226,\r\n\r\n // 3xx Redirection\r\n MULTIPLE_CHOICES: 300,\r\n MOVED_PERMANENTLY: 301,\r\n FOUND: 302,\r\n SEE_OTHER: 303,\r\n NOT_MODIFIED: 304,\r\n TEMPORARY_REDIRECT: 307,\r\n PERMANENT_REDIRECT: 308,\r\n\r\n // 4xx Client Errors\r\n BAD_REQUEST: 400,\r\n UNAUTHORIZED: 401,\r\n PAYMENT_REQUIRED: 402,\r\n FORBIDDEN: 403,\r\n NOT_FOUND: 404,\r\n METHOD_NOT_ALLOWED: 405,\r\n NOT_ACCEPTABLE: 406,\r\n PROXY_AUTHENTICATION_REQUIRED: 407,\r\n REQUEST_TIMEOUT: 408,\r\n CONFLICT: 409,\r\n GONE: 410,\r\n LENGTH_REQUIRED: 411,\r\n PRECONDITION_FAILED: 412,\r\n PAYLOAD_TOO_LARGE: 413,\r\n URI_TOO_LONG: 414,\r\n UNSUPPORTED_MEDIA_TYPE: 415,\r\n RANGE_NOT_SATISFIABLE: 416,\r\n EXPECTATION_FAILED: 417,\r\n IM_A_TEAPOT: 418,\r\n MISDIRECTED_REQUEST: 421,\r\n UNPROCESSABLE_CONTENT: 422,\r\n LOCKED: 423,\r\n FAILED_DEPENDENCY: 424,\r\n UPGRADE_REQUIRED: 426,\r\n PRECONDITION_REQUIRED: 428,\r\n TOO_MANY_REQUESTS: 429,\r\n REQUEST_HEADER_FIELDS_TOO_LARGE: 431,\r\n UNAVAILABLE_FOR_LEGAL_REASONS: 451,\r\n\r\n // 5xx Server Errors\r\n INTERNAL_SERVER_ERROR: 500,\r\n NOT_IMPLEMENTED: 501,\r\n BAD_GATEWAY: 502,\r\n SERVICE_UNAVAILABLE: 503,\r\n GATEWAY_TIMEOUT: 504,\r\n HTTP_VERSION_NOT_SUPPORTED: 505,\r\n VARIANT_ALSO_NEGOTIATES: 506,\r\n INSUFFICIENT_STORAGE: 507,\r\n LOOP_DETECTED: 508,\r\n NOT_EXTENDED: 510,\r\n NETWORK_AUTHENTICATION_REQUIRED: 511\r\n} as const;\r\n\r\nexport {\r\n Status\r\n};","const MimeTypes = {\r\n // Documents\r\n \"pdf\": \"application/pdf\",\r\n \"doc\": \"application/msword\",\r\n \"docx\": \"application/vnd.openxmlformats-officedocument.wordprocessingml.document\",\r\n \"odt\": \"application/vnd.oasis.opendocument.text\",\r\n \"rtf\": \"application/rtf\",\r\n \"tex\": \"application/x-tex\",\r\n \"txt\": \"text/plain\",\r\n \"md\": \"text/markdown\",\r\n\r\n // Spreadsheets\r\n \"xls\": \"application/vnd.ms-excel\",\r\n \"xlsx\": \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\",\r\n \"ods\": \"application/vnd.oasis.opendocument.spreadsheet\",\r\n \"csv\": \"text/csv\",\r\n \"tsv\": \"text/tab-separated-values\",\r\n\r\n // Presentations\r\n \"ppt\": \"application/vnd.ms-powerpoint\",\r\n \"pptx\": \"application/vnd.openxmlformats-officedocument.presentationml.presentation\",\r\n \"odp\": \"application/vnd.oasis.opendocument.presentation\",\r\n\r\n // Images\r\n \"jpg\": \"image/jpeg\",\r\n \"jpeg\": \"image/jpeg\",\r\n \"png\": \"image/png\",\r\n \"gif\": \"image/gif\",\r\n \"bmp\": \"image/bmp\",\r\n \"webp\": \"image/webp\",\r\n \"svg\": \"image/svg+xml\",\r\n \"ico\": \"image/x-icon\",\r\n \"tif\": \"image/tiff\",\r\n \"tiff\": \"image/tiff\",\r\n \"avif\": \"image/avif\",\r\n \"heic\": \"image/heic\",\r\n \"heif\": \"image/heif\",\r\n \"apng\": \"image/apng\",\r\n \"jxl\": \"image/jxl\",\r\n \"psd\": \"image/vnd.adobe.photoshop\",\r\n \"ai\": \"application/postscript\",\r\n \"eps\": \"application/postscript\",\r\n\r\n // Video\r\n \"mp4\": \"video/mp4\",\r\n \"avi\": \"video/x-msvideo\",\r\n \"mov\": \"video/quicktime\",\r\n \"wmv\": \"video/x-ms-wmv\",\r\n \"flv\": \"video/x-flv\",\r\n \"mkv\": \"video/x-matroska\",\r\n \"webm\": \"video/webm\",\r\n \"mpeg\": \"video/mpeg\",\r\n \"mpg\": \"video/mpeg\",\r\n \"m4v\": \"video/x-m4v\",\r\n \"3gp\": \"video/3gpp\",\r\n \"3g2\": \"video/3gpp2\",\r\n \"ts\": \"video/mp2t\",\r\n\r\n // Audio\r\n \"mp3\": \"audio/mpeg\",\r\n \"wav\": \"audio/wav\",\r\n \"ogg\": \"audio/ogg\",\r\n \"oga\": \"audio/ogg\",\r\n \"opus\": \"audio/opus\",\r\n \"aac\": \"audio/aac\",\r\n \"m4a\": \"audio/mp4\",\r\n \"flac\": \"audio/flac\",\r\n \"weba\": \"audio/webm\",\r\n \"mid\": \"audio/midi\",\r\n \"midi\": \"audio/midi\",\r\n\r\n // Web\r\n \"html\": \"text/html\",\r\n \"htm\": \"text/html\",\r\n \"css\": \"text/css\",\r\n \"js\": \"text/javascript\",\r\n \"mjs\": \"text/javascript\",\r\n \"cjs\": \"text/javascript\",\r\n \"jsx\": \"text/jsx\",\r\n \"tsx\": \"video/mp2t\",\r\n\r\n // Data / Configuration\r\n \"json\": \"application/json\",\r\n \"xml\": \"application/xml\",\r\n \"yaml\": \"application/yaml\",\r\n \"yml\": \"application/yaml\",\r\n \"toml\": \"application/toml\",\r\n \"ini\": \"text/plain\",\r\n \"env\": \"text/plain\",\r\n\r\n // Programming\r\n \"c\": \"text/x-c\",\r\n \"h\": \"text/x-c\",\r\n \"cpp\": \"text/x-c++\",\r\n \"cc\": \"text/x-c++\",\r\n \"cxx\": \"text/x-c++\",\r\n \"hpp\": \"text/x-c++\",\r\n \"java\": \"text/x-java-source\",\r\n \"py\": \"text/x-python\",\r\n \"pyw\": \"text/x-python\",\r\n \"rb\": \"text/x-ruby\",\r\n \"go\": \"text/x-go\",\r\n \"rs\": \"text/rust\",\r\n \"php\": \"application/x-httpd-php\",\r\n \"sql\": \"application/sql\",\r\n \"sh\": \"application/x-sh\",\r\n \"bash\": \"application/x-sh\",\r\n \"bat\": \"application/x-msdos-program\",\r\n \"ps1\": \"application/x-powershell\",\r\n \"lua\": \"text/x-lua\",\r\n \"swift\": \"text/x-swift\",\r\n \"kt\": \"text/x-kotlin\",\r\n \"kts\": \"text/x-kotlin\",\r\n \"dart\": \"application/vnd.dart\",\r\n\r\n // Archives / Compression\r\n \"zip\": \"application/zip\",\r\n \"rar\": \"application/vnd.rar\",\r\n \"7z\": \"application/x-7z-compressed\",\r\n \"tar\": \"application/x-tar\",\r\n \"gz\": \"application/gzip\",\r\n \"gzip\": \"application/gzip\",\r\n \"bz\": \"application/x-bzip\",\r\n \"bz2\": \"application/x-bzip2\",\r\n \"xz\": \"application/x-xz\",\r\n \"zst\": \"application/zstd\",\r\n \"tgz\": \"application/gzip\",\r\n \"tar.gz\": \"application/gzip\",\r\n \"tar.bz2\": \"application/x-bzip2\",\r\n \"tar.xz\": \"application/x-xz\",\r\n\r\n // Executables / Applications\r\n \"exe\": \"application/vnd.microsoft.portable-executable\",\r\n \"msi\": \"application/x-msi\",\r\n \"dll\": \"application/vnd.microsoft.portable-executable\",\r\n \"appimage\": \"application/x-iso9660-appimage\",\r\n \"deb\": \"application/vnd.debian.binary-package\",\r\n \"rpm\": \"application/x-rpm\",\r\n \"apk\": \"application/vnd.android.package-archive\",\r\n \"ipa\": \"application/octet-stream\",\r\n\r\n // Disk / Binary\r\n \"iso\": \"application/x-iso9660-image\",\r\n \"img\": \"application/octet-stream\",\r\n \"bin\": \"application/octet-stream\",\r\n \"dmg\": \"application/x-apple-diskimage\",\r\n\r\n // Fonts\r\n \"ttf\": \"font/ttf\",\r\n \"otf\": \"font/otf\",\r\n \"woff\": \"font/woff\",\r\n \"woff2\": \"font/woff2\",\r\n\r\n // E-books\r\n \"epub\": \"application/epub+zip\",\r\n \"mobi\": \"application/x-mobipocket-ebook\",\r\n \"azw\": \"application/vnd.amazon.ebook\",\r\n \"azw3\": \"application/vnd.amazon.ebook\",\r\n\r\n // 3D / CAD\r\n \"stl\": \"model/stl\",\r\n \"obj\": \"model/obj\",\r\n \"gltf\": \"model/gltf+json\",\r\n \"glb\": \"model/gltf-binary\",\r\n \"3ds\": \"image/x-3ds\",\r\n \"dae\": \"model/vnd.collada+xml\",\r\n \"step\": \"model/step\",\r\n \"stp\": \"model/step\",\r\n \"iges\": \"model/iges\",\r\n \"igs\": \"model/iges\",\r\n\r\n // Flash / Legacy\r\n \"swf\": \"application/x-shockwave-flash\",\r\n\r\n // Other common formats\r\n \"ics\": \"text/calendar\",\r\n \"vcf\": \"text/vcard\",\r\n \"vtt\": \"text/vtt\",\r\n \"srt\": \"application/x-subrip\",\r\n};\r\n\r\nexport { MimeTypes };"],"mappings":"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","names":["Array","extension"]}
1
+ {"version":3,"sources":["../../src/http/index.ts","../../src/http/validatorTypes.ts","../../src/http/exceptions.ts","../../src/http/validador.ts","../../src/http/status.ts","../../src/http/file.ts"],"sourcesContent":["export { Types, } from \"./validatorTypes.js\";\r\nexport type { FileFields } from \"./validatorTypes.js\";\r\n\r\nexport { ValidationException } from \"./exceptions.js\";\r\nexport { Validator } from \"./validador.js\";\r\nexport { Status } from \"./status.js\";\r\nexport { MimeTypes } from \"./file.js\";\r\n","import type { ValidationException } from \"./exceptions.js\";\r\n\r\nexport class ArrayType {\r\n type: PrimitiveType[];\r\n description = \"array\";\r\n empty: boolean = false;\r\n\r\n constructor(...type: PrimitiveType[]) {\r\n this.type = [...type];\r\n this.empty = false;\r\n\r\n const types = type.map((t) => t.description);\r\n this.description = `array(${types.join(\" | \")})`;\r\n }\r\n\r\n canBeEmpty() {\r\n this.empty = true;\r\n return this;\r\n }\r\n}\r\n\r\nexport type FieldDefinition = {\r\n type: ValidatorType;\r\n required?: boolean;\r\n validator?: (value: unknown) => unknown | ValidationException;\r\n};\r\n\r\nexport type ObjectFields = {\r\n [name: string]: FieldDefinition;\r\n};\r\n\r\nexport class ObjectType {\r\n fields: ObjectFields;\r\n description = \"object\";\r\n\r\n constructor(fields: ObjectFields) {\r\n this.fields = fields;\r\n\r\n const names = Object.keys(fields);\r\n\r\n this.description = `object{${names.join(\", \")}}`;\r\n }\r\n}\r\n\r\nfunction Array(...type: PrimitiveType[]) {\r\n return new ArrayType(...type);\r\n}\r\n\r\nfunction Struct(fields: ObjectFields) {\r\n return new ObjectType(fields);\r\n}\r\n\r\nexport const Types = {\r\n String: Symbol(\"string\"),\r\n Number: Symbol(\"number\"),\r\n Int: Symbol(\"int\"),\r\n Float: Symbol(\"float\"),\r\n Boolean: Symbol(\"boolean\"),\r\n Object: Symbol(\"object\"),\r\n Null: Symbol(\"null\"),\r\n Any: Symbol(\"any\"),\r\n \r\n Array,\r\n Struct,\r\n};\r\n\r\nexport type FileFields = {\r\n maxSizeMb?: number;\r\n minSizeMb?: number;\r\n\r\n mimeTypes?: string | string[];\r\n extensions?: string | string[];\r\n\r\n canBeEmpty?: boolean;\r\n\r\n maxNumberOfFiles?: number;\r\n minNumberOfFiles?: number;\r\n\r\n fileNamePattern?: RegExp;\r\n}\r\n\r\nexport type PrimitiveType =\r\n | typeof Types.String\r\n | typeof Types.Number\r\n | typeof Types.Int\r\n | typeof Types.Float\r\n | typeof Types.Boolean\r\n | typeof Types.Object\r\n | typeof Types.Null;\r\n\r\nexport type MultiType = PrimitiveType[];\r\n\r\nexport type ValidatorType =\r\n | PrimitiveType\r\n | MultiType\r\n | ArrayType\r\n | ObjectType;","class ValidationException extends Error {\r\n constructor(message: string) {\r\n super(message);\r\n\r\n this.name = \"ValidationException\";\r\n }\r\n}\r\n\r\nclass RequestBodyUndefinedException extends ValidationException {\r\n constructor() {\r\n super(\"Request body is undefined\");\r\n\r\n this.name = \"RequestBodyUndefinedException\";\r\n }\r\n}\r\n\r\nclass InvalidBodyException extends ValidationException {\r\n constructor() {\r\n super(\"Request body must be an object\");\r\n\r\n this.name = \"InvalidBodyException\";\r\n }\r\n}\r\n\r\nclass EmptyBodyException extends ValidationException {\r\n constructor() {\r\n super(\"Body must not be empty\");\r\n\r\n this.name = \"EmptyBodyException\";\r\n }\r\n}\r\n\r\nclass InvalidBodyLengthException extends ValidationException {\r\n constructor(length: number, type: \"min\" | \"max\") {\r\n const message =\r\n type === \"min\"\r\n ? `The body length must be at least ${length} characters`\r\n : `The body length must not exceed ${length} characters`;\r\n\r\n super(message);\r\n\r\n this.name = \"InvalidBodyLengthException\";\r\n }\r\n}\r\n\r\nclass InvalidBodyPatternException extends ValidationException {\r\n constructor(pattern: RegExp) {\r\n super(`The body does not match the required pattern: ${pattern}`);\r\n\r\n this.name = 'InvalidBodyPatternException';\r\n }\r\n}\r\n\r\nclass RequiredFieldException extends ValidationException {\r\n constructor(\r\n public readonly field: string,\r\n ) {\r\n super(`Field \"${field}\" is required`);\r\n\r\n this.name = \"RequiredFieldException\";\r\n }\r\n}\r\n\r\nclass InvalidTypeException extends ValidationException {\r\n constructor(\r\n public readonly field: string,\r\n public readonly expected: string | undefined,\r\n public readonly received: string,\r\n ) {\r\n super(\r\n `Field \"${field}\" must be of type ${expected}, received ${received}`,\r\n );\r\n\r\n this.name = \"InvalidTypeException\";\r\n }\r\n}\r\n\r\nclass CustomValidationException extends ValidationException {\r\n constructor(\r\n public readonly field: string,\r\n ) {\r\n super(`Field \"${field}\" failed custom validation`);\r\n\r\n this.name = \"CustomValidationException\";\r\n }\r\n}\r\n\r\nclass EmptyArrayException extends ValidationException {\r\n constructor(\r\n public readonly field: string,\r\n ) {\r\n super(`Field \"${field}\" must not be an empty array`);\r\n\r\n this.name = \"EmptyArrayException\";\r\n }\r\n}\r\n\r\nexport {\r\n ValidationException,\r\n RequestBodyUndefinedException,\r\n InvalidBodyException,\r\n EmptyBodyException,\r\n InvalidBodyLengthException,\r\n InvalidBodyPatternException,\r\n RequiredFieldException,\r\n InvalidTypeException,\r\n CustomValidationException,\r\n EmptyArrayException\r\n}","import {\r\n ValidationException,\r\n RequestBodyUndefinedException,\r\n InvalidBodyException,\r\n RequiredFieldException,\r\n InvalidTypeException,\r\n EmptyArrayException,\r\n InvalidBodyLengthException,\r\n InvalidBodyPatternException,\r\n EmptyBodyException\r\n} from \"./exceptions.js\";\r\n\r\nimport {\r\n ArrayType,\r\n ObjectType,\r\n Types,\r\n} from \"./validatorTypes.js\";\r\n\r\nimport type {\r\n FileFields,\r\n ValidatorType,\r\n ObjectFields,\r\n} from \"./validatorTypes.js\";\r\n\r\ntype FieldDefinition = {\r\n type: ValidatorType;\r\n required?: boolean;\r\n validator?: (\r\n value: unknown\r\n ) => unknown | ValidationException;\r\n};\r\n\r\ninterface BodyFields {\r\n [name: string]: FieldDefinition;\r\n}\r\n\r\ninterface Body {\r\n [name: string]: unknown;\r\n}\r\n\r\ntype TextValidationOptions = {\r\n minLength?: number;\r\n maxLength?: number;\r\n pattern?: RegExp;\r\n allowEmpty?: boolean;\r\n trim?: boolean;\r\n validator?: (\r\n value: string\r\n ) => string | ValidationException;\r\n};\r\n\r\nconst Validator = {\r\n body(body: Body, fields: BodyFields) {\r\n if (body === undefined) {\r\n throw new RequestBodyUndefinedException();\r\n }\r\n\r\n if (\r\n typeof body !== \"object\" ||\r\n body === null ||\r\n Array.isArray(body)\r\n ) {\r\n throw new InvalidBodyException();\r\n }\r\n\r\n return validateObject(body, fields);\r\n },\r\n\r\n text(body: string, options: TextValidationOptions = {}) {\r\n const {\r\n minLength,\r\n maxLength,\r\n pattern,\r\n allowEmpty = true,\r\n trim = false,\r\n validator = undefined\r\n } = options;\r\n\r\n let value = trim ? body.trim() : body;\r\n\r\n if (!allowEmpty && value.length === 0) {\r\n throw new EmptyBodyException();\r\n }\r\n\r\n if (minLength !== undefined && value.length < minLength) {\r\n throw new InvalidBodyLengthException(minLength, \"min\");\r\n }\r\n\r\n if (maxLength !== undefined && value.length > maxLength) {\r\n throw new InvalidBodyLengthException(maxLength, \"max\");\r\n }\r\n\r\n if (pattern !== undefined && !pattern.test(value)) {\r\n throw new InvalidBodyPatternException(pattern);\r\n }\r\n\r\n if (validator) {\r\n const result = validator(value);\r\n if (result instanceof ValidationException) {\r\n throw result;\r\n }\r\n\r\n value = result;\r\n }\r\n\r\n return value;\r\n },\r\n\r\n file: (file: any, options: FileFields = {}) => {\r\n const {\r\n canBeEmpty = false,\r\n maxNumberOfFiles,\r\n minNumberOfFiles\r\n } = options;\r\n\r\n /*\r\n * No file\r\n */\r\n if (!file) {\r\n if (canBeEmpty) {\r\n return null;\r\n }\r\n\r\n throw new ValidationException(\r\n \"File is required but not provided.\"\r\n );\r\n }\r\n\r\n /*\r\n * Multiple files\r\n */\r\n if (Array.isArray(file)) {\r\n\r\n if (file.length === 0) {\r\n if (canBeEmpty) {\r\n return null;\r\n }\r\n\r\n throw new ValidationException(\r\n \"At least one file is required.\"\r\n );\r\n }\r\n\r\n if (\r\n maxNumberOfFiles !== undefined &&\r\n file.length > maxNumberOfFiles\r\n ) {\r\n throw new ValidationException(\r\n `Maximum number of files allowed is ${maxNumberOfFiles}.`\r\n );\r\n }\r\n\r\n if (\r\n minNumberOfFiles !== undefined &&\r\n file.length < minNumberOfFiles\r\n ) {\r\n throw new ValidationException(\r\n `Minimum number of files required is ${minNumberOfFiles}.`\r\n );\r\n }\r\n\r\n return file.map((f) => validateFile(f, options));\r\n }\r\n\r\n /*\r\n * Single file\r\n */\r\n return validateFile(file, options);\r\n }\r\n};\r\n\r\n\r\nfunction validateFile(\r\n file: any,\r\n options: FileFields = {}\r\n) {\r\n const {\r\n maxSizeMb,\r\n minSizeMb,\r\n mimeTypes,\r\n extensions,\r\n fileNamePattern\r\n } = options;\r\n\r\n\r\n /*\r\n * Validate object\r\n */\r\n if (\r\n typeof file !== \"object\" ||\r\n file === null\r\n ) {\r\n throw new ValidationException(\r\n \"Invalid file.\"\r\n );\r\n }\r\n\r\n\r\n /*\r\n * Validate size\r\n */\r\n if (\r\n typeof file.size !== \"number\" ||\r\n file.size < 0\r\n ) {\r\n throw new ValidationException(\r\n \"Invalid file size.\"\r\n );\r\n }\r\n\r\n\r\n /*\r\n * Maximum size\r\n */\r\n if (\r\n maxSizeMb !== undefined &&\r\n file.size > maxSizeMb * 1024 * 1024\r\n ) {\r\n throw new ValidationException(\r\n `File size exceeds the maximum limit of ${maxSizeMb} MB.`\r\n );\r\n }\r\n\r\n\r\n /*\r\n * Minimum size\r\n */\r\n if (\r\n minSizeMb !== undefined &&\r\n file.size < minSizeMb * 1024 * 1024\r\n ) {\r\n throw new ValidationException(\r\n `File size is below the minimum limit of ${minSizeMb} MB.`\r\n );\r\n }\r\n\r\n\r\n /*\r\n * MIME type\r\n */\r\n if (mimeTypes !== undefined) {\r\n\r\n const allowedMimeTypes = Array.isArray(mimeTypes)\r\n ? mimeTypes\r\n : [mimeTypes];\r\n\r\n if (\r\n typeof file.mimetype !== \"string\" ||\r\n !allowedMimeTypes.includes(file.mimetype)\r\n ) {\r\n throw new ValidationException(\r\n `File type is not allowed. Allowed types are: ${allowedMimeTypes.join(\", \")}`\r\n );\r\n }\r\n }\r\n\r\n\r\n /*\r\n * File extension\r\n */\r\n if (extensions !== undefined) {\r\n\r\n const allowedExtensions = (\r\n Array.isArray(extensions)\r\n ? extensions\r\n : [extensions]\r\n ).map(\r\n extension =>\r\n extension\r\n .replace(/^\\./, \"\")\r\n .toLowerCase()\r\n );\r\n\r\n if (typeof file.originalname !== \"string\") {\r\n throw new ValidationException(\r\n \"Invalid file name.\"\r\n );\r\n }\r\n\r\n const extension = file.originalname\r\n .split(\".\")\r\n .pop()\r\n ?.toLowerCase();\r\n\r\n if (\r\n !extension ||\r\n !allowedExtensions.includes(extension)\r\n ) {\r\n throw new ValidationException(\r\n `File extension is not allowed. Allowed extensions are: ${allowedExtensions.join(\", \")}`\r\n );\r\n }\r\n }\r\n\r\n /*\r\n * File name pattern\r\n */\r\n if (\r\n fileNamePattern !== undefined &&\r\n !fileNamePattern.test(file.originalname)\r\n ) {\r\n throw new ValidationException(\r\n \"File name does not match the required pattern.\"\r\n );\r\n }\r\n\r\n\r\n return file;\r\n}\r\n\r\nfunction validateObject(\r\n body: unknown,\r\n fields: ObjectFields,\r\n parentPath = \"\"\r\n): Record<string, unknown> {\r\n\r\n if (\r\n typeof body !== \"object\" ||\r\n body === null ||\r\n Array.isArray(body)\r\n ) {\r\n throw new InvalidBodyException();\r\n }\r\n\r\n const bodyData = body as Record<string, unknown>;\r\n const data: Record<string, unknown> = {};\r\n\r\n for (const name in fields) {\r\n const field = fields[name];\r\n\r\n if (!field) {\r\n continue;\r\n }\r\n\r\n const fieldPath = parentPath\r\n ? `${parentPath}.${name}`\r\n : name;\r\n\r\n let value = bodyData[name];\r\n\r\n // Required field\r\n if (field.required && value === undefined) {\r\n throw new RequiredFieldException(fieldPath);\r\n }\r\n\r\n // Optional field not provided\r\n if (value === undefined) {\r\n continue;\r\n }\r\n\r\n // Validate type\r\n if (!validateType(field.type, value, fieldPath)) {\r\n const type = getTypeDescription(field.type);\r\n\r\n throw new InvalidTypeException(\r\n fieldPath,\r\n type,\r\n whatTypeIs(value)\r\n );\r\n }\r\n\r\n // Custom validator\r\n if (field.validator) {\r\n const result = field.validator(value);\r\n\r\n if (result instanceof ValidationException) {\r\n throw result;\r\n }\r\n\r\n value = result;\r\n }\r\n\r\n data[name] = value;\r\n }\r\n\r\n return data;\r\n}\r\n\r\nfunction validateType(\r\n type: ValidatorType | undefined,\r\n value: unknown,\r\n fieldName = \"\"\r\n): boolean {\r\n\r\n // Multiple types\r\n if (Array.isArray(type)) {\r\n return type.some((t) =>\r\n validateType(t, value, fieldName)\r\n );\r\n }\r\n\r\n // Array\r\n if (type instanceof ArrayType) {\r\n\r\n if (!Array.isArray(value)) {\r\n return false;\r\n }\r\n\r\n if (!type.empty && value.length === 0) {\r\n throw new EmptyArrayException(fieldName);\r\n }\r\n\r\n for (const item of value) {\r\n if (!validateType(type.type, item, fieldName)) {\r\n return false;\r\n }\r\n }\r\n\r\n return true;\r\n }\r\n\r\n // Object structure\r\n if (type instanceof ObjectType) {\r\n\r\n if (\r\n typeof value !== \"object\" ||\r\n value === null ||\r\n Array.isArray(value)\r\n ) {\r\n return false;\r\n }\r\n\r\n validateObject(\r\n value,\r\n type.fields,\r\n fieldName\r\n );\r\n\r\n return true;\r\n }\r\n\r\n // Primitive types\r\n switch (type?.description) {\r\n case \"any\":\r\n return true;\r\n\r\n case \"null\":\r\n return value === null;\r\n\r\n case \"string\":\r\n return typeof value === \"string\";\r\n\r\n case \"number\":\r\n case \"float\":\r\n return typeof value === \"number\";\r\n\r\n case \"int\":\r\n return (\r\n typeof value === \"number\" &&\r\n Number.isInteger(value)\r\n );\r\n\r\n case \"boolean\":\r\n return typeof value === \"boolean\";\r\n\r\n case \"object\":\r\n return (\r\n typeof value === \"object\" &&\r\n value !== null &&\r\n !Array.isArray(value)\r\n );\r\n }\r\n\r\n return false;\r\n}\r\n\r\nfunction getTypeDescription(\r\n type: ValidatorType\r\n): string {\r\n\r\n if (Array.isArray(type)) {\r\n return type\r\n .map((t) => getTypeDescription(t))\r\n .join(\" | \");\r\n }\r\n\r\n return type.description || \"\";\r\n}\r\n\r\nfunction whatTypeIs(value: unknown): string {\r\n\r\n if (\r\n typeof value === \"number\" &&\r\n Number.isInteger(value)\r\n ) {\r\n return \"int\";\r\n }\r\n\r\n if (Array.isArray(value)) {\r\n return \"array\";\r\n }\r\n\r\n if (value === null) {\r\n return \"null\";\r\n }\r\n\r\n return typeof value;\r\n}\r\n\r\nexport {\r\n Validator\r\n};","const Status = {\r\n // 1xx Informational\r\n CONTINUE: 100,\r\n SWITCHING_PROTOCOLS: 101,\r\n PROCESSING: 102,\r\n EARLY_HINTS: 103,\r\n\r\n // 2xx Success\r\n OK: 200,\r\n CREATED: 201,\r\n ACCEPTED: 202,\r\n NON_AUTHORITATIVE_INFORMATION: 203,\r\n NO_CONTENT: 204,\r\n RESET_CONTENT: 205,\r\n PARTIAL_CONTENT: 206,\r\n MULTI_STATUS: 207,\r\n ALREADY_REPORTED: 208,\r\n IM_USED: 226,\r\n\r\n // 3xx Redirection\r\n MULTIPLE_CHOICES: 300,\r\n MOVED_PERMANENTLY: 301,\r\n FOUND: 302,\r\n SEE_OTHER: 303,\r\n NOT_MODIFIED: 304,\r\n TEMPORARY_REDIRECT: 307,\r\n PERMANENT_REDIRECT: 308,\r\n\r\n // 4xx Client Errors\r\n BAD_REQUEST: 400,\r\n UNAUTHORIZED: 401,\r\n PAYMENT_REQUIRED: 402,\r\n FORBIDDEN: 403,\r\n NOT_FOUND: 404,\r\n METHOD_NOT_ALLOWED: 405,\r\n NOT_ACCEPTABLE: 406,\r\n PROXY_AUTHENTICATION_REQUIRED: 407,\r\n REQUEST_TIMEOUT: 408,\r\n CONFLICT: 409,\r\n GONE: 410,\r\n LENGTH_REQUIRED: 411,\r\n PRECONDITION_FAILED: 412,\r\n PAYLOAD_TOO_LARGE: 413,\r\n URI_TOO_LONG: 414,\r\n UNSUPPORTED_MEDIA_TYPE: 415,\r\n RANGE_NOT_SATISFIABLE: 416,\r\n EXPECTATION_FAILED: 417,\r\n IM_A_TEAPOT: 418,\r\n MISDIRECTED_REQUEST: 421,\r\n UNPROCESSABLE_CONTENT: 422,\r\n LOCKED: 423,\r\n FAILED_DEPENDENCY: 424,\r\n UPGRADE_REQUIRED: 426,\r\n PRECONDITION_REQUIRED: 428,\r\n TOO_MANY_REQUESTS: 429,\r\n REQUEST_HEADER_FIELDS_TOO_LARGE: 431,\r\n UNAVAILABLE_FOR_LEGAL_REASONS: 451,\r\n\r\n // 5xx Server Errors\r\n INTERNAL_SERVER_ERROR: 500,\r\n NOT_IMPLEMENTED: 501,\r\n BAD_GATEWAY: 502,\r\n SERVICE_UNAVAILABLE: 503,\r\n GATEWAY_TIMEOUT: 504,\r\n HTTP_VERSION_NOT_SUPPORTED: 505,\r\n VARIANT_ALSO_NEGOTIATES: 506,\r\n INSUFFICIENT_STORAGE: 507,\r\n LOOP_DETECTED: 508,\r\n NOT_EXTENDED: 510,\r\n NETWORK_AUTHENTICATION_REQUIRED: 511\r\n} as const;\r\n\r\nexport {\r\n Status\r\n};","const MimeTypes = {\r\n // Documents\r\n \"pdf\": \"application/pdf\",\r\n \"doc\": \"application/msword\",\r\n \"docx\": \"application/vnd.openxmlformats-officedocument.wordprocessingml.document\",\r\n \"odt\": \"application/vnd.oasis.opendocument.text\",\r\n \"rtf\": \"application/rtf\",\r\n \"tex\": \"application/x-tex\",\r\n \"txt\": \"text/plain\",\r\n \"md\": \"text/markdown\",\r\n\r\n // Spreadsheets\r\n \"xls\": \"application/vnd.ms-excel\",\r\n \"xlsx\": \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\",\r\n \"ods\": \"application/vnd.oasis.opendocument.spreadsheet\",\r\n \"csv\": \"text/csv\",\r\n \"tsv\": \"text/tab-separated-values\",\r\n\r\n // Presentations\r\n \"ppt\": \"application/vnd.ms-powerpoint\",\r\n \"pptx\": \"application/vnd.openxmlformats-officedocument.presentationml.presentation\",\r\n \"odp\": \"application/vnd.oasis.opendocument.presentation\",\r\n\r\n // Images\r\n \"jpg\": \"image/jpeg\",\r\n \"jpeg\": \"image/jpeg\",\r\n \"png\": \"image/png\",\r\n \"gif\": \"image/gif\",\r\n \"bmp\": \"image/bmp\",\r\n \"webp\": \"image/webp\",\r\n \"svg\": \"image/svg+xml\",\r\n \"ico\": \"image/x-icon\",\r\n \"tif\": \"image/tiff\",\r\n \"tiff\": \"image/tiff\",\r\n \"avif\": \"image/avif\",\r\n \"heic\": \"image/heic\",\r\n \"heif\": \"image/heif\",\r\n \"apng\": \"image/apng\",\r\n \"jxl\": \"image/jxl\",\r\n \"psd\": \"image/vnd.adobe.photoshop\",\r\n \"ai\": \"application/postscript\",\r\n \"eps\": \"application/postscript\",\r\n\r\n // Video\r\n \"mp4\": \"video/mp4\",\r\n \"avi\": \"video/x-msvideo\",\r\n \"mov\": \"video/quicktime\",\r\n \"wmv\": \"video/x-ms-wmv\",\r\n \"flv\": \"video/x-flv\",\r\n \"mkv\": \"video/x-matroska\",\r\n \"webm\": \"video/webm\",\r\n \"mpeg\": \"video/mpeg\",\r\n \"mpg\": \"video/mpeg\",\r\n \"m4v\": \"video/x-m4v\",\r\n \"3gp\": \"video/3gpp\",\r\n \"3g2\": \"video/3gpp2\",\r\n \"ts\": \"video/mp2t\",\r\n\r\n // Audio\r\n \"mp3\": \"audio/mpeg\",\r\n \"wav\": \"audio/wav\",\r\n \"ogg\": \"audio/ogg\",\r\n \"oga\": \"audio/ogg\",\r\n \"opus\": \"audio/opus\",\r\n \"aac\": \"audio/aac\",\r\n \"m4a\": \"audio/mp4\",\r\n \"flac\": \"audio/flac\",\r\n \"weba\": \"audio/webm\",\r\n \"mid\": \"audio/midi\",\r\n \"midi\": \"audio/midi\",\r\n\r\n // Web\r\n \"html\": \"text/html\",\r\n \"htm\": \"text/html\",\r\n \"css\": \"text/css\",\r\n \"js\": \"text/javascript\",\r\n \"mjs\": \"text/javascript\",\r\n \"cjs\": \"text/javascript\",\r\n \"jsx\": \"text/jsx\",\r\n \"tsx\": \"video/mp2t\",\r\n\r\n // Data / Configuration\r\n \"json\": \"application/json\",\r\n \"xml\": \"application/xml\",\r\n \"yaml\": \"application/yaml\",\r\n \"yml\": \"application/yaml\",\r\n \"toml\": \"application/toml\",\r\n \"ini\": \"text/plain\",\r\n \"env\": \"text/plain\",\r\n\r\n // Programming\r\n \"c\": \"text/x-c\",\r\n \"h\": \"text/x-c\",\r\n \"cpp\": \"text/x-c++\",\r\n \"cc\": \"text/x-c++\",\r\n \"cxx\": \"text/x-c++\",\r\n \"hpp\": \"text/x-c++\",\r\n \"java\": \"text/x-java-source\",\r\n \"py\": \"text/x-python\",\r\n \"pyw\": \"text/x-python\",\r\n \"rb\": \"text/x-ruby\",\r\n \"go\": \"text/x-go\",\r\n \"rs\": \"text/rust\",\r\n \"php\": \"application/x-httpd-php\",\r\n \"sql\": \"application/sql\",\r\n \"sh\": \"application/x-sh\",\r\n \"bash\": \"application/x-sh\",\r\n \"bat\": \"application/x-msdos-program\",\r\n \"ps1\": \"application/x-powershell\",\r\n \"lua\": \"text/x-lua\",\r\n \"swift\": \"text/x-swift\",\r\n \"kt\": \"text/x-kotlin\",\r\n \"kts\": \"text/x-kotlin\",\r\n \"dart\": \"application/vnd.dart\",\r\n\r\n // Archives / Compression\r\n \"zip\": \"application/zip\",\r\n \"rar\": \"application/vnd.rar\",\r\n \"7z\": \"application/x-7z-compressed\",\r\n \"tar\": \"application/x-tar\",\r\n \"gz\": \"application/gzip\",\r\n \"gzip\": \"application/gzip\",\r\n \"bz\": \"application/x-bzip\",\r\n \"bz2\": \"application/x-bzip2\",\r\n \"xz\": \"application/x-xz\",\r\n \"zst\": \"application/zstd\",\r\n \"tgz\": \"application/gzip\",\r\n \"tar.gz\": \"application/gzip\",\r\n \"tar.bz2\": \"application/x-bzip2\",\r\n \"tar.xz\": \"application/x-xz\",\r\n\r\n // Executables / Applications\r\n \"exe\": \"application/vnd.microsoft.portable-executable\",\r\n \"msi\": \"application/x-msi\",\r\n \"dll\": \"application/vnd.microsoft.portable-executable\",\r\n \"appimage\": \"application/x-iso9660-appimage\",\r\n \"deb\": \"application/vnd.debian.binary-package\",\r\n \"rpm\": \"application/x-rpm\",\r\n \"apk\": \"application/vnd.android.package-archive\",\r\n \"ipa\": \"application/octet-stream\",\r\n\r\n // Disk / Binary\r\n \"iso\": \"application/x-iso9660-image\",\r\n \"img\": \"application/octet-stream\",\r\n \"bin\": \"application/octet-stream\",\r\n \"dmg\": \"application/x-apple-diskimage\",\r\n\r\n // Fonts\r\n \"ttf\": \"font/ttf\",\r\n \"otf\": \"font/otf\",\r\n \"woff\": \"font/woff\",\r\n \"woff2\": \"font/woff2\",\r\n\r\n // E-books\r\n \"epub\": \"application/epub+zip\",\r\n \"mobi\": \"application/x-mobipocket-ebook\",\r\n \"azw\": \"application/vnd.amazon.ebook\",\r\n \"azw3\": \"application/vnd.amazon.ebook\",\r\n\r\n // 3D / CAD\r\n \"stl\": \"model/stl\",\r\n \"obj\": \"model/obj\",\r\n \"gltf\": \"model/gltf+json\",\r\n \"glb\": \"model/gltf-binary\",\r\n \"3ds\": \"image/x-3ds\",\r\n \"dae\": \"model/vnd.collada+xml\",\r\n \"step\": \"model/step\",\r\n \"stp\": \"model/step\",\r\n \"iges\": \"model/iges\",\r\n \"igs\": \"model/iges\",\r\n\r\n // Flash / Legacy\r\n \"swf\": \"application/x-shockwave-flash\",\r\n\r\n // Other common formats\r\n \"ics\": \"text/calendar\",\r\n \"vcf\": \"text/vcard\",\r\n \"vtt\": \"text/vtt\",\r\n \"srt\": \"application/x-subrip\",\r\n};\r\n\r\nexport { MimeTypes };"],"mappings":"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","names":["Array","extension"]}
@@ -86,7 +86,6 @@ var RequiredFieldException = class extends ValidationException {
86
86
  this.field = field;
87
87
  this.name = "RequiredFieldException";
88
88
  }
89
- field;
90
89
  };
91
90
  var InvalidTypeException = class extends ValidationException {
92
91
  constructor(field, expected, received) {
@@ -98,9 +97,6 @@ var InvalidTypeException = class extends ValidationException {
98
97
  this.received = received;
99
98
  this.name = "InvalidTypeException";
100
99
  }
101
- field;
102
- expected;
103
- received;
104
100
  };
105
101
  var EmptyArrayException = class extends ValidationException {
106
102
  constructor(field) {
@@ -108,7 +104,6 @@ var EmptyArrayException = class extends ValidationException {
108
104
  this.field = field;
109
105
  this.name = "EmptyArrayException";
110
106
  }
111
- field;
112
107
  };
113
108
 
114
109
  // src/http/validador.ts
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/http/validatorTypes.ts","../../src/http/exceptions.ts","../../src/http/validador.ts","../../src/http/status.ts","../../src/http/file.ts"],"sourcesContent":["import type { ValidationException } from \"./exceptions.js\";\r\n\r\nexport class ArrayType {\r\n type: PrimitiveType[];\r\n description = \"array\";\r\n empty: boolean = false;\r\n\r\n constructor(...type: PrimitiveType[]) {\r\n this.type = [...type];\r\n this.empty = false;\r\n\r\n const types = type.map((t) => t.description);\r\n this.description = `array(${types.join(\" | \")})`;\r\n }\r\n\r\n canBeEmpty() {\r\n this.empty = true;\r\n return this;\r\n }\r\n}\r\n\r\nexport type FieldDefinition = {\r\n type: ValidatorType;\r\n required?: boolean;\r\n validator?: (value: unknown) => unknown | ValidationException;\r\n};\r\n\r\nexport type ObjectFields = {\r\n [name: string]: FieldDefinition;\r\n};\r\n\r\nexport class ObjectType {\r\n fields: ObjectFields;\r\n description = \"object\";\r\n\r\n constructor(fields: ObjectFields) {\r\n this.fields = fields;\r\n\r\n const names = Object.keys(fields);\r\n\r\n this.description = `object{${names.join(\", \")}}`;\r\n }\r\n}\r\n\r\nfunction Array(...type: PrimitiveType[]) {\r\n return new ArrayType(...type);\r\n}\r\n\r\nfunction Struct(fields: ObjectFields) {\r\n return new ObjectType(fields);\r\n}\r\n\r\nexport const Types = {\r\n String: Symbol(\"string\"),\r\n Number: Symbol(\"number\"),\r\n Int: Symbol(\"int\"),\r\n Float: Symbol(\"float\"),\r\n Boolean: Symbol(\"boolean\"),\r\n Object: Symbol(\"object\"),\r\n Null: Symbol(\"null\"),\r\n Any: Symbol(\"any\"),\r\n \r\n Array,\r\n Struct,\r\n};\r\n\r\nexport type FileFields = {\r\n maxSizeMb?: number;\r\n minSizeMb?: number;\r\n\r\n mimeTypes?: string | string[];\r\n extensions?: string | string[];\r\n\r\n canBeEmpty?: boolean;\r\n\r\n maxNumberOfFiles?: number;\r\n minNumberOfFiles?: number;\r\n\r\n fileNamePattern?: RegExp;\r\n}\r\n\r\nexport type PrimitiveType =\r\n | typeof Types.String\r\n | typeof Types.Number\r\n | typeof Types.Int\r\n | typeof Types.Float\r\n | typeof Types.Boolean\r\n | typeof Types.Object\r\n | typeof Types.Null;\r\n\r\nexport type MultiType = PrimitiveType[];\r\n\r\nexport type ValidatorType =\r\n | PrimitiveType\r\n | MultiType\r\n | ArrayType\r\n | ObjectType;","class ValidationException extends Error {\r\n constructor(message: string) {\r\n super(message);\r\n\r\n this.name = \"ValidationException\";\r\n }\r\n}\r\n\r\nclass RequestBodyUndefinedException extends ValidationException {\r\n constructor() {\r\n super(\"Request body is undefined\");\r\n\r\n this.name = \"RequestBodyUndefinedException\";\r\n }\r\n}\r\n\r\nclass InvalidBodyException extends ValidationException {\r\n constructor() {\r\n super(\"Request body must be an object\");\r\n\r\n this.name = \"InvalidBodyException\";\r\n }\r\n}\r\n\r\nclass EmptyBodyException extends ValidationException {\r\n constructor() {\r\n super(\"Body must not be empty\");\r\n\r\n this.name = \"EmptyBodyException\";\r\n }\r\n}\r\n\r\nclass InvalidBodyLengthException extends ValidationException {\r\n constructor(length: number, type: \"min\" | \"max\") {\r\n const message =\r\n type === \"min\"\r\n ? `The body length must be at least ${length} characters`\r\n : `The body length must not exceed ${length} characters`;\r\n\r\n super(message);\r\n\r\n this.name = \"InvalidBodyLengthException\";\r\n }\r\n}\r\n\r\nclass InvalidBodyPatternException extends ValidationException {\r\n constructor(pattern: RegExp) {\r\n super(`The body does not match the required pattern: ${pattern}`);\r\n\r\n this.name = 'InvalidBodyPatternException';\r\n }\r\n}\r\n\r\nclass RequiredFieldException extends ValidationException {\r\n constructor(\r\n public readonly field: string,\r\n ) {\r\n super(`Field \"${field}\" is required`);\r\n\r\n this.name = \"RequiredFieldException\";\r\n }\r\n}\r\n\r\nclass InvalidTypeException extends ValidationException {\r\n constructor(\r\n public readonly field: string,\r\n public readonly expected: string | undefined,\r\n public readonly received: string,\r\n ) {\r\n super(\r\n `Field \"${field}\" must be of type ${expected}, received ${received}`,\r\n );\r\n\r\n this.name = \"InvalidTypeException\";\r\n }\r\n}\r\n\r\nclass CustomValidationException extends ValidationException {\r\n constructor(\r\n public readonly field: string,\r\n ) {\r\n super(`Field \"${field}\" failed custom validation`);\r\n\r\n this.name = \"CustomValidationException\";\r\n }\r\n}\r\n\r\nclass EmptyArrayException extends ValidationException {\r\n constructor(\r\n public readonly field: string,\r\n ) {\r\n super(`Field \"${field}\" must not be an empty array`);\r\n\r\n this.name = \"EmptyArrayException\";\r\n }\r\n}\r\n\r\nexport {\r\n ValidationException,\r\n RequestBodyUndefinedException,\r\n InvalidBodyException,\r\n EmptyBodyException,\r\n InvalidBodyLengthException,\r\n InvalidBodyPatternException,\r\n RequiredFieldException,\r\n InvalidTypeException,\r\n CustomValidationException,\r\n EmptyArrayException\r\n}","import {\r\n ValidationException,\r\n RequestBodyUndefinedException,\r\n InvalidBodyException,\r\n RequiredFieldException,\r\n InvalidTypeException,\r\n EmptyArrayException,\r\n InvalidBodyLengthException,\r\n InvalidBodyPatternException,\r\n EmptyBodyException\r\n} from \"./exceptions.js\";\r\n\r\nimport {\r\n ArrayType,\r\n ObjectType,\r\n Types,\r\n} from \"./validatorTypes.js\";\r\n\r\nimport type {\r\n FileFields,\r\n ValidatorType,\r\n ObjectFields,\r\n} from \"./validatorTypes.js\";\r\n\r\ntype FieldDefinition = {\r\n type: ValidatorType;\r\n required?: boolean;\r\n validator?: (\r\n value: unknown\r\n ) => unknown | ValidationException;\r\n};\r\n\r\ninterface BodyFields {\r\n [name: string]: FieldDefinition;\r\n}\r\n\r\ninterface Body {\r\n [name: string]: unknown;\r\n}\r\n\r\ntype TextValidationOptions = {\r\n minLength?: number;\r\n maxLength?: number;\r\n pattern?: RegExp;\r\n allowEmpty?: boolean;\r\n trim?: boolean;\r\n validator?: (\r\n value: string\r\n ) => string | ValidationException;\r\n};\r\n\r\nconst Validator = {\r\n body(body: Body, fields: BodyFields) {\r\n if (body === undefined) {\r\n throw new RequestBodyUndefinedException();\r\n }\r\n\r\n if (\r\n typeof body !== \"object\" ||\r\n body === null ||\r\n Array.isArray(body)\r\n ) {\r\n throw new InvalidBodyException();\r\n }\r\n\r\n return validateObject(body, fields);\r\n },\r\n\r\n text(body: string, options: TextValidationOptions = {}) {\r\n const {\r\n minLength,\r\n maxLength,\r\n pattern,\r\n allowEmpty = true,\r\n trim = false,\r\n validator = undefined\r\n } = options;\r\n\r\n let value = trim ? body.trim() : body;\r\n\r\n if (!allowEmpty && value.length === 0) {\r\n throw new EmptyBodyException();\r\n }\r\n\r\n if (minLength !== undefined && value.length < minLength) {\r\n throw new InvalidBodyLengthException(minLength, \"min\");\r\n }\r\n\r\n if (maxLength !== undefined && value.length > maxLength) {\r\n throw new InvalidBodyLengthException(maxLength, \"max\");\r\n }\r\n\r\n if (pattern !== undefined && !pattern.test(value)) {\r\n throw new InvalidBodyPatternException(pattern);\r\n }\r\n\r\n if (validator) {\r\n const result = validator(value);\r\n if (result instanceof ValidationException) {\r\n throw result;\r\n }\r\n\r\n value = result;\r\n }\r\n\r\n return value;\r\n },\r\n\r\n file: (file: any, options: FileFields = {}) => {\r\n const {\r\n canBeEmpty = false,\r\n maxNumberOfFiles,\r\n minNumberOfFiles\r\n } = options;\r\n\r\n /*\r\n * No file\r\n */\r\n if (!file) {\r\n if (canBeEmpty) {\r\n return null;\r\n }\r\n\r\n throw new ValidationException(\r\n \"File is required but not provided.\"\r\n );\r\n }\r\n\r\n /*\r\n * Multiple files\r\n */\r\n if (Array.isArray(file)) {\r\n\r\n if (file.length === 0) {\r\n if (canBeEmpty) {\r\n return null;\r\n }\r\n\r\n throw new ValidationException(\r\n \"At least one file is required.\"\r\n );\r\n }\r\n\r\n if (\r\n maxNumberOfFiles !== undefined &&\r\n file.length > maxNumberOfFiles\r\n ) {\r\n throw new ValidationException(\r\n `Maximum number of files allowed is ${maxNumberOfFiles}.`\r\n );\r\n }\r\n\r\n if (\r\n minNumberOfFiles !== undefined &&\r\n file.length < minNumberOfFiles\r\n ) {\r\n throw new ValidationException(\r\n `Minimum number of files required is ${minNumberOfFiles}.`\r\n );\r\n }\r\n\r\n return file.map((f) => validateFile(f, options));\r\n }\r\n\r\n /*\r\n * Single file\r\n */\r\n return validateFile(file, options);\r\n }\r\n};\r\n\r\n\r\nfunction validateFile(\r\n file: any,\r\n options: FileFields = {}\r\n) {\r\n const {\r\n maxSizeMb,\r\n minSizeMb,\r\n mimeTypes,\r\n extensions,\r\n fileNamePattern\r\n } = options;\r\n\r\n\r\n /*\r\n * Validate object\r\n */\r\n if (\r\n typeof file !== \"object\" ||\r\n file === null\r\n ) {\r\n throw new ValidationException(\r\n \"Invalid file.\"\r\n );\r\n }\r\n\r\n\r\n /*\r\n * Validate size\r\n */\r\n if (\r\n typeof file.size !== \"number\" ||\r\n file.size < 0\r\n ) {\r\n throw new ValidationException(\r\n \"Invalid file size.\"\r\n );\r\n }\r\n\r\n\r\n /*\r\n * Maximum size\r\n */\r\n if (\r\n maxSizeMb !== undefined &&\r\n file.size > maxSizeMb * 1024 * 1024\r\n ) {\r\n throw new ValidationException(\r\n `File size exceeds the maximum limit of ${maxSizeMb} MB.`\r\n );\r\n }\r\n\r\n\r\n /*\r\n * Minimum size\r\n */\r\n if (\r\n minSizeMb !== undefined &&\r\n file.size < minSizeMb * 1024 * 1024\r\n ) {\r\n throw new ValidationException(\r\n `File size is below the minimum limit of ${minSizeMb} MB.`\r\n );\r\n }\r\n\r\n\r\n /*\r\n * MIME type\r\n */\r\n if (mimeTypes !== undefined) {\r\n\r\n const allowedMimeTypes = Array.isArray(mimeTypes)\r\n ? mimeTypes\r\n : [mimeTypes];\r\n\r\n if (\r\n typeof file.mimetype !== \"string\" ||\r\n !allowedMimeTypes.includes(file.mimetype)\r\n ) {\r\n throw new ValidationException(\r\n `File type is not allowed. Allowed types are: ${allowedMimeTypes.join(\", \")}`\r\n );\r\n }\r\n }\r\n\r\n\r\n /*\r\n * File extension\r\n */\r\n if (extensions !== undefined) {\r\n\r\n const allowedExtensions = (\r\n Array.isArray(extensions)\r\n ? extensions\r\n : [extensions]\r\n ).map(\r\n extension =>\r\n extension\r\n .replace(/^\\./, \"\")\r\n .toLowerCase()\r\n );\r\n\r\n if (typeof file.originalname !== \"string\") {\r\n throw new ValidationException(\r\n \"Invalid file name.\"\r\n );\r\n }\r\n\r\n const extension = file.originalname\r\n .split(\".\")\r\n .pop()\r\n ?.toLowerCase();\r\n\r\n if (\r\n !extension ||\r\n !allowedExtensions.includes(extension)\r\n ) {\r\n throw new ValidationException(\r\n `File extension is not allowed. Allowed extensions are: ${allowedExtensions.join(\", \")}`\r\n );\r\n }\r\n }\r\n\r\n /*\r\n * File name pattern\r\n */\r\n if (\r\n fileNamePattern !== undefined &&\r\n !fileNamePattern.test(file.originalname)\r\n ) {\r\n throw new ValidationException(\r\n \"File name does not match the required pattern.\"\r\n );\r\n }\r\n\r\n\r\n return file;\r\n}\r\n\r\nfunction validateObject(\r\n body: unknown,\r\n fields: ObjectFields,\r\n parentPath = \"\"\r\n): Record<string, unknown> {\r\n\r\n if (\r\n typeof body !== \"object\" ||\r\n body === null ||\r\n Array.isArray(body)\r\n ) {\r\n throw new InvalidBodyException();\r\n }\r\n\r\n const bodyData = body as Record<string, unknown>;\r\n const data: Record<string, unknown> = {};\r\n\r\n for (const name in fields) {\r\n const field = fields[name];\r\n\r\n if (!field) {\r\n continue;\r\n }\r\n\r\n const fieldPath = parentPath\r\n ? `${parentPath}.${name}`\r\n : name;\r\n\r\n let value = bodyData[name];\r\n\r\n // Required field\r\n if (field.required && value === undefined) {\r\n throw new RequiredFieldException(fieldPath);\r\n }\r\n\r\n // Optional field not provided\r\n if (value === undefined) {\r\n continue;\r\n }\r\n\r\n // Validate type\r\n if (!validateType(field.type, value, fieldPath)) {\r\n const type = getTypeDescription(field.type);\r\n\r\n throw new InvalidTypeException(\r\n fieldPath,\r\n type,\r\n whatTypeIs(value)\r\n );\r\n }\r\n\r\n // Custom validator\r\n if (field.validator) {\r\n const result = field.validator(value);\r\n\r\n if (result instanceof ValidationException) {\r\n throw result;\r\n }\r\n\r\n value = result;\r\n }\r\n\r\n data[name] = value;\r\n }\r\n\r\n return data;\r\n}\r\n\r\nfunction validateType(\r\n type: ValidatorType | undefined,\r\n value: unknown,\r\n fieldName = \"\"\r\n): boolean {\r\n\r\n // Multiple types\r\n if (Array.isArray(type)) {\r\n return type.some((t) =>\r\n validateType(t, value, fieldName)\r\n );\r\n }\r\n\r\n // Array\r\n if (type instanceof ArrayType) {\r\n\r\n if (!Array.isArray(value)) {\r\n return false;\r\n }\r\n\r\n if (!type.empty && value.length === 0) {\r\n throw new EmptyArrayException(fieldName);\r\n }\r\n\r\n for (const item of value) {\r\n if (!validateType(type.type, item, fieldName)) {\r\n return false;\r\n }\r\n }\r\n\r\n return true;\r\n }\r\n\r\n // Object structure\r\n if (type instanceof ObjectType) {\r\n\r\n if (\r\n typeof value !== \"object\" ||\r\n value === null ||\r\n Array.isArray(value)\r\n ) {\r\n return false;\r\n }\r\n\r\n validateObject(\r\n value,\r\n type.fields,\r\n fieldName\r\n );\r\n\r\n return true;\r\n }\r\n\r\n // Primitive types\r\n switch (type?.description) {\r\n case \"any\":\r\n return true;\r\n\r\n case \"null\":\r\n return value === null;\r\n\r\n case \"string\":\r\n return typeof value === \"string\";\r\n\r\n case \"number\":\r\n case \"float\":\r\n return typeof value === \"number\";\r\n\r\n case \"int\":\r\n return (\r\n typeof value === \"number\" &&\r\n Number.isInteger(value)\r\n );\r\n\r\n case \"boolean\":\r\n return typeof value === \"boolean\";\r\n\r\n case \"object\":\r\n return (\r\n typeof value === \"object\" &&\r\n value !== null &&\r\n !Array.isArray(value)\r\n );\r\n }\r\n\r\n return false;\r\n}\r\n\r\nfunction getTypeDescription(\r\n type: ValidatorType\r\n): string {\r\n\r\n if (Array.isArray(type)) {\r\n return type\r\n .map((t) => getTypeDescription(t))\r\n .join(\" | \");\r\n }\r\n\r\n return type.description || \"\";\r\n}\r\n\r\nfunction whatTypeIs(value: unknown): string {\r\n\r\n if (\r\n typeof value === \"number\" &&\r\n Number.isInteger(value)\r\n ) {\r\n return \"int\";\r\n }\r\n\r\n if (Array.isArray(value)) {\r\n return \"array\";\r\n }\r\n\r\n if (value === null) {\r\n return \"null\";\r\n }\r\n\r\n return typeof value;\r\n}\r\n\r\nexport {\r\n Validator\r\n};","const Status = {\r\n // 1xx Informational\r\n CONTINUE: 100,\r\n SWITCHING_PROTOCOLS: 101,\r\n PROCESSING: 102,\r\n EARLY_HINTS: 103,\r\n\r\n // 2xx Success\r\n OK: 200,\r\n CREATED: 201,\r\n ACCEPTED: 202,\r\n NON_AUTHORITATIVE_INFORMATION: 203,\r\n NO_CONTENT: 204,\r\n RESET_CONTENT: 205,\r\n PARTIAL_CONTENT: 206,\r\n MULTI_STATUS: 207,\r\n ALREADY_REPORTED: 208,\r\n IM_USED: 226,\r\n\r\n // 3xx Redirection\r\n MULTIPLE_CHOICES: 300,\r\n MOVED_PERMANENTLY: 301,\r\n FOUND: 302,\r\n SEE_OTHER: 303,\r\n NOT_MODIFIED: 304,\r\n TEMPORARY_REDIRECT: 307,\r\n PERMANENT_REDIRECT: 308,\r\n\r\n // 4xx Client Errors\r\n BAD_REQUEST: 400,\r\n UNAUTHORIZED: 401,\r\n PAYMENT_REQUIRED: 402,\r\n FORBIDDEN: 403,\r\n NOT_FOUND: 404,\r\n METHOD_NOT_ALLOWED: 405,\r\n NOT_ACCEPTABLE: 406,\r\n PROXY_AUTHENTICATION_REQUIRED: 407,\r\n REQUEST_TIMEOUT: 408,\r\n CONFLICT: 409,\r\n GONE: 410,\r\n LENGTH_REQUIRED: 411,\r\n PRECONDITION_FAILED: 412,\r\n PAYLOAD_TOO_LARGE: 413,\r\n URI_TOO_LONG: 414,\r\n UNSUPPORTED_MEDIA_TYPE: 415,\r\n RANGE_NOT_SATISFIABLE: 416,\r\n EXPECTATION_FAILED: 417,\r\n IM_A_TEAPOT: 418,\r\n MISDIRECTED_REQUEST: 421,\r\n UNPROCESSABLE_CONTENT: 422,\r\n LOCKED: 423,\r\n FAILED_DEPENDENCY: 424,\r\n UPGRADE_REQUIRED: 426,\r\n PRECONDITION_REQUIRED: 428,\r\n TOO_MANY_REQUESTS: 429,\r\n REQUEST_HEADER_FIELDS_TOO_LARGE: 431,\r\n UNAVAILABLE_FOR_LEGAL_REASONS: 451,\r\n\r\n // 5xx Server Errors\r\n INTERNAL_SERVER_ERROR: 500,\r\n NOT_IMPLEMENTED: 501,\r\n BAD_GATEWAY: 502,\r\n SERVICE_UNAVAILABLE: 503,\r\n GATEWAY_TIMEOUT: 504,\r\n HTTP_VERSION_NOT_SUPPORTED: 505,\r\n VARIANT_ALSO_NEGOTIATES: 506,\r\n INSUFFICIENT_STORAGE: 507,\r\n LOOP_DETECTED: 508,\r\n NOT_EXTENDED: 510,\r\n NETWORK_AUTHENTICATION_REQUIRED: 511\r\n} as const;\r\n\r\nexport {\r\n Status\r\n};","const MimeTypes = {\r\n // Documents\r\n \"pdf\": \"application/pdf\",\r\n \"doc\": \"application/msword\",\r\n \"docx\": \"application/vnd.openxmlformats-officedocument.wordprocessingml.document\",\r\n \"odt\": \"application/vnd.oasis.opendocument.text\",\r\n \"rtf\": \"application/rtf\",\r\n \"tex\": \"application/x-tex\",\r\n \"txt\": \"text/plain\",\r\n \"md\": \"text/markdown\",\r\n\r\n // Spreadsheets\r\n \"xls\": \"application/vnd.ms-excel\",\r\n \"xlsx\": \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\",\r\n \"ods\": \"application/vnd.oasis.opendocument.spreadsheet\",\r\n \"csv\": \"text/csv\",\r\n \"tsv\": \"text/tab-separated-values\",\r\n\r\n // Presentations\r\n \"ppt\": \"application/vnd.ms-powerpoint\",\r\n \"pptx\": \"application/vnd.openxmlformats-officedocument.presentationml.presentation\",\r\n \"odp\": \"application/vnd.oasis.opendocument.presentation\",\r\n\r\n // Images\r\n \"jpg\": \"image/jpeg\",\r\n \"jpeg\": \"image/jpeg\",\r\n \"png\": \"image/png\",\r\n \"gif\": \"image/gif\",\r\n \"bmp\": \"image/bmp\",\r\n \"webp\": \"image/webp\",\r\n \"svg\": \"image/svg+xml\",\r\n \"ico\": \"image/x-icon\",\r\n \"tif\": \"image/tiff\",\r\n \"tiff\": \"image/tiff\",\r\n \"avif\": \"image/avif\",\r\n \"heic\": \"image/heic\",\r\n \"heif\": \"image/heif\",\r\n \"apng\": \"image/apng\",\r\n \"jxl\": \"image/jxl\",\r\n \"psd\": \"image/vnd.adobe.photoshop\",\r\n \"ai\": \"application/postscript\",\r\n \"eps\": \"application/postscript\",\r\n\r\n // Video\r\n \"mp4\": \"video/mp4\",\r\n \"avi\": \"video/x-msvideo\",\r\n \"mov\": \"video/quicktime\",\r\n \"wmv\": \"video/x-ms-wmv\",\r\n \"flv\": \"video/x-flv\",\r\n \"mkv\": \"video/x-matroska\",\r\n \"webm\": \"video/webm\",\r\n \"mpeg\": \"video/mpeg\",\r\n \"mpg\": \"video/mpeg\",\r\n \"m4v\": \"video/x-m4v\",\r\n \"3gp\": \"video/3gpp\",\r\n \"3g2\": \"video/3gpp2\",\r\n \"ts\": \"video/mp2t\",\r\n\r\n // Audio\r\n \"mp3\": \"audio/mpeg\",\r\n \"wav\": \"audio/wav\",\r\n \"ogg\": \"audio/ogg\",\r\n \"oga\": \"audio/ogg\",\r\n \"opus\": \"audio/opus\",\r\n \"aac\": \"audio/aac\",\r\n \"m4a\": \"audio/mp4\",\r\n \"flac\": \"audio/flac\",\r\n \"weba\": \"audio/webm\",\r\n \"mid\": \"audio/midi\",\r\n \"midi\": \"audio/midi\",\r\n\r\n // Web\r\n \"html\": \"text/html\",\r\n \"htm\": \"text/html\",\r\n \"css\": \"text/css\",\r\n \"js\": \"text/javascript\",\r\n \"mjs\": \"text/javascript\",\r\n \"cjs\": \"text/javascript\",\r\n \"jsx\": \"text/jsx\",\r\n \"tsx\": \"video/mp2t\",\r\n\r\n // Data / Configuration\r\n \"json\": \"application/json\",\r\n \"xml\": \"application/xml\",\r\n \"yaml\": \"application/yaml\",\r\n \"yml\": \"application/yaml\",\r\n \"toml\": \"application/toml\",\r\n \"ini\": \"text/plain\",\r\n \"env\": \"text/plain\",\r\n\r\n // Programming\r\n \"c\": \"text/x-c\",\r\n \"h\": \"text/x-c\",\r\n \"cpp\": \"text/x-c++\",\r\n \"cc\": \"text/x-c++\",\r\n \"cxx\": \"text/x-c++\",\r\n \"hpp\": \"text/x-c++\",\r\n \"java\": \"text/x-java-source\",\r\n \"py\": \"text/x-python\",\r\n \"pyw\": \"text/x-python\",\r\n \"rb\": \"text/x-ruby\",\r\n \"go\": \"text/x-go\",\r\n \"rs\": \"text/rust\",\r\n \"php\": \"application/x-httpd-php\",\r\n \"sql\": \"application/sql\",\r\n \"sh\": \"application/x-sh\",\r\n \"bash\": \"application/x-sh\",\r\n \"bat\": \"application/x-msdos-program\",\r\n \"ps1\": \"application/x-powershell\",\r\n \"lua\": \"text/x-lua\",\r\n \"swift\": \"text/x-swift\",\r\n \"kt\": \"text/x-kotlin\",\r\n \"kts\": \"text/x-kotlin\",\r\n \"dart\": \"application/vnd.dart\",\r\n\r\n // Archives / Compression\r\n \"zip\": \"application/zip\",\r\n \"rar\": \"application/vnd.rar\",\r\n \"7z\": \"application/x-7z-compressed\",\r\n \"tar\": \"application/x-tar\",\r\n \"gz\": \"application/gzip\",\r\n \"gzip\": \"application/gzip\",\r\n \"bz\": \"application/x-bzip\",\r\n \"bz2\": \"application/x-bzip2\",\r\n \"xz\": \"application/x-xz\",\r\n \"zst\": \"application/zstd\",\r\n \"tgz\": \"application/gzip\",\r\n \"tar.gz\": \"application/gzip\",\r\n \"tar.bz2\": \"application/x-bzip2\",\r\n \"tar.xz\": \"application/x-xz\",\r\n\r\n // Executables / Applications\r\n \"exe\": \"application/vnd.microsoft.portable-executable\",\r\n \"msi\": \"application/x-msi\",\r\n \"dll\": \"application/vnd.microsoft.portable-executable\",\r\n \"appimage\": \"application/x-iso9660-appimage\",\r\n \"deb\": \"application/vnd.debian.binary-package\",\r\n \"rpm\": \"application/x-rpm\",\r\n \"apk\": \"application/vnd.android.package-archive\",\r\n \"ipa\": \"application/octet-stream\",\r\n\r\n // Disk / Binary\r\n \"iso\": \"application/x-iso9660-image\",\r\n \"img\": \"application/octet-stream\",\r\n \"bin\": \"application/octet-stream\",\r\n \"dmg\": \"application/x-apple-diskimage\",\r\n\r\n // Fonts\r\n \"ttf\": \"font/ttf\",\r\n \"otf\": \"font/otf\",\r\n \"woff\": \"font/woff\",\r\n \"woff2\": \"font/woff2\",\r\n\r\n // E-books\r\n \"epub\": \"application/epub+zip\",\r\n \"mobi\": \"application/x-mobipocket-ebook\",\r\n \"azw\": \"application/vnd.amazon.ebook\",\r\n \"azw3\": \"application/vnd.amazon.ebook\",\r\n\r\n // 3D / CAD\r\n \"stl\": \"model/stl\",\r\n \"obj\": \"model/obj\",\r\n \"gltf\": \"model/gltf+json\",\r\n \"glb\": \"model/gltf-binary\",\r\n \"3ds\": \"image/x-3ds\",\r\n \"dae\": \"model/vnd.collada+xml\",\r\n \"step\": \"model/step\",\r\n \"stp\": \"model/step\",\r\n \"iges\": \"model/iges\",\r\n \"igs\": \"model/iges\",\r\n\r\n // Flash / Legacy\r\n \"swf\": \"application/x-shockwave-flash\",\r\n\r\n // Other common formats\r\n \"ics\": \"text/calendar\",\r\n \"vcf\": \"text/vcard\",\r\n \"vtt\": \"text/vtt\",\r\n \"srt\": \"application/x-subrip\",\r\n};\r\n\r\nexport { MimeTypes };"],"mappings":"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","names":["Array","extension"]}
1
+ {"version":3,"sources":["../../src/http/validatorTypes.ts","../../src/http/exceptions.ts","../../src/http/validador.ts","../../src/http/status.ts","../../src/http/file.ts"],"sourcesContent":["import type { ValidationException } from \"./exceptions.js\";\r\n\r\nexport class ArrayType {\r\n type: PrimitiveType[];\r\n description = \"array\";\r\n empty: boolean = false;\r\n\r\n constructor(...type: PrimitiveType[]) {\r\n this.type = [...type];\r\n this.empty = false;\r\n\r\n const types = type.map((t) => t.description);\r\n this.description = `array(${types.join(\" | \")})`;\r\n }\r\n\r\n canBeEmpty() {\r\n this.empty = true;\r\n return this;\r\n }\r\n}\r\n\r\nexport type FieldDefinition = {\r\n type: ValidatorType;\r\n required?: boolean;\r\n validator?: (value: unknown) => unknown | ValidationException;\r\n};\r\n\r\nexport type ObjectFields = {\r\n [name: string]: FieldDefinition;\r\n};\r\n\r\nexport class ObjectType {\r\n fields: ObjectFields;\r\n description = \"object\";\r\n\r\n constructor(fields: ObjectFields) {\r\n this.fields = fields;\r\n\r\n const names = Object.keys(fields);\r\n\r\n this.description = `object{${names.join(\", \")}}`;\r\n }\r\n}\r\n\r\nfunction Array(...type: PrimitiveType[]) {\r\n return new ArrayType(...type);\r\n}\r\n\r\nfunction Struct(fields: ObjectFields) {\r\n return new ObjectType(fields);\r\n}\r\n\r\nexport const Types = {\r\n String: Symbol(\"string\"),\r\n Number: Symbol(\"number\"),\r\n Int: Symbol(\"int\"),\r\n Float: Symbol(\"float\"),\r\n Boolean: Symbol(\"boolean\"),\r\n Object: Symbol(\"object\"),\r\n Null: Symbol(\"null\"),\r\n Any: Symbol(\"any\"),\r\n \r\n Array,\r\n Struct,\r\n};\r\n\r\nexport type FileFields = {\r\n maxSizeMb?: number;\r\n minSizeMb?: number;\r\n\r\n mimeTypes?: string | string[];\r\n extensions?: string | string[];\r\n\r\n canBeEmpty?: boolean;\r\n\r\n maxNumberOfFiles?: number;\r\n minNumberOfFiles?: number;\r\n\r\n fileNamePattern?: RegExp;\r\n}\r\n\r\nexport type PrimitiveType =\r\n | typeof Types.String\r\n | typeof Types.Number\r\n | typeof Types.Int\r\n | typeof Types.Float\r\n | typeof Types.Boolean\r\n | typeof Types.Object\r\n | typeof Types.Null;\r\n\r\nexport type MultiType = PrimitiveType[];\r\n\r\nexport type ValidatorType =\r\n | PrimitiveType\r\n | MultiType\r\n | ArrayType\r\n | ObjectType;","class ValidationException extends Error {\r\n constructor(message: string) {\r\n super(message);\r\n\r\n this.name = \"ValidationException\";\r\n }\r\n}\r\n\r\nclass RequestBodyUndefinedException extends ValidationException {\r\n constructor() {\r\n super(\"Request body is undefined\");\r\n\r\n this.name = \"RequestBodyUndefinedException\";\r\n }\r\n}\r\n\r\nclass InvalidBodyException extends ValidationException {\r\n constructor() {\r\n super(\"Request body must be an object\");\r\n\r\n this.name = \"InvalidBodyException\";\r\n }\r\n}\r\n\r\nclass EmptyBodyException extends ValidationException {\r\n constructor() {\r\n super(\"Body must not be empty\");\r\n\r\n this.name = \"EmptyBodyException\";\r\n }\r\n}\r\n\r\nclass InvalidBodyLengthException extends ValidationException {\r\n constructor(length: number, type: \"min\" | \"max\") {\r\n const message =\r\n type === \"min\"\r\n ? `The body length must be at least ${length} characters`\r\n : `The body length must not exceed ${length} characters`;\r\n\r\n super(message);\r\n\r\n this.name = \"InvalidBodyLengthException\";\r\n }\r\n}\r\n\r\nclass InvalidBodyPatternException extends ValidationException {\r\n constructor(pattern: RegExp) {\r\n super(`The body does not match the required pattern: ${pattern}`);\r\n\r\n this.name = 'InvalidBodyPatternException';\r\n }\r\n}\r\n\r\nclass RequiredFieldException extends ValidationException {\r\n constructor(\r\n public readonly field: string,\r\n ) {\r\n super(`Field \"${field}\" is required`);\r\n\r\n this.name = \"RequiredFieldException\";\r\n }\r\n}\r\n\r\nclass InvalidTypeException extends ValidationException {\r\n constructor(\r\n public readonly field: string,\r\n public readonly expected: string | undefined,\r\n public readonly received: string,\r\n ) {\r\n super(\r\n `Field \"${field}\" must be of type ${expected}, received ${received}`,\r\n );\r\n\r\n this.name = \"InvalidTypeException\";\r\n }\r\n}\r\n\r\nclass CustomValidationException extends ValidationException {\r\n constructor(\r\n public readonly field: string,\r\n ) {\r\n super(`Field \"${field}\" failed custom validation`);\r\n\r\n this.name = \"CustomValidationException\";\r\n }\r\n}\r\n\r\nclass EmptyArrayException extends ValidationException {\r\n constructor(\r\n public readonly field: string,\r\n ) {\r\n super(`Field \"${field}\" must not be an empty array`);\r\n\r\n this.name = \"EmptyArrayException\";\r\n }\r\n}\r\n\r\nexport {\r\n ValidationException,\r\n RequestBodyUndefinedException,\r\n InvalidBodyException,\r\n EmptyBodyException,\r\n InvalidBodyLengthException,\r\n InvalidBodyPatternException,\r\n RequiredFieldException,\r\n InvalidTypeException,\r\n CustomValidationException,\r\n EmptyArrayException\r\n}","import {\r\n ValidationException,\r\n RequestBodyUndefinedException,\r\n InvalidBodyException,\r\n RequiredFieldException,\r\n InvalidTypeException,\r\n EmptyArrayException,\r\n InvalidBodyLengthException,\r\n InvalidBodyPatternException,\r\n EmptyBodyException\r\n} from \"./exceptions.js\";\r\n\r\nimport {\r\n ArrayType,\r\n ObjectType,\r\n Types,\r\n} from \"./validatorTypes.js\";\r\n\r\nimport type {\r\n FileFields,\r\n ValidatorType,\r\n ObjectFields,\r\n} from \"./validatorTypes.js\";\r\n\r\ntype FieldDefinition = {\r\n type: ValidatorType;\r\n required?: boolean;\r\n validator?: (\r\n value: unknown\r\n ) => unknown | ValidationException;\r\n};\r\n\r\ninterface BodyFields {\r\n [name: string]: FieldDefinition;\r\n}\r\n\r\ninterface Body {\r\n [name: string]: unknown;\r\n}\r\n\r\ntype TextValidationOptions = {\r\n minLength?: number;\r\n maxLength?: number;\r\n pattern?: RegExp;\r\n allowEmpty?: boolean;\r\n trim?: boolean;\r\n validator?: (\r\n value: string\r\n ) => string | ValidationException;\r\n};\r\n\r\nconst Validator = {\r\n body(body: Body, fields: BodyFields) {\r\n if (body === undefined) {\r\n throw new RequestBodyUndefinedException();\r\n }\r\n\r\n if (\r\n typeof body !== \"object\" ||\r\n body === null ||\r\n Array.isArray(body)\r\n ) {\r\n throw new InvalidBodyException();\r\n }\r\n\r\n return validateObject(body, fields);\r\n },\r\n\r\n text(body: string, options: TextValidationOptions = {}) {\r\n const {\r\n minLength,\r\n maxLength,\r\n pattern,\r\n allowEmpty = true,\r\n trim = false,\r\n validator = undefined\r\n } = options;\r\n\r\n let value = trim ? body.trim() : body;\r\n\r\n if (!allowEmpty && value.length === 0) {\r\n throw new EmptyBodyException();\r\n }\r\n\r\n if (minLength !== undefined && value.length < minLength) {\r\n throw new InvalidBodyLengthException(minLength, \"min\");\r\n }\r\n\r\n if (maxLength !== undefined && value.length > maxLength) {\r\n throw new InvalidBodyLengthException(maxLength, \"max\");\r\n }\r\n\r\n if (pattern !== undefined && !pattern.test(value)) {\r\n throw new InvalidBodyPatternException(pattern);\r\n }\r\n\r\n if (validator) {\r\n const result = validator(value);\r\n if (result instanceof ValidationException) {\r\n throw result;\r\n }\r\n\r\n value = result;\r\n }\r\n\r\n return value;\r\n },\r\n\r\n file: (file: any, options: FileFields = {}) => {\r\n const {\r\n canBeEmpty = false,\r\n maxNumberOfFiles,\r\n minNumberOfFiles\r\n } = options;\r\n\r\n /*\r\n * No file\r\n */\r\n if (!file) {\r\n if (canBeEmpty) {\r\n return null;\r\n }\r\n\r\n throw new ValidationException(\r\n \"File is required but not provided.\"\r\n );\r\n }\r\n\r\n /*\r\n * Multiple files\r\n */\r\n if (Array.isArray(file)) {\r\n\r\n if (file.length === 0) {\r\n if (canBeEmpty) {\r\n return null;\r\n }\r\n\r\n throw new ValidationException(\r\n \"At least one file is required.\"\r\n );\r\n }\r\n\r\n if (\r\n maxNumberOfFiles !== undefined &&\r\n file.length > maxNumberOfFiles\r\n ) {\r\n throw new ValidationException(\r\n `Maximum number of files allowed is ${maxNumberOfFiles}.`\r\n );\r\n }\r\n\r\n if (\r\n minNumberOfFiles !== undefined &&\r\n file.length < minNumberOfFiles\r\n ) {\r\n throw new ValidationException(\r\n `Minimum number of files required is ${minNumberOfFiles}.`\r\n );\r\n }\r\n\r\n return file.map((f) => validateFile(f, options));\r\n }\r\n\r\n /*\r\n * Single file\r\n */\r\n return validateFile(file, options);\r\n }\r\n};\r\n\r\n\r\nfunction validateFile(\r\n file: any,\r\n options: FileFields = {}\r\n) {\r\n const {\r\n maxSizeMb,\r\n minSizeMb,\r\n mimeTypes,\r\n extensions,\r\n fileNamePattern\r\n } = options;\r\n\r\n\r\n /*\r\n * Validate object\r\n */\r\n if (\r\n typeof file !== \"object\" ||\r\n file === null\r\n ) {\r\n throw new ValidationException(\r\n \"Invalid file.\"\r\n );\r\n }\r\n\r\n\r\n /*\r\n * Validate size\r\n */\r\n if (\r\n typeof file.size !== \"number\" ||\r\n file.size < 0\r\n ) {\r\n throw new ValidationException(\r\n \"Invalid file size.\"\r\n );\r\n }\r\n\r\n\r\n /*\r\n * Maximum size\r\n */\r\n if (\r\n maxSizeMb !== undefined &&\r\n file.size > maxSizeMb * 1024 * 1024\r\n ) {\r\n throw new ValidationException(\r\n `File size exceeds the maximum limit of ${maxSizeMb} MB.`\r\n );\r\n }\r\n\r\n\r\n /*\r\n * Minimum size\r\n */\r\n if (\r\n minSizeMb !== undefined &&\r\n file.size < minSizeMb * 1024 * 1024\r\n ) {\r\n throw new ValidationException(\r\n `File size is below the minimum limit of ${minSizeMb} MB.`\r\n );\r\n }\r\n\r\n\r\n /*\r\n * MIME type\r\n */\r\n if (mimeTypes !== undefined) {\r\n\r\n const allowedMimeTypes = Array.isArray(mimeTypes)\r\n ? mimeTypes\r\n : [mimeTypes];\r\n\r\n if (\r\n typeof file.mimetype !== \"string\" ||\r\n !allowedMimeTypes.includes(file.mimetype)\r\n ) {\r\n throw new ValidationException(\r\n `File type is not allowed. Allowed types are: ${allowedMimeTypes.join(\", \")}`\r\n );\r\n }\r\n }\r\n\r\n\r\n /*\r\n * File extension\r\n */\r\n if (extensions !== undefined) {\r\n\r\n const allowedExtensions = (\r\n Array.isArray(extensions)\r\n ? extensions\r\n : [extensions]\r\n ).map(\r\n extension =>\r\n extension\r\n .replace(/^\\./, \"\")\r\n .toLowerCase()\r\n );\r\n\r\n if (typeof file.originalname !== \"string\") {\r\n throw new ValidationException(\r\n \"Invalid file name.\"\r\n );\r\n }\r\n\r\n const extension = file.originalname\r\n .split(\".\")\r\n .pop()\r\n ?.toLowerCase();\r\n\r\n if (\r\n !extension ||\r\n !allowedExtensions.includes(extension)\r\n ) {\r\n throw new ValidationException(\r\n `File extension is not allowed. Allowed extensions are: ${allowedExtensions.join(\", \")}`\r\n );\r\n }\r\n }\r\n\r\n /*\r\n * File name pattern\r\n */\r\n if (\r\n fileNamePattern !== undefined &&\r\n !fileNamePattern.test(file.originalname)\r\n ) {\r\n throw new ValidationException(\r\n \"File name does not match the required pattern.\"\r\n );\r\n }\r\n\r\n\r\n return file;\r\n}\r\n\r\nfunction validateObject(\r\n body: unknown,\r\n fields: ObjectFields,\r\n parentPath = \"\"\r\n): Record<string, unknown> {\r\n\r\n if (\r\n typeof body !== \"object\" ||\r\n body === null ||\r\n Array.isArray(body)\r\n ) {\r\n throw new InvalidBodyException();\r\n }\r\n\r\n const bodyData = body as Record<string, unknown>;\r\n const data: Record<string, unknown> = {};\r\n\r\n for (const name in fields) {\r\n const field = fields[name];\r\n\r\n if (!field) {\r\n continue;\r\n }\r\n\r\n const fieldPath = parentPath\r\n ? `${parentPath}.${name}`\r\n : name;\r\n\r\n let value = bodyData[name];\r\n\r\n // Required field\r\n if (field.required && value === undefined) {\r\n throw new RequiredFieldException(fieldPath);\r\n }\r\n\r\n // Optional field not provided\r\n if (value === undefined) {\r\n continue;\r\n }\r\n\r\n // Validate type\r\n if (!validateType(field.type, value, fieldPath)) {\r\n const type = getTypeDescription(field.type);\r\n\r\n throw new InvalidTypeException(\r\n fieldPath,\r\n type,\r\n whatTypeIs(value)\r\n );\r\n }\r\n\r\n // Custom validator\r\n if (field.validator) {\r\n const result = field.validator(value);\r\n\r\n if (result instanceof ValidationException) {\r\n throw result;\r\n }\r\n\r\n value = result;\r\n }\r\n\r\n data[name] = value;\r\n }\r\n\r\n return data;\r\n}\r\n\r\nfunction validateType(\r\n type: ValidatorType | undefined,\r\n value: unknown,\r\n fieldName = \"\"\r\n): boolean {\r\n\r\n // Multiple types\r\n if (Array.isArray(type)) {\r\n return type.some((t) =>\r\n validateType(t, value, fieldName)\r\n );\r\n }\r\n\r\n // Array\r\n if (type instanceof ArrayType) {\r\n\r\n if (!Array.isArray(value)) {\r\n return false;\r\n }\r\n\r\n if (!type.empty && value.length === 0) {\r\n throw new EmptyArrayException(fieldName);\r\n }\r\n\r\n for (const item of value) {\r\n if (!validateType(type.type, item, fieldName)) {\r\n return false;\r\n }\r\n }\r\n\r\n return true;\r\n }\r\n\r\n // Object structure\r\n if (type instanceof ObjectType) {\r\n\r\n if (\r\n typeof value !== \"object\" ||\r\n value === null ||\r\n Array.isArray(value)\r\n ) {\r\n return false;\r\n }\r\n\r\n validateObject(\r\n value,\r\n type.fields,\r\n fieldName\r\n );\r\n\r\n return true;\r\n }\r\n\r\n // Primitive types\r\n switch (type?.description) {\r\n case \"any\":\r\n return true;\r\n\r\n case \"null\":\r\n return value === null;\r\n\r\n case \"string\":\r\n return typeof value === \"string\";\r\n\r\n case \"number\":\r\n case \"float\":\r\n return typeof value === \"number\";\r\n\r\n case \"int\":\r\n return (\r\n typeof value === \"number\" &&\r\n Number.isInteger(value)\r\n );\r\n\r\n case \"boolean\":\r\n return typeof value === \"boolean\";\r\n\r\n case \"object\":\r\n return (\r\n typeof value === \"object\" &&\r\n value !== null &&\r\n !Array.isArray(value)\r\n );\r\n }\r\n\r\n return false;\r\n}\r\n\r\nfunction getTypeDescription(\r\n type: ValidatorType\r\n): string {\r\n\r\n if (Array.isArray(type)) {\r\n return type\r\n .map((t) => getTypeDescription(t))\r\n .join(\" | \");\r\n }\r\n\r\n return type.description || \"\";\r\n}\r\n\r\nfunction whatTypeIs(value: unknown): string {\r\n\r\n if (\r\n typeof value === \"number\" &&\r\n Number.isInteger(value)\r\n ) {\r\n return \"int\";\r\n }\r\n\r\n if (Array.isArray(value)) {\r\n return \"array\";\r\n }\r\n\r\n if (value === null) {\r\n return \"null\";\r\n }\r\n\r\n return typeof value;\r\n}\r\n\r\nexport {\r\n Validator\r\n};","const Status = {\r\n // 1xx Informational\r\n CONTINUE: 100,\r\n SWITCHING_PROTOCOLS: 101,\r\n PROCESSING: 102,\r\n EARLY_HINTS: 103,\r\n\r\n // 2xx Success\r\n OK: 200,\r\n CREATED: 201,\r\n ACCEPTED: 202,\r\n NON_AUTHORITATIVE_INFORMATION: 203,\r\n NO_CONTENT: 204,\r\n RESET_CONTENT: 205,\r\n PARTIAL_CONTENT: 206,\r\n MULTI_STATUS: 207,\r\n ALREADY_REPORTED: 208,\r\n IM_USED: 226,\r\n\r\n // 3xx Redirection\r\n MULTIPLE_CHOICES: 300,\r\n MOVED_PERMANENTLY: 301,\r\n FOUND: 302,\r\n SEE_OTHER: 303,\r\n NOT_MODIFIED: 304,\r\n TEMPORARY_REDIRECT: 307,\r\n PERMANENT_REDIRECT: 308,\r\n\r\n // 4xx Client Errors\r\n BAD_REQUEST: 400,\r\n UNAUTHORIZED: 401,\r\n PAYMENT_REQUIRED: 402,\r\n FORBIDDEN: 403,\r\n NOT_FOUND: 404,\r\n METHOD_NOT_ALLOWED: 405,\r\n NOT_ACCEPTABLE: 406,\r\n PROXY_AUTHENTICATION_REQUIRED: 407,\r\n REQUEST_TIMEOUT: 408,\r\n CONFLICT: 409,\r\n GONE: 410,\r\n LENGTH_REQUIRED: 411,\r\n PRECONDITION_FAILED: 412,\r\n PAYLOAD_TOO_LARGE: 413,\r\n URI_TOO_LONG: 414,\r\n UNSUPPORTED_MEDIA_TYPE: 415,\r\n RANGE_NOT_SATISFIABLE: 416,\r\n EXPECTATION_FAILED: 417,\r\n IM_A_TEAPOT: 418,\r\n MISDIRECTED_REQUEST: 421,\r\n UNPROCESSABLE_CONTENT: 422,\r\n LOCKED: 423,\r\n FAILED_DEPENDENCY: 424,\r\n UPGRADE_REQUIRED: 426,\r\n PRECONDITION_REQUIRED: 428,\r\n TOO_MANY_REQUESTS: 429,\r\n REQUEST_HEADER_FIELDS_TOO_LARGE: 431,\r\n UNAVAILABLE_FOR_LEGAL_REASONS: 451,\r\n\r\n // 5xx Server Errors\r\n INTERNAL_SERVER_ERROR: 500,\r\n NOT_IMPLEMENTED: 501,\r\n BAD_GATEWAY: 502,\r\n SERVICE_UNAVAILABLE: 503,\r\n GATEWAY_TIMEOUT: 504,\r\n HTTP_VERSION_NOT_SUPPORTED: 505,\r\n VARIANT_ALSO_NEGOTIATES: 506,\r\n INSUFFICIENT_STORAGE: 507,\r\n LOOP_DETECTED: 508,\r\n NOT_EXTENDED: 510,\r\n NETWORK_AUTHENTICATION_REQUIRED: 511\r\n} as const;\r\n\r\nexport {\r\n Status\r\n};","const MimeTypes = {\r\n // Documents\r\n \"pdf\": \"application/pdf\",\r\n \"doc\": \"application/msword\",\r\n \"docx\": \"application/vnd.openxmlformats-officedocument.wordprocessingml.document\",\r\n \"odt\": \"application/vnd.oasis.opendocument.text\",\r\n \"rtf\": \"application/rtf\",\r\n \"tex\": \"application/x-tex\",\r\n \"txt\": \"text/plain\",\r\n \"md\": \"text/markdown\",\r\n\r\n // Spreadsheets\r\n \"xls\": \"application/vnd.ms-excel\",\r\n \"xlsx\": \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\",\r\n \"ods\": \"application/vnd.oasis.opendocument.spreadsheet\",\r\n \"csv\": \"text/csv\",\r\n \"tsv\": \"text/tab-separated-values\",\r\n\r\n // Presentations\r\n \"ppt\": \"application/vnd.ms-powerpoint\",\r\n \"pptx\": \"application/vnd.openxmlformats-officedocument.presentationml.presentation\",\r\n \"odp\": \"application/vnd.oasis.opendocument.presentation\",\r\n\r\n // Images\r\n \"jpg\": \"image/jpeg\",\r\n \"jpeg\": \"image/jpeg\",\r\n \"png\": \"image/png\",\r\n \"gif\": \"image/gif\",\r\n \"bmp\": \"image/bmp\",\r\n \"webp\": \"image/webp\",\r\n \"svg\": \"image/svg+xml\",\r\n \"ico\": \"image/x-icon\",\r\n \"tif\": \"image/tiff\",\r\n \"tiff\": \"image/tiff\",\r\n \"avif\": \"image/avif\",\r\n \"heic\": \"image/heic\",\r\n \"heif\": \"image/heif\",\r\n \"apng\": \"image/apng\",\r\n \"jxl\": \"image/jxl\",\r\n \"psd\": \"image/vnd.adobe.photoshop\",\r\n \"ai\": \"application/postscript\",\r\n \"eps\": \"application/postscript\",\r\n\r\n // Video\r\n \"mp4\": \"video/mp4\",\r\n \"avi\": \"video/x-msvideo\",\r\n \"mov\": \"video/quicktime\",\r\n \"wmv\": \"video/x-ms-wmv\",\r\n \"flv\": \"video/x-flv\",\r\n \"mkv\": \"video/x-matroska\",\r\n \"webm\": \"video/webm\",\r\n \"mpeg\": \"video/mpeg\",\r\n \"mpg\": \"video/mpeg\",\r\n \"m4v\": \"video/x-m4v\",\r\n \"3gp\": \"video/3gpp\",\r\n \"3g2\": \"video/3gpp2\",\r\n \"ts\": \"video/mp2t\",\r\n\r\n // Audio\r\n \"mp3\": \"audio/mpeg\",\r\n \"wav\": \"audio/wav\",\r\n \"ogg\": \"audio/ogg\",\r\n \"oga\": \"audio/ogg\",\r\n \"opus\": \"audio/opus\",\r\n \"aac\": \"audio/aac\",\r\n \"m4a\": \"audio/mp4\",\r\n \"flac\": \"audio/flac\",\r\n \"weba\": \"audio/webm\",\r\n \"mid\": \"audio/midi\",\r\n \"midi\": \"audio/midi\",\r\n\r\n // Web\r\n \"html\": \"text/html\",\r\n \"htm\": \"text/html\",\r\n \"css\": \"text/css\",\r\n \"js\": \"text/javascript\",\r\n \"mjs\": \"text/javascript\",\r\n \"cjs\": \"text/javascript\",\r\n \"jsx\": \"text/jsx\",\r\n \"tsx\": \"video/mp2t\",\r\n\r\n // Data / Configuration\r\n \"json\": \"application/json\",\r\n \"xml\": \"application/xml\",\r\n \"yaml\": \"application/yaml\",\r\n \"yml\": \"application/yaml\",\r\n \"toml\": \"application/toml\",\r\n \"ini\": \"text/plain\",\r\n \"env\": \"text/plain\",\r\n\r\n // Programming\r\n \"c\": \"text/x-c\",\r\n \"h\": \"text/x-c\",\r\n \"cpp\": \"text/x-c++\",\r\n \"cc\": \"text/x-c++\",\r\n \"cxx\": \"text/x-c++\",\r\n \"hpp\": \"text/x-c++\",\r\n \"java\": \"text/x-java-source\",\r\n \"py\": \"text/x-python\",\r\n \"pyw\": \"text/x-python\",\r\n \"rb\": \"text/x-ruby\",\r\n \"go\": \"text/x-go\",\r\n \"rs\": \"text/rust\",\r\n \"php\": \"application/x-httpd-php\",\r\n \"sql\": \"application/sql\",\r\n \"sh\": \"application/x-sh\",\r\n \"bash\": \"application/x-sh\",\r\n \"bat\": \"application/x-msdos-program\",\r\n \"ps1\": \"application/x-powershell\",\r\n \"lua\": \"text/x-lua\",\r\n \"swift\": \"text/x-swift\",\r\n \"kt\": \"text/x-kotlin\",\r\n \"kts\": \"text/x-kotlin\",\r\n \"dart\": \"application/vnd.dart\",\r\n\r\n // Archives / Compression\r\n \"zip\": \"application/zip\",\r\n \"rar\": \"application/vnd.rar\",\r\n \"7z\": \"application/x-7z-compressed\",\r\n \"tar\": \"application/x-tar\",\r\n \"gz\": \"application/gzip\",\r\n \"gzip\": \"application/gzip\",\r\n \"bz\": \"application/x-bzip\",\r\n \"bz2\": \"application/x-bzip2\",\r\n \"xz\": \"application/x-xz\",\r\n \"zst\": \"application/zstd\",\r\n \"tgz\": \"application/gzip\",\r\n \"tar.gz\": \"application/gzip\",\r\n \"tar.bz2\": \"application/x-bzip2\",\r\n \"tar.xz\": \"application/x-xz\",\r\n\r\n // Executables / Applications\r\n \"exe\": \"application/vnd.microsoft.portable-executable\",\r\n \"msi\": \"application/x-msi\",\r\n \"dll\": \"application/vnd.microsoft.portable-executable\",\r\n \"appimage\": \"application/x-iso9660-appimage\",\r\n \"deb\": \"application/vnd.debian.binary-package\",\r\n \"rpm\": \"application/x-rpm\",\r\n \"apk\": \"application/vnd.android.package-archive\",\r\n \"ipa\": \"application/octet-stream\",\r\n\r\n // Disk / Binary\r\n \"iso\": \"application/x-iso9660-image\",\r\n \"img\": \"application/octet-stream\",\r\n \"bin\": \"application/octet-stream\",\r\n \"dmg\": \"application/x-apple-diskimage\",\r\n\r\n // Fonts\r\n \"ttf\": \"font/ttf\",\r\n \"otf\": \"font/otf\",\r\n \"woff\": \"font/woff\",\r\n \"woff2\": \"font/woff2\",\r\n\r\n // E-books\r\n \"epub\": \"application/epub+zip\",\r\n \"mobi\": \"application/x-mobipocket-ebook\",\r\n \"azw\": \"application/vnd.amazon.ebook\",\r\n \"azw3\": \"application/vnd.amazon.ebook\",\r\n\r\n // 3D / CAD\r\n \"stl\": \"model/stl\",\r\n \"obj\": \"model/obj\",\r\n \"gltf\": \"model/gltf+json\",\r\n \"glb\": \"model/gltf-binary\",\r\n \"3ds\": \"image/x-3ds\",\r\n \"dae\": \"model/vnd.collada+xml\",\r\n \"step\": \"model/step\",\r\n \"stp\": \"model/step\",\r\n \"iges\": \"model/iges\",\r\n \"igs\": \"model/iges\",\r\n\r\n // Flash / Legacy\r\n \"swf\": \"application/x-shockwave-flash\",\r\n\r\n // Other common formats\r\n \"ics\": \"text/calendar\",\r\n \"vcf\": \"text/vcard\",\r\n \"vtt\": \"text/vtt\",\r\n \"srt\": \"application/x-subrip\",\r\n};\r\n\r\nexport { MimeTypes };"],"mappings":"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","names":["Array","extension"]}
package/dist/index.cjs CHANGED
@@ -31,9 +31,11 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
31
31
  var src_exports = {};
32
32
  __export(src_exports, {
33
33
  QuikRouter: () => QuikRouter,
34
+ QuikServer: () => QuikServer,
34
35
  Router: () => Router,
35
36
  Server: () => Server,
36
37
  ServerInvalidRouteError: () => ServerInvalidRouteError,
38
+ getServer: () => getServer,
37
39
  logger: () => logger
38
40
  });
39
41
  module.exports = __toCommonJS(src_exports);
@@ -431,8 +433,24 @@ function Router() {
431
433
 
432
434
  // src/core/server.ts
433
435
  var import_express2 = __toESM(require("express"), 1);
434
- var import_express_fileupload = __toESM(require("express-fileupload"), 1);
435
436
  var import_node_http = __toESM(require("http"), 1);
437
+
438
+ // src/core/serverContext.ts
439
+ var activeServer;
440
+ function registerServer(server) {
441
+ activeServer = server;
442
+ }
443
+ function getServer() {
444
+ if (!activeServer) {
445
+ throw new Error(
446
+ "Quik server has not been initialized. Call Server() first."
447
+ );
448
+ }
449
+ return activeServer;
450
+ }
451
+
452
+ // src/core/server.ts
453
+ var import_express_fileupload = __toESM(require("express-fileupload"), 1);
436
454
  var import_node_path2 = __toESM(require("path"), 1);
437
455
  var import_node_fs2 = __toESM(require("fs"), 1);
438
456
 
@@ -802,19 +820,16 @@ var QuikServer = class {
802
820
  this.httpServer.maxConnections = config2.maxConnections;
803
821
  return this;
804
822
  }
805
- #listen() {
823
+ #listen(callback) {
806
824
  const { port, host } = this.config.http;
807
825
  const messages = translate(this.config.language, "server");
808
- this.httpServer.listen(
809
- port,
810
- host,
811
- () => {
812
- logger.info(`${messages.start} ${host ?? "localhost"}:${port}`);
813
- }
814
- );
826
+ this.httpServer.listen(port, host, () => {
827
+ logger.info(`${messages.start} ${host ?? "localhost"}:${port}`);
828
+ if (callback) callback();
829
+ });
815
830
  return this;
816
831
  }
817
- start() {
832
+ start(callback) {
818
833
  this.#configureExpress();
819
834
  this.#configureMiddleware();
820
835
  this.#configureFileUpload();
@@ -824,19 +839,23 @@ var QuikServer = class {
824
839
  this.#loadCrons();
825
840
  this.#loadWS();
826
841
  this.#configureHTTP();
827
- this.#listen();
842
+ this.#listen(callback);
828
843
  return this;
829
844
  }
830
845
  };
831
846
  function Server() {
832
- return new QuikServer();
847
+ const server = new QuikServer();
848
+ registerServer(server);
849
+ return server;
833
850
  }
834
851
  // Annotate the CommonJS export names for ESM import in node:
835
852
  0 && (module.exports = {
836
853
  QuikRouter,
854
+ QuikServer,
837
855
  Router,
838
856
  Server,
839
857
  ServerInvalidRouteError,
858
+ getServer,
840
859
  logger
841
860
  });
842
861
  //# sourceMappingURL=index.cjs.map