@desaubv/quik 0.1.4 → 0.1.5
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.
- package/dist/http/index.cjs +0 -5
- package/dist/http/index.cjs.map +1 -1
- package/dist/http/index.js +0 -5
- package/dist/http/index.js.map +1 -1
- package/dist/index.cjs +24 -2
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +3 -1
- package/dist/index.d.ts +3 -1
- package/dist/index.js +22 -2
- package/dist/index.js.map +1 -1
- package/dist/ws/index.cjs +8 -0
- package/dist/ws/index.cjs.map +1 -1
- package/dist/ws/index.d.cts +2 -1
- package/dist/ws/index.d.ts +2 -1
- package/dist/ws/index.js +8 -0
- package/dist/ws/index.js.map +1 -1
- package/package.json +79 -79
package/dist/http/index.cjs
CHANGED
|
@@ -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
|
package/dist/http/index.cjs.map
CHANGED
|
@@ -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"]}
|
package/dist/http/index.js
CHANGED
|
@@ -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
|
package/dist/http/index.js.map
CHANGED
|
@@ -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
|
|
|
@@ -829,14 +847,18 @@ var QuikServer = class {
|
|
|
829
847
|
}
|
|
830
848
|
};
|
|
831
849
|
function Server() {
|
|
832
|
-
|
|
850
|
+
const server = new QuikServer();
|
|
851
|
+
registerServer(server);
|
|
852
|
+
return server;
|
|
833
853
|
}
|
|
834
854
|
// Annotate the CommonJS export names for ESM import in node:
|
|
835
855
|
0 && (module.exports = {
|
|
836
856
|
QuikRouter,
|
|
857
|
+
QuikServer,
|
|
837
858
|
Router,
|
|
838
859
|
Server,
|
|
839
860
|
ServerInvalidRouteError,
|
|
861
|
+
getServer,
|
|
840
862
|
logger
|
|
841
863
|
});
|
|
842
864
|
//# sourceMappingURL=index.cjs.map
|