@desaubv/quik 0.0.5 → 0.0.8

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.
@@ -0,0 +1,285 @@
1
+ // src/http/validatorTypes.ts
2
+ var ArrayType = class {
3
+ type;
4
+ description = "array";
5
+ empty = false;
6
+ constructor(...type) {
7
+ this.type = [...type];
8
+ this.empty = false;
9
+ const types = type.map((t) => t.description);
10
+ this.description = `array(${types.join(" | ")})`;
11
+ }
12
+ canBeEmpty() {
13
+ this.empty = true;
14
+ return this;
15
+ }
16
+ };
17
+ var ObjectType = class {
18
+ fields;
19
+ description = "object";
20
+ constructor(fields) {
21
+ this.fields = fields;
22
+ const names = Object.keys(fields);
23
+ this.description = `object{${names.join(", ")}}`;
24
+ }
25
+ };
26
+ function Array2(...type) {
27
+ return new ArrayType(...type);
28
+ }
29
+ function Struct(fields) {
30
+ return new ObjectType(fields);
31
+ }
32
+ var Types = {
33
+ String: /* @__PURE__ */ Symbol("string"),
34
+ Number: /* @__PURE__ */ Symbol("number"),
35
+ Int: /* @__PURE__ */ Symbol("int"),
36
+ Float: /* @__PURE__ */ Symbol("float"),
37
+ Boolean: /* @__PURE__ */ Symbol("boolean"),
38
+ Object: /* @__PURE__ */ Symbol("object"),
39
+ Null: /* @__PURE__ */ Symbol("null"),
40
+ Array: Array2,
41
+ Struct
42
+ };
43
+
44
+ // src/http/exceptions.ts
45
+ var ValidationException = class extends Error {
46
+ constructor(message) {
47
+ super(message);
48
+ this.name = "ValidationException";
49
+ }
50
+ };
51
+ var RequestBodyUndefinedException = class extends ValidationException {
52
+ constructor() {
53
+ super("Request body is undefined");
54
+ this.name = "RequestBodyUndefinedException";
55
+ }
56
+ };
57
+ var InvalidBodyException = class extends ValidationException {
58
+ constructor() {
59
+ super("Request body must be an object");
60
+ this.name = "InvalidBodyException";
61
+ }
62
+ };
63
+ var RequiredFieldException = class extends ValidationException {
64
+ constructor(field) {
65
+ super(`Field "${field}" is required`);
66
+ this.field = field;
67
+ this.name = "RequiredFieldException";
68
+ }
69
+ field;
70
+ };
71
+ var InvalidTypeException = class extends ValidationException {
72
+ constructor(field, expected, received) {
73
+ super(
74
+ `Field "${field}" must be of type ${expected}, received ${received}`
75
+ );
76
+ this.field = field;
77
+ this.expected = expected;
78
+ this.received = received;
79
+ this.name = "InvalidTypeException";
80
+ }
81
+ field;
82
+ expected;
83
+ received;
84
+ };
85
+ var EmptyArrayException = class extends ValidationException {
86
+ constructor(field) {
87
+ super(`Field "${field}" must not be an empty array`);
88
+ this.field = field;
89
+ this.name = "EmptyArrayException";
90
+ }
91
+ field;
92
+ };
93
+
94
+ // src/http/validador.ts
95
+ var Validator = {
96
+ body(body, fields) {
97
+ if (body === void 0) {
98
+ throw new RequestBodyUndefinedException();
99
+ }
100
+ if (typeof body !== "object" || body === null || Array.isArray(body)) {
101
+ throw new InvalidBodyException();
102
+ }
103
+ return validateObject(body, fields);
104
+ }
105
+ };
106
+ function validateObject(body, fields, parentPath = "") {
107
+ if (typeof body !== "object" || body === null || Array.isArray(body)) {
108
+ throw new InvalidBodyException();
109
+ }
110
+ const bodyData = body;
111
+ const data = {};
112
+ for (const name in fields) {
113
+ const field = fields[name];
114
+ if (!field) {
115
+ continue;
116
+ }
117
+ const fieldPath = parentPath ? `${parentPath}.${name}` : name;
118
+ let value = bodyData[name];
119
+ if (field.required && value === void 0) {
120
+ throw new RequiredFieldException(fieldPath);
121
+ }
122
+ if (value === void 0) {
123
+ continue;
124
+ }
125
+ if (!validateType(field.type, value, fieldPath)) {
126
+ const type = getTypeDescription(field.type);
127
+ throw new InvalidTypeException(
128
+ fieldPath,
129
+ type,
130
+ whatTypeIs(value)
131
+ );
132
+ }
133
+ if (field.validator) {
134
+ const result = field.validator(value);
135
+ if (result instanceof ValidationException) {
136
+ throw result;
137
+ }
138
+ value = result;
139
+ }
140
+ data[name] = value;
141
+ }
142
+ return data;
143
+ }
144
+ function validateType(type, value, fieldName = "") {
145
+ if (Array.isArray(type)) {
146
+ return type.some(
147
+ (t) => validateType(t, value, fieldName)
148
+ );
149
+ }
150
+ if (type instanceof ArrayType) {
151
+ if (!Array.isArray(value)) {
152
+ return false;
153
+ }
154
+ if (!type.empty && value.length === 0) {
155
+ throw new EmptyArrayException(fieldName);
156
+ }
157
+ for (const item of value) {
158
+ if (!validateType(type.type, item, fieldName)) {
159
+ return false;
160
+ }
161
+ }
162
+ return true;
163
+ }
164
+ if (type instanceof ObjectType) {
165
+ if (typeof value !== "object" || value === null || Array.isArray(value)) {
166
+ return false;
167
+ }
168
+ validateObject(
169
+ value,
170
+ type.fields,
171
+ fieldName
172
+ );
173
+ return true;
174
+ }
175
+ switch (type?.description) {
176
+ case "null":
177
+ return value === null;
178
+ case "string":
179
+ return typeof value === "string";
180
+ case "number":
181
+ case "float":
182
+ return typeof value === "number";
183
+ case "int":
184
+ return typeof value === "number" && Number.isInteger(value);
185
+ case "boolean":
186
+ return typeof value === "boolean";
187
+ case "object":
188
+ return typeof value === "object" && value !== null && !Array.isArray(value);
189
+ }
190
+ return false;
191
+ }
192
+ function getTypeDescription(type) {
193
+ if (Array.isArray(type)) {
194
+ return type.map((t) => getTypeDescription(t)).join(" | ");
195
+ }
196
+ return type.description || "";
197
+ }
198
+ function whatTypeIs(value) {
199
+ if (typeof value === "number" && Number.isInteger(value)) {
200
+ return "int";
201
+ }
202
+ if (Array.isArray(value)) {
203
+ return "array";
204
+ }
205
+ if (value === null) {
206
+ return "null";
207
+ }
208
+ return typeof value;
209
+ }
210
+
211
+ // src/http/status.ts
212
+ var Status = {
213
+ // 1xx Informational
214
+ CONTINUE: 100,
215
+ SWITCHING_PROTOCOLS: 101,
216
+ PROCESSING: 102,
217
+ EARLY_HINTS: 103,
218
+ // 2xx Success
219
+ OK: 200,
220
+ CREATED: 201,
221
+ ACCEPTED: 202,
222
+ NON_AUTHORITATIVE_INFORMATION: 203,
223
+ NO_CONTENT: 204,
224
+ RESET_CONTENT: 205,
225
+ PARTIAL_CONTENT: 206,
226
+ MULTI_STATUS: 207,
227
+ ALREADY_REPORTED: 208,
228
+ IM_USED: 226,
229
+ // 3xx Redirection
230
+ MULTIPLE_CHOICES: 300,
231
+ MOVED_PERMANENTLY: 301,
232
+ FOUND: 302,
233
+ SEE_OTHER: 303,
234
+ NOT_MODIFIED: 304,
235
+ TEMPORARY_REDIRECT: 307,
236
+ PERMANENT_REDIRECT: 308,
237
+ // 4xx Client Errors
238
+ BAD_REQUEST: 400,
239
+ UNAUTHORIZED: 401,
240
+ PAYMENT_REQUIRED: 402,
241
+ FORBIDDEN: 403,
242
+ NOT_FOUND: 404,
243
+ METHOD_NOT_ALLOWED: 405,
244
+ NOT_ACCEPTABLE: 406,
245
+ PROXY_AUTHENTICATION_REQUIRED: 407,
246
+ REQUEST_TIMEOUT: 408,
247
+ CONFLICT: 409,
248
+ GONE: 410,
249
+ LENGTH_REQUIRED: 411,
250
+ PRECONDITION_FAILED: 412,
251
+ PAYLOAD_TOO_LARGE: 413,
252
+ URI_TOO_LONG: 414,
253
+ UNSUPPORTED_MEDIA_TYPE: 415,
254
+ RANGE_NOT_SATISFIABLE: 416,
255
+ EXPECTATION_FAILED: 417,
256
+ IM_A_TEAPOT: 418,
257
+ MISDIRECTED_REQUEST: 421,
258
+ UNPROCESSABLE_CONTENT: 422,
259
+ LOCKED: 423,
260
+ FAILED_DEPENDENCY: 424,
261
+ UPGRADE_REQUIRED: 426,
262
+ PRECONDITION_REQUIRED: 428,
263
+ TOO_MANY_REQUESTS: 429,
264
+ REQUEST_HEADER_FIELDS_TOO_LARGE: 431,
265
+ UNAVAILABLE_FOR_LEGAL_REASONS: 451,
266
+ // 5xx Server Errors
267
+ INTERNAL_SERVER_ERROR: 500,
268
+ NOT_IMPLEMENTED: 501,
269
+ BAD_GATEWAY: 502,
270
+ SERVICE_UNAVAILABLE: 503,
271
+ GATEWAY_TIMEOUT: 504,
272
+ HTTP_VERSION_NOT_SUPPORTED: 505,
273
+ VARIANT_ALSO_NEGOTIATES: 506,
274
+ INSUFFICIENT_STORAGE: 507,
275
+ LOOP_DETECTED: 508,
276
+ NOT_EXTENDED: 510,
277
+ NETWORK_AUTHENTICATION_REQUIRED: 511
278
+ };
279
+ export {
280
+ Status,
281
+ Types,
282
+ ValidationException,
283
+ Validator
284
+ };
285
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/http/validatorTypes.ts","../../src/http/exceptions.ts","../../src/http/validador.ts","../../src/http/status.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\r\n Array,\r\n Struct,\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 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 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} 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 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\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\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\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};"],"mappings":"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","names":["Array"]}
package/dist/index.cjs CHANGED
@@ -28,14 +28,27 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
28
28
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
29
 
30
30
  // src/index.ts
31
- var index_exports = {};
32
- __export(index_exports, {
33
- QuickRouter: () => QuickRouter,
31
+ var src_exports = {};
32
+ __export(src_exports, {
33
+ QuikRouter: () => QuikRouter,
34
34
  Router: () => Router,
35
35
  Server: () => Server,
36
+ ServerInvalidRouteError: () => ServerInvalidRouteError,
36
37
  logger: () => logger
37
38
  });
38
- module.exports = __toCommonJS(index_exports);
39
+ module.exports = __toCommonJS(src_exports);
40
+
41
+ // src/core/errors/serverErrors.ts
42
+ var ServerInvalidRouteError = class extends Error {
43
+ constructor(path3) {
44
+ super(`"${path3}" is not a QuikRouter instance.`);
45
+ }
46
+ };
47
+ var ServerInvalidCronError = class extends Error {
48
+ constructor() {
49
+ super(`Invalid object, must be a QuikCron instance.`);
50
+ }
51
+ };
39
52
 
40
53
  // src/core/logger.ts
41
54
  var import_node_fs = __toESM(require("fs"), 1);
@@ -121,7 +134,11 @@ var en_default = {
121
134
  },
122
135
  server: {
123
136
  name: "server",
124
- start: "Server running at"
137
+ start: "Server running at",
138
+ routers_loaded: "routers loaded",
139
+ crons_loaded: "crons loaded",
140
+ static_loaded: "static dirs loaded",
141
+ static_warn: "directory does not exist"
125
142
  },
126
143
  time: {
127
144
  invalidTimeZone1: "Invalid time zone:",
@@ -142,7 +159,11 @@ var es_default = {
142
159
  },
143
160
  server: {
144
161
  name: "servidor",
145
- start: "Servidor corriendo en"
162
+ start: "Servidor corriendo en",
163
+ routers_loaded: "rutas cargadas",
164
+ crons_loaded: "crons cargados",
165
+ static_loaded: "carpetas estaticas cargadas",
166
+ static_warn: "no existe el directorio"
146
167
  },
147
168
  time: {
148
169
  invalidTimeZone1: "Zona horaria inv\xE1lida:",
@@ -327,6 +348,9 @@ var logger = {
327
348
  ...content
328
349
  );
329
350
  },
351
+ clear() {
352
+ console.clear();
353
+ },
330
354
  custom(level, color2, file, ...content) {
331
355
  write(level, color2, file, ...content);
332
356
  }
@@ -334,7 +358,7 @@ var logger = {
334
358
 
335
359
  // src/core/router.ts
336
360
  var import_express = require("express");
337
- var QuickRouter = class {
361
+ var QuikRouter = class {
338
362
  router;
339
363
  pendingMiddleware = [];
340
364
  currentPath = "";
@@ -345,8 +369,8 @@ var QuickRouter = class {
345
369
  this.pendingMiddleware.push(...handlers);
346
370
  return this;
347
371
  }
348
- path(path2) {
349
- this.currentPath = path2;
372
+ path(path3) {
373
+ this.currentPath = path3;
350
374
  return this;
351
375
  }
352
376
  register(method, handler) {
@@ -382,12 +406,20 @@ var QuickRouter = class {
382
406
  }
383
407
  };
384
408
  function Router() {
385
- return new QuickRouter();
409
+ return new QuikRouter();
386
410
  }
387
411
 
388
412
  // src/core/server.ts
389
413
  var import_express2 = __toESM(require("express"), 1);
390
414
  var import_node_http = __toESM(require("http"), 1);
415
+ var import_node_path2 = __toESM(require("path"), 1);
416
+ var import_node_fs2 = __toESM(require("fs"), 1);
417
+
418
+ // src/cron/cron.ts
419
+ var import_node_cron = __toESM(require("node-cron"), 1);
420
+ var import_node_cron2 = require("node-cron");
421
+
422
+ // src/core/server.ts
391
423
  var defaultConfig2 = {
392
424
  language: "en",
393
425
  bodyParser: {
@@ -400,55 +432,59 @@ var defaultConfig2 = {
400
432
  };
401
433
  var QuikServer = class {
402
434
  app;
403
- httpQuikServer;
435
+ httpServer;
404
436
  middlewares = [];
405
437
  routes = {};
406
- #config;
438
+ staticDirs = [];
439
+ crons = [];
440
+ config;
407
441
  constructor() {
408
442
  this.app = (0, import_express2.default)();
409
- this.#config = structuredClone(defaultConfig2);
410
- this.httpQuikServer = import_node_http.default.createServer(
443
+ this.config = structuredClone(defaultConfig2);
444
+ this.httpServer = import_node_http.default.createServer(
411
445
  this.app
412
446
  );
413
447
  }
414
- config() {
415
- return Object.freeze(structuredClone(this.#config));
416
- }
417
448
  setConfig(config2) {
418
- this.#config = {
419
- ...this.#config,
449
+ this.config = {
450
+ ...this.config,
420
451
  ...config2,
421
452
  http: {
422
- ...this.#config.http,
453
+ ...this.config.http,
423
454
  ...config2.http
424
455
  },
425
456
  express: {
426
- ...this.#config.express,
457
+ ...this.config.express,
427
458
  ...config2.express
428
459
  }
429
460
  };
430
461
  if (config2.timeZone && !isValidTimeZone(config2.timeZone)) {
431
- const messages = translate(this.#config.language, "time");
462
+ const messages = translate(this.config.language, "time");
432
463
  logger.warning(
433
464
  `${messages.invalidTimeZone1} ${config2.timeZone}. ${messages.invalidTimeZone2}`
434
465
  );
435
466
  }
436
467
  return this;
437
468
  }
438
- middleware(...middlewares) {
469
+ addMiddleware(...middlewares) {
439
470
  this.middlewares.push(
440
471
  ...middlewares
441
472
  );
442
473
  return this;
443
474
  }
444
- route(path2, router) {
445
- this.routes[path2] = router;
475
+ addRoute(path3, router) {
476
+ if (!(router instanceof QuikRouter)) {
477
+ throw new ServerInvalidRouteError(path3);
478
+ }
479
+ if (!path3.startsWith("/"))
480
+ path3 = "/" + path3;
481
+ this.routes[path3] = router;
446
482
  return this;
447
483
  }
448
- listen() {
449
- const { port, host } = this.#config.http;
450
- const messages = translate(this.#config.language, "server");
451
- this.httpQuikServer.listen(
484
+ #listen() {
485
+ const { port, host } = this.config.http;
486
+ const messages = translate(this.config.language, "server");
487
+ this.httpServer.listen(
452
488
  port,
453
489
  host,
454
490
  () => {
@@ -457,18 +493,39 @@ var QuikServer = class {
457
493
  );
458
494
  return this;
459
495
  }
496
+ addCron(cron2) {
497
+ if (cron2.constructor.name != "QuikCron") {
498
+ throw new ServerInvalidCronError();
499
+ }
500
+ this.crons.push(cron2);
501
+ return this;
502
+ }
503
+ addStaticDir(...paths) {
504
+ for (const i in paths) {
505
+ const dir = paths[i] ?? "";
506
+ const dirPath = import_node_path2.default.resolve(dir);
507
+ const exists = import_node_fs2.default.existsSync(dirPath);
508
+ if (!exists) {
509
+ const messages = translate(this.config.language, "server");
510
+ logger.warning(`[ STATIC ] "${dir}" ${messages.static_warn}`);
511
+ continue;
512
+ }
513
+ this.staticDirs.push(...paths);
514
+ }
515
+ return this;
516
+ }
460
517
  #configureHTTP() {
461
- const config2 = this.#config.http;
518
+ const config2 = this.config.http;
462
519
  if (config2.timeout)
463
- this.httpQuikServer.timeout = config2.timeout;
520
+ this.httpServer.timeout = config2.timeout;
464
521
  if (config2.keepAlive)
465
- this.httpQuikServer.keepAliveTimeout = config2.keepAlive;
522
+ this.httpServer.keepAliveTimeout = config2.keepAlive;
466
523
  if (config2.maxConnections)
467
- this.httpQuikServer.maxConnections = config2.maxConnections;
524
+ this.httpServer.maxConnections = config2.maxConnections;
468
525
  return this;
469
526
  }
470
527
  #configureExpress() {
471
- const config2 = this.#config.express;
528
+ const config2 = this.config.express;
472
529
  if (config2.trustProxy !== void 0) {
473
530
  this.app.set(
474
531
  "trust proxy",
@@ -478,7 +535,7 @@ var QuikServer = class {
478
535
  return this;
479
536
  }
480
537
  #configureMiddleware() {
481
- const bodyParser = this.#config.bodyParser;
538
+ const bodyParser = this.config.bodyParser;
482
539
  switch (bodyParser.type) {
483
540
  case "json":
484
541
  this.app.use(
@@ -506,34 +563,53 @@ var QuikServer = class {
506
563
  return this;
507
564
  }
508
565
  #configureRoutes() {
509
- for (const [path2, router] of Object.entries(this.routes)) {
566
+ for (const [path3, router] of Object.entries(this.routes)) {
510
567
  this.app.use(
511
- path2,
568
+ path3,
512
569
  router.router
513
570
  );
514
571
  }
572
+ const messages = translate(this.config.language, "server");
573
+ logger.info(`[ ROUTER ] ${Object.entries(this.routes).length} ${messages.routers_loaded}.`);
574
+ return this;
575
+ }
576
+ #loadCrons() {
577
+ for (const cron2 of this.crons) {
578
+ cron2.start();
579
+ }
580
+ const messages = translate(this.config.language, "server");
581
+ logger.info(`[ CRON ] ${this.crons.length} ${messages.crons_loaded}.`);
582
+ return this;
583
+ }
584
+ #loadStaticDirs() {
585
+ for (const dir of this.staticDirs) {
586
+ const dirPath = import_node_path2.default.resolve(dir);
587
+ this.app.use(import_express2.default.static(dirPath));
588
+ }
589
+ const messages = translate(this.config.language, "server");
590
+ logger.info(`[ STATIC ] ${this.staticDirs.length} ${messages.static_loaded}.`);
515
591
  return this;
516
592
  }
517
593
  start() {
518
594
  this.#configureExpress();
519
595
  this.#configureMiddleware();
596
+ this.#loadStaticDirs();
520
597
  this.#configureRoutes();
598
+ this.#loadCrons();
521
599
  this.#configureHTTP();
522
- this.listen();
600
+ this.#listen();
523
601
  return this;
524
602
  }
525
603
  };
526
604
  function Server() {
527
605
  return new QuikServer();
528
606
  }
529
-
530
- // src/cron/cron.ts
531
- var import_node_cron = __toESM(require("node-cron"), 1);
532
607
  // Annotate the CommonJS export names for ESM import in node:
533
608
  0 && (module.exports = {
534
- QuickRouter,
609
+ QuikRouter,
535
610
  Router,
536
611
  Server,
612
+ ServerInvalidRouteError,
537
613
  logger
538
614
  });
539
615
  //# sourceMappingURL=index.cjs.map