@desaubv/quik 0.0.7 → 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.
- package/dist/cron/index.cjs.map +1 -1
- package/dist/cron/index.js.map +1 -1
- package/dist/http/index.cjs +218 -2
- package/dist/http/index.cjs.map +1 -1
- package/dist/http/index.d.cts +57 -1
- package/dist/http/index.d.ts +57 -1
- package/dist/http/index.js +214 -1
- package/dist/http/index.js.map +1 -1
- package/dist/index.cjs +45 -14
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +2 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +45 -14
- package/dist/index.js.map +1 -1
- package/package.json +69 -63
package/dist/http/index.js
CHANGED
|
@@ -1,3 +1,213 @@
|
|
|
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
|
+
|
|
1
211
|
// src/http/status.ts
|
|
2
212
|
var Status = {
|
|
3
213
|
// 1xx Informational
|
|
@@ -67,6 +277,9 @@ var Status = {
|
|
|
67
277
|
NETWORK_AUTHENTICATION_REQUIRED: 511
|
|
68
278
|
};
|
|
69
279
|
export {
|
|
70
|
-
Status
|
|
280
|
+
Status,
|
|
281
|
+
Types,
|
|
282
|
+
ValidationException,
|
|
283
|
+
Validator
|
|
71
284
|
};
|
|
72
285
|
//# sourceMappingURL=index.js.map
|
package/dist/http/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/http/status.ts"],"sourcesContent":["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":";AAAA,IAAM,SAAS;AAAA;AAAA,EAEX,UAAU;AAAA,EACV,qBAAqB;AAAA,EACrB,YAAY;AAAA,EACZ,aAAa;AAAA;AAAA,EAGb,IAAI;AAAA,EACJ,SAAS;AAAA,EACT,UAAU;AAAA,EACV,+BAA+B;AAAA,EAC/B,YAAY;AAAA,EACZ,eAAe;AAAA,EACf,iBAAiB;AAAA,EACjB,cAAc;AAAA,EACd,kBAAkB;AAAA,EAClB,SAAS;AAAA;AAAA,EAGT,kBAAkB;AAAA,EAClB,mBAAmB;AAAA,EACnB,OAAO;AAAA,EACP,WAAW;AAAA,EACX,cAAc;AAAA,EACd,oBAAoB;AAAA,EACpB,oBAAoB;AAAA;AAAA,EAGpB,aAAa;AAAA,EACb,cAAc;AAAA,EACd,kBAAkB;AAAA,EAClB,WAAW;AAAA,EACX,WAAW;AAAA,EACX,oBAAoB;AAAA,EACpB,gBAAgB;AAAA,EAChB,+BAA+B;AAAA,EAC/B,iBAAiB;AAAA,EACjB,UAAU;AAAA,EACV,MAAM;AAAA,EACN,iBAAiB;AAAA,EACjB,qBAAqB;AAAA,EACrB,mBAAmB;AAAA,EACnB,cAAc;AAAA,EACd,wBAAwB;AAAA,EACxB,uBAAuB;AAAA,EACvB,oBAAoB;AAAA,EACpB,aAAa;AAAA,EACb,qBAAqB;AAAA,EACrB,uBAAuB;AAAA,EACvB,QAAQ;AAAA,EACR,mBAAmB;AAAA,EACnB,kBAAkB;AAAA,EAClB,uBAAuB;AAAA,EACvB,mBAAmB;AAAA,EACnB,iCAAiC;AAAA,EACjC,+BAA+B;AAAA;AAAA,EAG/B,uBAAuB;AAAA,EACvB,iBAAiB;AAAA,EACjB,aAAa;AAAA,EACb,qBAAqB;AAAA,EACrB,iBAAiB;AAAA,EACjB,4BAA4B;AAAA,EAC5B,yBAAyB;AAAA,EACzB,sBAAsB;AAAA,EACtB,eAAe;AAAA,EACf,cAAc;AAAA,EACd,iCAAiC;AACrC;","names":[]}
|
|
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
|
@@ -38,10 +38,10 @@ __export(src_exports, {
|
|
|
38
38
|
});
|
|
39
39
|
module.exports = __toCommonJS(src_exports);
|
|
40
40
|
|
|
41
|
-
// src/errors/
|
|
41
|
+
// src/core/errors/serverErrors.ts
|
|
42
42
|
var ServerInvalidRouteError = class extends Error {
|
|
43
|
-
constructor(
|
|
44
|
-
super(`"${
|
|
43
|
+
constructor(path3) {
|
|
44
|
+
super(`"${path3}" is not a QuikRouter instance.`);
|
|
45
45
|
}
|
|
46
46
|
};
|
|
47
47
|
var ServerInvalidCronError = class extends Error {
|
|
@@ -136,7 +136,9 @@ var en_default = {
|
|
|
136
136
|
name: "server",
|
|
137
137
|
start: "Server running at",
|
|
138
138
|
routers_loaded: "routers loaded",
|
|
139
|
-
crons_loaded: "crons loaded"
|
|
139
|
+
crons_loaded: "crons loaded",
|
|
140
|
+
static_loaded: "static dirs loaded",
|
|
141
|
+
static_warn: "directory does not exist"
|
|
140
142
|
},
|
|
141
143
|
time: {
|
|
142
144
|
invalidTimeZone1: "Invalid time zone:",
|
|
@@ -159,7 +161,9 @@ var es_default = {
|
|
|
159
161
|
name: "servidor",
|
|
160
162
|
start: "Servidor corriendo en",
|
|
161
163
|
routers_loaded: "rutas cargadas",
|
|
162
|
-
crons_loaded: "crons cargados"
|
|
164
|
+
crons_loaded: "crons cargados",
|
|
165
|
+
static_loaded: "carpetas estaticas cargadas",
|
|
166
|
+
static_warn: "no existe el directorio"
|
|
163
167
|
},
|
|
164
168
|
time: {
|
|
165
169
|
invalidTimeZone1: "Zona horaria inv\xE1lida:",
|
|
@@ -365,8 +369,8 @@ var QuikRouter = class {
|
|
|
365
369
|
this.pendingMiddleware.push(...handlers);
|
|
366
370
|
return this;
|
|
367
371
|
}
|
|
368
|
-
path(
|
|
369
|
-
this.currentPath =
|
|
372
|
+
path(path3) {
|
|
373
|
+
this.currentPath = path3;
|
|
370
374
|
return this;
|
|
371
375
|
}
|
|
372
376
|
register(method, handler) {
|
|
@@ -408,6 +412,8 @@ function Router() {
|
|
|
408
412
|
// src/core/server.ts
|
|
409
413
|
var import_express2 = __toESM(require("express"), 1);
|
|
410
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);
|
|
411
417
|
|
|
412
418
|
// src/cron/cron.ts
|
|
413
419
|
var import_node_cron = __toESM(require("node-cron"), 1);
|
|
@@ -429,6 +435,7 @@ var QuikServer = class {
|
|
|
429
435
|
httpServer;
|
|
430
436
|
middlewares = [];
|
|
431
437
|
routes = {};
|
|
438
|
+
staticDirs = [];
|
|
432
439
|
crons = [];
|
|
433
440
|
config;
|
|
434
441
|
constructor() {
|
|
@@ -465,13 +472,13 @@ var QuikServer = class {
|
|
|
465
472
|
);
|
|
466
473
|
return this;
|
|
467
474
|
}
|
|
468
|
-
addRoute(
|
|
475
|
+
addRoute(path3, router) {
|
|
469
476
|
if (!(router instanceof QuikRouter)) {
|
|
470
|
-
throw new ServerInvalidRouteError(
|
|
477
|
+
throw new ServerInvalidRouteError(path3);
|
|
471
478
|
}
|
|
472
|
-
if (!
|
|
473
|
-
|
|
474
|
-
this.routes[
|
|
479
|
+
if (!path3.startsWith("/"))
|
|
480
|
+
path3 = "/" + path3;
|
|
481
|
+
this.routes[path3] = router;
|
|
475
482
|
return this;
|
|
476
483
|
}
|
|
477
484
|
#listen() {
|
|
@@ -493,6 +500,20 @@ var QuikServer = class {
|
|
|
493
500
|
this.crons.push(cron2);
|
|
494
501
|
return this;
|
|
495
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
|
+
}
|
|
496
517
|
#configureHTTP() {
|
|
497
518
|
const config2 = this.config.http;
|
|
498
519
|
if (config2.timeout)
|
|
@@ -542,9 +563,9 @@ var QuikServer = class {
|
|
|
542
563
|
return this;
|
|
543
564
|
}
|
|
544
565
|
#configureRoutes() {
|
|
545
|
-
for (const [
|
|
566
|
+
for (const [path3, router] of Object.entries(this.routes)) {
|
|
546
567
|
this.app.use(
|
|
547
|
-
|
|
568
|
+
path3,
|
|
548
569
|
router.router
|
|
549
570
|
);
|
|
550
571
|
}
|
|
@@ -560,9 +581,19 @@ var QuikServer = class {
|
|
|
560
581
|
logger.info(`[ CRON ] ${this.crons.length} ${messages.crons_loaded}.`);
|
|
561
582
|
return this;
|
|
562
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}.`);
|
|
591
|
+
return this;
|
|
592
|
+
}
|
|
563
593
|
start() {
|
|
564
594
|
this.#configureExpress();
|
|
565
595
|
this.#configureMiddleware();
|
|
596
|
+
this.#loadStaticDirs();
|
|
566
597
|
this.#configureRoutes();
|
|
567
598
|
this.#loadCrons();
|
|
568
599
|
this.#configureHTTP();
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/errors/serverError.ts","../src/core/logger.ts","../src/core/colors.ts","../src/core/time.ts","../src/locales/en.json","../src/locales/es.json","../src/core/translator.ts","../src/core/router.ts","../src/core/server.ts","../src/cron/cron.ts"],"sourcesContent":["export { ServerInvalidRouteError } from \"./errors/serverError.js\";\r\nexport { logger } from \"./core/logger.js\";\r\nexport { Router, QuikRouter } from \"./core/router.js\";\r\nexport { Server } from \"./core/server.js\";\r\n","class ServerInvalidRouteError extends Error {\r\n constructor(path: string) {\r\n super(`\"${path}\" is not a QuikRouter instance.`);\r\n }\r\n}\r\n\r\nclass ServerInvalidCronError extends Error {\r\n constructor() {\r\n super(`Invalid object, must be a QuikCron instance.`);\r\n }\r\n}\r\n\r\nexport { ServerInvalidRouteError, ServerInvalidCronError }","import fs from \"node:fs\"\r\nimport path from \"node:path\";\r\n\r\nimport { colors } from \"./colors.js\"\r\nimport { dateToString, isValidTimeZone } from \"./time.js\";\r\nimport { translate } from \"./translator.js\";\r\n\r\n/* Types */\r\ntype ConfigValue = string | null | false;\r\ntype Cases = \"uppercase\" | \"lowercase\" | \"capitalize\" | \"none\" | null;\r\ntype ColorName =\r\n | \"black\"\r\n | \"red\"\r\n | \"green\"\r\n | \"yellow\"\r\n | \"blue\"\r\n | \"magenta\"\r\n | \"cyan\"\r\n | \"white\";\r\n\r\ntype ColorValue = ColorName | null;\r\ntype SaveConfig = {\r\n infoFilePath: ConfigValue,\r\n logFilePath: ConfigValue,\r\n errorFilePath: ConfigValue,\r\n warningFilePath: ConfigValue,\r\n}\r\ntype ColorConfig = {\r\n logColor: ColorValue;\r\n infoColor: ColorValue;\r\n errorColor: ColorValue;\r\n warningColor: ColorValue;\r\n debugColor: ColorValue;\r\n}\r\ntype Formatconfig = {\r\n timestampFormat: ConfigValue,\r\n titleCase: Cases,\r\n prefix?: string\r\n suffix?: string\r\n timeZone?: string\r\n}\r\n\r\ntype LoggerConfig = {\r\n language: Language,\r\n save: SaveConfig,\r\n color: ColorConfig,\r\n format: Formatconfig,\r\n}\r\ntype PartialConfig = Partial<{\r\n save: Partial<SaveConfig>;\r\n color: Partial<ColorConfig>;\r\n format: Partial<Formatconfig>;\r\n}>;\r\n\r\nconst defaultConfig: LoggerConfig = {\r\n language: \"en\",\r\n save: {\r\n logFilePath: null,\r\n infoFilePath: null,\r\n errorFilePath: \"logs/error.log\",\r\n warningFilePath: \"logs/warning.log\",\r\n },\r\n color: {\r\n logColor: \"blue\",\r\n infoColor: \"green\",\r\n errorColor: \"red\",\r\n warningColor: \"yellow\",\r\n debugColor: null\r\n },\r\n format: {\r\n timestampFormat: \"DD-MM-YYYY hh:mm:ss\",\r\n titleCase: \"uppercase\"\r\n }\r\n}\r\n\r\nlet config = structuredClone(defaultConfig);\r\n\r\nfunction tokenize(...args: unknown[]): string[] {\r\n return args.map(arg => {\r\n if (typeof arg === \"string\") return arg;\r\n\r\n if (arg instanceof Error) {\r\n return arg.stack ?? arg.message;\r\n }\r\n\r\n if (arg === null || arg === undefined) {\r\n return String(arg);\r\n }\r\n\r\n if (typeof arg === \"object\") {\r\n try {\r\n return JSON.stringify(arg);\r\n } catch {\r\n return \"[Circular]\";\r\n }\r\n }\r\n\r\n return String(arg);\r\n });\r\n}\r\n\r\nfunction write(\r\n level: string,\r\n color: ColorName | null | false,\r\n file: ConfigValue,\r\n ...content: unknown[]\r\n) {\r\n const [header, body] = parseContent(level, ...content);\r\n saveToFile(file, header + body);\r\n\r\n const prefix = config.format.prefix ?? \"\";\r\n const suffix = config.format.suffix ?? \"\";\r\n\r\n if (color) {\r\n const colorFn = colors[color] ?? ((s: string) => s);\r\n console.log(`${prefix}${header}${colorFn(body)}${suffix}`);\r\n } else {\r\n console.log(`${prefix}${header}${body}${suffix}`);\r\n }\r\n}\r\n\r\nfunction parseContent(level: string, ...body: unknown[]): [string, string] {\r\n let header = \"\";\r\n if (config.format.timestampFormat) {\r\n const now = new Date();\r\n const timeZone = config.format.timeZone;\r\n let tz = timeZone;\r\n\r\n if (timeZone && !isValidTimeZone(timeZone)) {\r\n tz = undefined;\r\n }\r\n\r\n const timestamp = dateToString(\r\n now,\r\n config.format.timestampFormat,\r\n tz\r\n );\r\n\r\n header += `${timestamp} `;\r\n }\r\n\r\n switch (config.format.titleCase) {\r\n case \"uppercase\":\r\n level = `[${level.toUpperCase()}] `;\r\n break;\r\n case \"lowercase\":\r\n level = `[${level.toLocaleLowerCase()}] `;\r\n break;\r\n case \"capitalize\":\r\n level = `[${level.charAt(0).toUpperCase() + level.slice(1).toLowerCase()}] `;\r\n break;\r\n case \"none\":\r\n level = `[${level}] `;\r\n break;\r\n default:\r\n level = \"\";\r\n break;\r\n }\r\n let content = level + tokenize(...body).join(\" \");\r\n return [header, content];\r\n}\r\n\r\nfunction saveToFile(filePath: ConfigValue, content: string): void {\r\n if (!filePath || !content.length) return;\r\n\r\n const dir = path.dirname(filePath);\r\n const logMessage = content + \"\\n\";\r\n\r\n fs.mkdirSync(dir, { recursive: true });\r\n fs.appendFileSync(filePath, logMessage);\r\n}\r\n\r\nfunction mergeConfig(\r\n current: LoggerConfig,\r\n update: PartialConfig\r\n): LoggerConfig {\r\n return {\r\n ...current,\r\n ...update,\r\n save: {\r\n ...current.save,\r\n ...update.save,\r\n },\r\n color: {\r\n ...current.color,\r\n ...update.color,\r\n },\r\n format: {\r\n ...current.format,\r\n ...update.format,\r\n },\r\n };\r\n}\r\n\r\nexport const logger = {\r\n // Setter config\r\n setConfig(newConfig: PartialConfig): void {\r\n config = mergeConfig(config, newConfig);\r\n },\r\n\r\n // Getter config\r\n config(): Readonly<LoggerConfig> {\r\n return Object.freeze(structuredClone(config));\r\n },\r\n\r\n log(...content: unknown[]) {\r\n const messages = translate(config.language, \"logger\");\r\n write(\r\n messages.levels.log,\r\n config.color.logColor,\r\n config.save.logFilePath,\r\n ...content\r\n );\r\n },\r\n\r\n info(...content: unknown[]) {\r\n const messages = translate(config.language, \"logger\");\r\n write(\r\n messages.levels.info,\r\n config.color.infoColor,\r\n config.save.infoFilePath,\r\n ...content\r\n );\r\n },\r\n\r\n error(...content: unknown[]) {\r\n const messages = translate(config.language, \"logger\");\r\n write(\r\n messages.levels.error,\r\n config.color.errorColor,\r\n config.save.errorFilePath,\r\n ...content\r\n );\r\n },\r\n\r\n warning(...content: unknown[]) {\r\n const messages = translate(config.language, \"logger\");\r\n write(\r\n messages.levels.warning,\r\n config.color.warningColor,\r\n config.save.warningFilePath,\r\n ...content\r\n );\r\n },\r\n\r\n debug(...content: unknown[]) {\r\n const messages = translate(config.language, \"logger\");\r\n write(\r\n messages.levels.debug,\r\n config.color.debugColor,\r\n null,\r\n ...content\r\n );\r\n },\r\n\r\n clear() {\r\n console.clear();\r\n },\r\n\r\n custom(\r\n level: string,\r\n color: ColorName | null | false,\r\n file: ConfigValue,\r\n ...content: unknown[]\r\n ) {\r\n write(level, color, file, ...content);\r\n }\r\n}","const color = {\r\n reset: \"\\x1b[0m\",\r\n\r\n black: \"\\x1b[30m\",\r\n red: \"\\x1b[31m\",\r\n green: \"\\x1b[32m\",\r\n yellow: \"\\x1b[33m\",\r\n blue: \"\\x1b[34m\",\r\n magenta: \"\\x1b[35m\",\r\n cyan: \"\\x1b[36m\",\r\n white: \"\\x1b[37m\",\r\n\r\n bold: \"\\x1b[1m\",\r\n underline: \"\\x1b[4m\"\r\n} as const;\r\n\r\n\r\ntype Color = keyof Omit<typeof color, \"reset\">;\r\nconst colors = Object.fromEntries(\r\n Object.entries(color)\r\n .filter(([key]) => key !== \"reset\")\r\n .map(([key, value]) => [\r\n key,\r\n (text: string) => `${value}${text}${color.reset}`\r\n ])\r\n) as Record<Color, (text: string) => string>;\r\n\r\nexport { color, colors };","function dateToString(date: Date, format: string, timeZone?: string): string {\r\n const formatter = new Intl.DateTimeFormat(\"en-US\", {\r\n timeZone,\r\n year: \"numeric\",\r\n month: \"2-digit\",\r\n day: \"2-digit\",\r\n hour: \"2-digit\",\r\n minute: \"2-digit\",\r\n second: \"2-digit\",\r\n hourCycle: \"h23\",\r\n });\r\n\r\n const parts = formatter.formatToParts(date);\r\n const values = Object.fromEntries(\r\n parts\r\n .filter(({ type }) => type !== \"literal\")\r\n .map(({ type, value }) => [type, value])\r\n );\r\n\r\n return format.replace(/(YYYY|MM|DD|hh|mm|ss)/g, (match): string => {\r\n switch (match) {\r\n case \"YYYY\":\r\n return values.year || \"\";\r\n case \"MM\":\r\n return values.month || \"\";\r\n case \"DD\":\r\n return values.day || \"\";\r\n case \"hh\":\r\n return values.hour || \"\";\r\n case \"mm\":\r\n return values.minute || \"\";\r\n case \"ss\":\r\n return values.second || \"\";\r\n default:\r\n return match;\r\n }\r\n });\r\n}\r\n\r\nfunction isValidTimeZone(timeZone: string): boolean {\r\n try {\r\n new Intl.DateTimeFormat(\"en-US\", {\r\n timeZone,\r\n });\r\n\r\n return true;\r\n } catch {\r\n return false;\r\n }\r\n}\r\n\r\nexport { dateToString, isValidTimeZone };\r\n","{\r\n \"logger\": {\r\n \"levels\": {\r\n \"log\": \"log\",\r\n \"info\": \"info\",\r\n \"warning\": \"warning\",\r\n \"error\": \"error\",\r\n \"debug\": \"debug\"\r\n }\r\n },\r\n \"server\": {\r\n \"name\": \"server\",\r\n \"start\": \"Server running at\",\r\n \"routers_loaded\": \"routers loaded\",\r\n \"crons_loaded\": \"crons loaded\"\r\n },\r\n \"time\": {\r\n \"invalidTimeZone1\": \"Invalid time zone:\",\r\n \"invalidTimeZone2\": \"Using system default time zone.\"\r\n }\r\n}","{\r\n \"logger\": {\r\n \"levels\": {\r\n \"log\": \"log\",\r\n \"info\": \"info\",\r\n \"warning\": \"advertencia\",\r\n \"error\": \"error\",\r\n \"debug\": \"depuración\"\r\n }\r\n },\r\n \"server\": {\r\n \"name\": \"servidor\",\r\n \"start\": \"Servidor corriendo en\",\r\n \"routers_loaded\": \"rutas cargadas\",\r\n \"crons_loaded\": \"crons cargados\"\r\n },\r\n \"time\": {\r\n \"invalidTimeZone1\": \"Zona horaria inválida:\",\r\n \"invalidTimeZone2\": \"Usando la zona horaria predeterminada del sistema.\"\r\n }\r\n}","import en from \"../locales/en.json\" with { type: \"json\" };\r\nimport es from \"../locales/es.json\" with { type: \"json\" };\r\n\r\ntype Locale = typeof en;\r\n\r\nconst locales = {\r\n en,\r\n es,\r\n} satisfies Record<string, Locale>;\r\n\r\ntype Language = keyof typeof locales;\r\ntype TranslationKey = keyof Locale;\r\n\r\nfunction translate<K extends TranslationKey>(\r\n language: Language,\r\n key: K\r\n): Locale[K] {\r\n return locales[language][key];\r\n}\r\n\r\nexport {\r\n translate,\r\n};\r\n","import type { RequestHandler, Router as RouterType } from \"express\";\r\nimport { Router as ExpressRouter } from \"express\";\r\n\r\ntype HttpMethod =\r\n | \"get\"\r\n | \"post\"\r\n | \"put\"\r\n | \"patch\"\r\n | \"delete\"\r\n | \"options\"\r\n | \"head\"\r\n | \"all\";\r\n\r\nclass QuikRouter {\r\n readonly router: RouterType;\r\n private pendingMiddleware: RequestHandler[] = [];\r\n private currentPath: string = \"\";\r\n\r\n constructor() {\r\n this.router = ExpressRouter();\r\n }\r\n\r\n middleware(...handlers: RequestHandler[]) {\r\n this.pendingMiddleware.push(...handlers);\r\n return this;\r\n }\r\n\r\n path(path: string) {\r\n this.currentPath = path;\r\n return this;\r\n }\r\n\r\n private register (\r\n method: HttpMethod,\r\n handler: RequestHandler\r\n ) {\r\n this.router[method](\r\n this.currentPath,\r\n ...this.pendingMiddleware,\r\n async (req, res, next) => {\r\n try {\r\n await handler(req, res, next);\r\n } catch (err) {\r\n next(err);\r\n }\r\n }\r\n );\r\n\r\n this.pendingMiddleware = [];\r\n this.currentPath = \"\";\r\n\r\n return this;\r\n }\r\n\r\n get(handler: RequestHandler) {\r\n return this.register(\"get\", handler);\r\n }\r\n\r\n post(handler: RequestHandler) {\r\n return this.register(\"post\", handler);\r\n }\r\n\r\n put(handler: RequestHandler) {\r\n return this.register(\"put\", handler);\r\n }\r\n\r\n patch(handler: RequestHandler) {\r\n return this.register(\"patch\", handler);\r\n }\r\n\r\n delete(handler: RequestHandler) {\r\n return this.register(\"delete\", handler);\r\n }\r\n \r\n}\r\n\r\nfunction Router() {\r\n return new QuikRouter;\r\n}\r\n\r\nexport { QuikRouter, Router };","import express, { type Express, type RequestHandler } from \"express\";\r\nimport http, { type Server as HTTPServer } from \"node:http\";\r\n\r\nimport { QuikRouter } from \"./router.js\";\r\nimport { logger } from \"./logger.js\";\r\nimport { translate } from \"./translator.js\";\r\nimport { isValidTimeZone } from \"./time.js\";\r\nimport { QuikCron } from \"../cron/cron.js\";\r\nimport { ServerInvalidCronError, ServerInvalidRouteError } from \"../errors/serverError.js\";\r\n\r\ntype JsonOptions = Parameters<typeof express.json>[0];\r\ntype UrlencodedOptions = Parameters<typeof express.urlencoded>[0];\r\ntype RawOptions = Parameters<typeof express.raw>[0];\r\ntype TextOptions = Parameters<typeof express.text>[0];\r\ntype BodyParserConfig =\r\n | {\r\n type: \"json\";\r\n options?: JsonOptions;\r\n }\r\n | {\r\n type: \"urlencoded\";\r\n options?: UrlencodedOptions;\r\n }\r\n | {\r\n type: \"raw\";\r\n options?: RawOptions;\r\n }\r\n | {\r\n type: \"text\";\r\n options?: TextOptions;\r\n };\r\ntype HTTPConfig = {\r\n port: number;\r\n host?: string;\r\n\r\n keepAlive?: number;\r\n timeout?: number;\r\n maxConnections?: number;\r\n shutdownTimeout?: number;\r\n};\r\ntype ExpressConfig = {\r\n trustProxy?: boolean;\r\n};\r\ntype QuikServerConfig = {\r\n language: Language,\r\n timeZone?: string;\r\n bodyParser: BodyParserConfig;\r\n http: HTTPConfig;\r\n express: ExpressConfig;\r\n};\r\ntype RoutingDict = Record<string, QuikRouter>;\r\n\r\nconst defaultConfig: QuikServerConfig = {\r\n language: \"en\",\r\n bodyParser: {\r\n type: \"json\"\r\n },\r\n\r\n http: {\r\n port: 8080\r\n },\r\n\r\n express: {}\r\n}\r\n\r\nclass QuikServer {\r\n app: Express;\r\n httpServer: HTTPServer;\r\n middlewares: RequestHandler[] = [];\r\n routes: RoutingDict = {};\r\n crons: QuikCron[] = [];\r\n config: QuikServerConfig;\r\n\r\n constructor() {\r\n this.app = express();\r\n this.config = structuredClone(defaultConfig);\r\n this.httpServer = http.createServer(\r\n this.app\r\n );\r\n }\r\n\r\n\r\n setConfig(config: Partial<QuikServerConfig>) {\r\n this.config = {\r\n ...this.config,\r\n ...config,\r\n http: {\r\n ...this.config.http,\r\n ...config.http\r\n },\r\n express: {\r\n ...this.config.express,\r\n ...config.express\r\n }\r\n };\r\n\r\n // Notify if the provided time zone is invalid\r\n if (config.timeZone && !isValidTimeZone(config.timeZone)) {\r\n const messages = translate(this.config.language, \"time\");\r\n\r\n logger.warning(\r\n `${messages.invalidTimeZone1} ${config.timeZone}. ${messages.invalidTimeZone2}`\r\n );\r\n }\r\n\r\n return this;\r\n }\r\n\r\n addMiddleware(...middlewares: RequestHandler[]) {\r\n this.middlewares.push(\r\n ...middlewares\r\n );\r\n\r\n return this;\r\n }\r\n\r\n addRoute(path: string, router: QuikRouter) {\r\n if(!(router instanceof QuikRouter)){\r\n throw new ServerInvalidRouteError(path)\r\n }\r\n\r\n if(!path.startsWith(\"/\"))\r\n path = \"/\" + path;\r\n\r\n this.routes[path] = router;\r\n \r\n return this;\r\n }\r\n\r\n\r\n #listen() {\r\n const { port, host } = this.config.http;\r\n const messages = translate(this.config.language, \"server\");\r\n\r\n this.httpServer.listen(port, host, () => {\r\n logger.info(`${messages.start} ${host ?? \"localhost\"}:${port}`);\r\n }\r\n );\r\n\r\n return this;\r\n }\r\n\r\n addCron(cron: QuikCron) { \r\n if(cron.constructor.name != \"QuikCron\"){\r\n throw new ServerInvalidCronError()\r\n }\r\n this.crons.push(cron);\r\n\r\n return this;\r\n }\r\n\r\n #configureHTTP() {\r\n const config = this.config.http;\r\n\r\n if (config.timeout)\r\n this.httpServer.timeout = config.timeout;\r\n\r\n if (config.keepAlive)\r\n this.httpServer.keepAliveTimeout = config.keepAlive;\r\n\r\n if (config.maxConnections)\r\n this.httpServer.maxConnections = config.maxConnections;\r\n\r\n return this;\r\n }\r\n\r\n #configureExpress() {\r\n const config = this.config.express;\r\n\r\n if (config.trustProxy !== undefined) {\r\n this.app.set(\r\n \"trust proxy\",\r\n config.trustProxy\r\n );\r\n\r\n }\r\n\r\n return this;\r\n }\r\n\r\n #configureMiddleware() {\r\n const bodyParser = this.config.bodyParser;\r\n\r\n switch (bodyParser.type) {\r\n case \"json\":\r\n this.app.use(\r\n express.json(bodyParser.options)\r\n );\r\n break;\r\n\r\n\r\n case \"urlencoded\":\r\n this.app.use(\r\n express.urlencoded(bodyParser.options)\r\n );\r\n break;\r\n\r\n\r\n case \"raw\":\r\n this.app.use(\r\n express.raw(bodyParser.options)\r\n );\r\n break;\r\n\r\n\r\n case \"text\":\r\n this.app.use(\r\n express.text(bodyParser.options)\r\n );\r\n break;\r\n\r\n }\r\n\r\n if (this.middlewares.length > 0)\r\n this.app.use(...this.middlewares);\r\n\r\n return this;\r\n }\r\n\r\n\r\n #configureRoutes() {\r\n for (const [path, router] of Object.entries(this.routes)) {\r\n this.app.use(\r\n path,\r\n router.router\r\n );\r\n }\r\n const messages = translate(this.config.language, \"server\");\r\n logger.info(`[ ROUTER ] ${Object.entries(this.routes).length} ${messages.routers_loaded}.`);\r\n return this;\r\n }\r\n\r\n #loadCrons() {\r\n for (const cron of this.crons) {\r\n cron.start();\r\n }\r\n \r\n const messages = translate(this.config.language, \"server\")\r\n logger.info(`[ CRON ] ${this.crons.length} ${messages.crons_loaded}.`)\r\n\r\n return this;\r\n }\r\n\r\n start() {\r\n this.#configureExpress();\r\n this.#configureMiddleware();\r\n this.#configureRoutes();\r\n this.#loadCrons();\r\n\r\n this.#configureHTTP();\r\n\r\n this.#listen();\r\n return this;\r\n }\r\n}\r\n\r\nfunction Server() {\r\n return new QuikServer();\r\n}\r\n\r\nexport {\r\n Server\r\n};\r\n","import cron from \"node-cron\";\r\nimport { type ScheduledTask } from \"node-cron\";\r\n\r\nimport {\r\n CronTaskAlreadyExistsError,\r\n CronInvalidScheduleError,\r\n CronInvalidTimeZoneError,\r\n CronTaskExecutionError,\r\n} from \"./exceptions.js\";\r\n\r\nimport { isValidTimeZone } from \"../core/time.js\";\r\nimport type { CronConfig, CronTask, PartialCronConfig } from \"./types.js\";\r\n\r\n// Default configuration \r\nconst defaultConfig: CronConfig = {\r\n language: \"en\",\r\n};\r\n\r\n// Cron Class\r\nclass QuikCron {\r\n private tasks = new Map<string, CronTask>();\r\n private jobs = new Map<string, ScheduledTask>();\r\n\r\n #config: CronConfig = structuredClone(defaultConfig);\r\n\r\n constructor() {\r\n \r\n }\r\n\r\n add(task: CronTask): void {\r\n if (this.tasks.has(task.name)) {\r\n throw new CronTaskAlreadyExistsError(\r\n task.name\r\n );\r\n }\r\n\r\n if (!cron.validate(task.schedule)) {\r\n throw new CronInvalidScheduleError(\r\n task.schedule\r\n );\r\n }\r\n\r\n if (\r\n task.timezone &&\r\n !isValidTimeZone(task.timezone)\r\n ) {\r\n throw new CronInvalidTimeZoneError(\r\n task.timezone\r\n );\r\n }\r\n\r\n this.tasks.set(task.name, {\r\n ...task,\r\n });\r\n }\r\n\r\n remove(name: string): boolean {\r\n this.jobs.get(name)?.stop();\r\n this.jobs.delete(name);\r\n\r\n return this.tasks.delete(name);\r\n }\r\n\r\n has(name: string): boolean {\r\n return this.tasks.has(name);\r\n }\r\n\r\n get(name: string): CronTask | undefined {\r\n return this.tasks.get(name);\r\n }\r\n\r\n getTasks(): CronTask[] {\r\n return [...this.tasks.values()];\r\n }\r\n\r\n start(): void {\r\n for (const task of this.tasks.values()) {\r\n if (this.jobs.has(task.name)) {\r\n continue;\r\n }\r\n\r\n const timezone =\r\n task.timezone ?? this.#config.timeZone;\r\n\r\n const options = timezone\r\n ? { timezone }\r\n : {};\r\n\r\n const job = cron.schedule(\r\n task.schedule,\r\n async () => {\r\n try {\r\n await task.task();\r\n } catch (error) {\r\n const exception =\r\n new CronTaskExecutionError(\r\n task.name,\r\n error\r\n );\r\n\r\n this.#config.onError?.(exception);\r\n }\r\n },\r\n options\r\n );\r\n\r\n this.jobs.set(task.name, job);\r\n }\r\n }\r\n\r\n stop(): void {\r\n for (const job of this.jobs.values()) {\r\n job.stop();\r\n }\r\n\r\n this.jobs.clear();\r\n }\r\n\r\n config(): Readonly<CronConfig> {\r\n return Object.freeze(\r\n structuredClone(this.#config)\r\n );\r\n }\r\n\r\n setConfig(config: PartialCronConfig): void {\r\n if (\r\n config.timeZone &&\r\n !isValidTimeZone(config.timeZone)\r\n ) {\r\n throw new CronInvalidTimeZoneError(\r\n config.timeZone\r\n );\r\n }\r\n\r\n this.#config = {\r\n ...this.#config,\r\n ...config,\r\n };\r\n }\r\n}\r\n\r\nfunction Cron(): QuikCron {\r\n return new QuikCron();\r\n}\r\n\r\nexport { QuikCron, Cron };\r\n"],"mappings":"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","names":["path","color","path","fs","ExpressRouter","path","import_express","import_node_cron","defaultConfig","express","http","config","path","cron"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/core/errors/serverErrors.ts","../src/core/logger.ts","../src/core/colors.ts","../src/core/time.ts","../src/locales/en.json","../src/locales/es.json","../src/core/translator.ts","../src/core/router.ts","../src/core/server.ts","../src/cron/cron.ts"],"sourcesContent":["export { ServerInvalidRouteError } from \"./core/errors/serverErrors.js\";\r\nexport { logger } from \"./core/logger.js\";\r\nexport { Router, QuikRouter } from \"./core/router.js\";\r\nexport { Server } from \"./core/server.js\";\r\n","class ServerInvalidRouteError extends Error {\r\n constructor(path: string) {\r\n super(`\"${path}\" is not a QuikRouter instance.`);\r\n }\r\n}\r\n\r\nclass ServerInvalidCronError extends Error {\r\n constructor() {\r\n super(`Invalid object, must be a QuikCron instance.`);\r\n }\r\n}\r\n\r\nexport { ServerInvalidRouteError, ServerInvalidCronError }","import fs from \"node:fs\"\r\nimport path from \"node:path\";\r\n\r\nimport { colors } from \"./colors.js\"\r\nimport { dateToString, isValidTimeZone } from \"./time.js\";\r\nimport { translate } from \"./translator.js\";\r\n\r\n/* Types */\r\ntype ConfigValue = string | null | false;\r\ntype Cases = \"uppercase\" | \"lowercase\" | \"capitalize\" | \"none\" | null;\r\ntype ColorName =\r\n | \"black\"\r\n | \"red\"\r\n | \"green\"\r\n | \"yellow\"\r\n | \"blue\"\r\n | \"magenta\"\r\n | \"cyan\"\r\n | \"white\";\r\n\r\ntype ColorValue = ColorName | null;\r\ntype SaveConfig = {\r\n infoFilePath: ConfigValue,\r\n logFilePath: ConfigValue,\r\n errorFilePath: ConfigValue,\r\n warningFilePath: ConfigValue,\r\n}\r\ntype ColorConfig = {\r\n logColor: ColorValue;\r\n infoColor: ColorValue;\r\n errorColor: ColorValue;\r\n warningColor: ColorValue;\r\n debugColor: ColorValue;\r\n}\r\ntype Formatconfig = {\r\n timestampFormat: ConfigValue,\r\n titleCase: Cases,\r\n prefix?: string\r\n suffix?: string\r\n timeZone?: string\r\n}\r\n\r\ntype LoggerConfig = {\r\n language: Language,\r\n save: SaveConfig,\r\n color: ColorConfig,\r\n format: Formatconfig,\r\n}\r\ntype PartialConfig = Partial<{\r\n save: Partial<SaveConfig>;\r\n color: Partial<ColorConfig>;\r\n format: Partial<Formatconfig>;\r\n}>;\r\n\r\nconst defaultConfig: LoggerConfig = {\r\n language: \"en\",\r\n save: {\r\n logFilePath: null,\r\n infoFilePath: null,\r\n errorFilePath: \"logs/error.log\",\r\n warningFilePath: \"logs/warning.log\",\r\n },\r\n color: {\r\n logColor: \"blue\",\r\n infoColor: \"green\",\r\n errorColor: \"red\",\r\n warningColor: \"yellow\",\r\n debugColor: null\r\n },\r\n format: {\r\n timestampFormat: \"DD-MM-YYYY hh:mm:ss\",\r\n titleCase: \"uppercase\"\r\n }\r\n}\r\n\r\nlet config = structuredClone(defaultConfig);\r\n\r\nfunction tokenize(...args: unknown[]): string[] {\r\n return args.map(arg => {\r\n if (typeof arg === \"string\") return arg;\r\n\r\n if (arg instanceof Error) {\r\n return arg.stack ?? arg.message;\r\n }\r\n\r\n if (arg === null || arg === undefined) {\r\n return String(arg);\r\n }\r\n\r\n if (typeof arg === \"object\") {\r\n try {\r\n return JSON.stringify(arg);\r\n } catch {\r\n return \"[Circular]\";\r\n }\r\n }\r\n\r\n return String(arg);\r\n });\r\n}\r\n\r\nfunction write(\r\n level: string,\r\n color: ColorName | null | false,\r\n file: ConfigValue,\r\n ...content: unknown[]\r\n) {\r\n const [header, body] = parseContent(level, ...content);\r\n saveToFile(file, header + body);\r\n\r\n const prefix = config.format.prefix ?? \"\";\r\n const suffix = config.format.suffix ?? \"\";\r\n\r\n if (color) {\r\n const colorFn = colors[color] ?? ((s: string) => s);\r\n console.log(`${prefix}${header}${colorFn(body)}${suffix}`);\r\n } else {\r\n console.log(`${prefix}${header}${body}${suffix}`);\r\n }\r\n}\r\n\r\nfunction parseContent(level: string, ...body: unknown[]): [string, string] {\r\n let header = \"\";\r\n if (config.format.timestampFormat) {\r\n const now = new Date();\r\n const timeZone = config.format.timeZone;\r\n let tz = timeZone;\r\n\r\n if (timeZone && !isValidTimeZone(timeZone)) {\r\n tz = undefined;\r\n }\r\n\r\n const timestamp = dateToString(\r\n now,\r\n config.format.timestampFormat,\r\n tz\r\n );\r\n\r\n header += `${timestamp} `;\r\n }\r\n\r\n switch (config.format.titleCase) {\r\n case \"uppercase\":\r\n level = `[${level.toUpperCase()}] `;\r\n break;\r\n case \"lowercase\":\r\n level = `[${level.toLocaleLowerCase()}] `;\r\n break;\r\n case \"capitalize\":\r\n level = `[${level.charAt(0).toUpperCase() + level.slice(1).toLowerCase()}] `;\r\n break;\r\n case \"none\":\r\n level = `[${level}] `;\r\n break;\r\n default:\r\n level = \"\";\r\n break;\r\n }\r\n let content = level + tokenize(...body).join(\" \");\r\n return [header, content];\r\n}\r\n\r\nfunction saveToFile(filePath: ConfigValue, content: string): void {\r\n if (!filePath || !content.length) return;\r\n\r\n const dir = path.dirname(filePath);\r\n const logMessage = content + \"\\n\";\r\n\r\n fs.mkdirSync(dir, { recursive: true });\r\n fs.appendFileSync(filePath, logMessage);\r\n}\r\n\r\nfunction mergeConfig(\r\n current: LoggerConfig,\r\n update: PartialConfig\r\n): LoggerConfig {\r\n return {\r\n ...current,\r\n ...update,\r\n save: {\r\n ...current.save,\r\n ...update.save,\r\n },\r\n color: {\r\n ...current.color,\r\n ...update.color,\r\n },\r\n format: {\r\n ...current.format,\r\n ...update.format,\r\n },\r\n };\r\n}\r\n\r\nexport const logger = {\r\n // Setter config\r\n setConfig(newConfig: PartialConfig): void {\r\n config = mergeConfig(config, newConfig);\r\n },\r\n\r\n // Getter config\r\n config(): Readonly<LoggerConfig> {\r\n return Object.freeze(structuredClone(config));\r\n },\r\n\r\n log(...content: unknown[]) {\r\n const messages = translate(config.language, \"logger\");\r\n write(\r\n messages.levels.log,\r\n config.color.logColor,\r\n config.save.logFilePath,\r\n ...content\r\n );\r\n },\r\n\r\n info(...content: unknown[]) {\r\n const messages = translate(config.language, \"logger\");\r\n write(\r\n messages.levels.info,\r\n config.color.infoColor,\r\n config.save.infoFilePath,\r\n ...content\r\n );\r\n },\r\n\r\n error(...content: unknown[]) {\r\n const messages = translate(config.language, \"logger\");\r\n write(\r\n messages.levels.error,\r\n config.color.errorColor,\r\n config.save.errorFilePath,\r\n ...content\r\n );\r\n },\r\n\r\n warning(...content: unknown[]) {\r\n const messages = translate(config.language, \"logger\");\r\n write(\r\n messages.levels.warning,\r\n config.color.warningColor,\r\n config.save.warningFilePath,\r\n ...content\r\n );\r\n },\r\n\r\n debug(...content: unknown[]) {\r\n const messages = translate(config.language, \"logger\");\r\n write(\r\n messages.levels.debug,\r\n config.color.debugColor,\r\n null,\r\n ...content\r\n );\r\n },\r\n\r\n clear() {\r\n console.clear();\r\n },\r\n\r\n custom(\r\n level: string,\r\n color: ColorName | null | false,\r\n file: ConfigValue,\r\n ...content: unknown[]\r\n ) {\r\n write(level, color, file, ...content);\r\n }\r\n}","const color = {\r\n reset: \"\\x1b[0m\",\r\n\r\n black: \"\\x1b[30m\",\r\n red: \"\\x1b[31m\",\r\n green: \"\\x1b[32m\",\r\n yellow: \"\\x1b[33m\",\r\n blue: \"\\x1b[34m\",\r\n magenta: \"\\x1b[35m\",\r\n cyan: \"\\x1b[36m\",\r\n white: \"\\x1b[37m\",\r\n\r\n bold: \"\\x1b[1m\",\r\n underline: \"\\x1b[4m\"\r\n} as const;\r\n\r\n\r\ntype Color = keyof Omit<typeof color, \"reset\">;\r\nconst colors = Object.fromEntries(\r\n Object.entries(color)\r\n .filter(([key]) => key !== \"reset\")\r\n .map(([key, value]) => [\r\n key,\r\n (text: string) => `${value}${text}${color.reset}`\r\n ])\r\n) as Record<Color, (text: string) => string>;\r\n\r\nexport { color, colors };","function dateToString(date: Date, format: string, timeZone?: string): string {\r\n const formatter = new Intl.DateTimeFormat(\"en-US\", {\r\n timeZone,\r\n year: \"numeric\",\r\n month: \"2-digit\",\r\n day: \"2-digit\",\r\n hour: \"2-digit\",\r\n minute: \"2-digit\",\r\n second: \"2-digit\",\r\n hourCycle: \"h23\",\r\n });\r\n\r\n const parts = formatter.formatToParts(date);\r\n const values = Object.fromEntries(\r\n parts\r\n .filter(({ type }) => type !== \"literal\")\r\n .map(({ type, value }) => [type, value])\r\n );\r\n\r\n return format.replace(/(YYYY|MM|DD|hh|mm|ss)/g, (match): string => {\r\n switch (match) {\r\n case \"YYYY\":\r\n return values.year || \"\";\r\n case \"MM\":\r\n return values.month || \"\";\r\n case \"DD\":\r\n return values.day || \"\";\r\n case \"hh\":\r\n return values.hour || \"\";\r\n case \"mm\":\r\n return values.minute || \"\";\r\n case \"ss\":\r\n return values.second || \"\";\r\n default:\r\n return match;\r\n }\r\n });\r\n}\r\n\r\nfunction isValidTimeZone(timeZone: string): boolean {\r\n try {\r\n new Intl.DateTimeFormat(\"en-US\", {\r\n timeZone,\r\n });\r\n\r\n return true;\r\n } catch {\r\n return false;\r\n }\r\n}\r\n\r\nexport { dateToString, isValidTimeZone };\r\n","{\r\n \"logger\": {\r\n \"levels\": {\r\n \"log\": \"log\",\r\n \"info\": \"info\",\r\n \"warning\": \"warning\",\r\n \"error\": \"error\",\r\n \"debug\": \"debug\"\r\n }\r\n },\r\n \"server\": {\r\n \"name\": \"server\",\r\n \"start\": \"Server running at\",\r\n \"routers_loaded\": \"routers loaded\",\r\n \"crons_loaded\": \"crons loaded\",\r\n \"static_loaded\": \"static dirs loaded\",\r\n \"static_warn\": \"directory does not exist\"\r\n },\r\n \"time\": {\r\n \"invalidTimeZone1\": \"Invalid time zone:\",\r\n \"invalidTimeZone2\": \"Using system default time zone.\"\r\n }\r\n}","{\r\n \"logger\": {\r\n \"levels\": {\r\n \"log\": \"log\",\r\n \"info\": \"info\",\r\n \"warning\": \"advertencia\",\r\n \"error\": \"error\",\r\n \"debug\": \"depuración\"\r\n }\r\n },\r\n \"server\": {\r\n \"name\": \"servidor\",\r\n \"start\": \"Servidor corriendo en\",\r\n \"routers_loaded\": \"rutas cargadas\",\r\n \"crons_loaded\": \"crons cargados\",\r\n \"static_loaded\": \"carpetas estaticas cargadas\",\r\n \"static_warn\": \"no existe el directorio\"\r\n },\r\n \"time\": {\r\n \"invalidTimeZone1\": \"Zona horaria inválida:\",\r\n \"invalidTimeZone2\": \"Usando la zona horaria predeterminada del sistema.\"\r\n }\r\n}","import en from \"../locales/en.json\" with { type: \"json\" };\r\nimport es from \"../locales/es.json\" with { type: \"json\" };\r\n\r\ntype Locale = typeof en;\r\n\r\nconst locales = {\r\n en,\r\n es,\r\n} satisfies Record<string, Locale>;\r\n\r\ntype Language = keyof typeof locales;\r\ntype TranslationKey = keyof Locale;\r\n\r\nfunction translate<K extends TranslationKey>(\r\n language: Language,\r\n key: K\r\n): Locale[K] {\r\n return locales[language][key];\r\n}\r\n\r\nexport {\r\n translate,\r\n};\r\n","import type { RequestHandler, Router as RouterType } from \"express\";\r\nimport { Router as ExpressRouter } from \"express\";\r\n\r\ntype HttpMethod =\r\n | \"get\"\r\n | \"post\"\r\n | \"put\"\r\n | \"patch\"\r\n | \"delete\"\r\n | \"options\"\r\n | \"head\"\r\n | \"all\";\r\n\r\nclass QuikRouter {\r\n readonly router: RouterType;\r\n private pendingMiddleware: RequestHandler[] = [];\r\n private currentPath: string = \"\";\r\n\r\n constructor() {\r\n this.router = ExpressRouter();\r\n }\r\n\r\n middleware(...handlers: RequestHandler[]) {\r\n this.pendingMiddleware.push(...handlers);\r\n return this;\r\n }\r\n\r\n path(path: string) {\r\n this.currentPath = path;\r\n return this;\r\n }\r\n\r\n private register (\r\n method: HttpMethod,\r\n handler: RequestHandler\r\n ) {\r\n this.router[method](\r\n this.currentPath,\r\n ...this.pendingMiddleware,\r\n async (req, res, next) => {\r\n try {\r\n await handler(req, res, next);\r\n } catch (err) {\r\n next(err);\r\n }\r\n }\r\n );\r\n\r\n this.pendingMiddleware = [];\r\n this.currentPath = \"\";\r\n\r\n return this;\r\n }\r\n\r\n get(handler: RequestHandler) {\r\n return this.register(\"get\", handler);\r\n }\r\n\r\n post(handler: RequestHandler) {\r\n return this.register(\"post\", handler);\r\n }\r\n\r\n put(handler: RequestHandler) {\r\n return this.register(\"put\", handler);\r\n }\r\n\r\n patch(handler: RequestHandler) {\r\n return this.register(\"patch\", handler);\r\n }\r\n\r\n delete(handler: RequestHandler) {\r\n return this.register(\"delete\", handler);\r\n }\r\n \r\n}\r\n\r\nfunction Router() {\r\n return new QuikRouter;\r\n}\r\n\r\nexport { QuikRouter, Router };","import express, { type Express, type RequestHandler } from \"express\";\r\nimport http, { type Server as HTTPServer } from \"node:http\";\r\nimport path from \"node:path\";\r\nimport fs from \"node:fs\";\r\n\r\nimport { QuikRouter } from \"./router.js\";\r\nimport { logger } from \"./logger.js\";\r\nimport { translate } from \"./translator.js\";\r\nimport { isValidTimeZone } from \"./time.js\";\r\nimport { QuikCron } from \"../cron/cron.js\";\r\nimport { ServerInvalidCronError, ServerInvalidRouteError } from \"./errors/serverErrors.js\";\r\n\r\ntype JsonOptions = Parameters<typeof express.json>[0];\r\ntype UrlencodedOptions = Parameters<typeof express.urlencoded>[0];\r\ntype RawOptions = Parameters<typeof express.raw>[0];\r\ntype TextOptions = Parameters<typeof express.text>[0];\r\ntype BodyParserConfig =\r\n | {\r\n type: \"json\";\r\n options?: JsonOptions;\r\n }\r\n | {\r\n type: \"urlencoded\";\r\n options?: UrlencodedOptions;\r\n }\r\n | {\r\n type: \"raw\";\r\n options?: RawOptions;\r\n }\r\n | {\r\n type: \"text\";\r\n options?: TextOptions;\r\n };\r\ntype HTTPConfig = {\r\n port: number;\r\n host?: string;\r\n\r\n keepAlive?: number;\r\n timeout?: number;\r\n maxConnections?: number;\r\n shutdownTimeout?: number;\r\n};\r\ntype ExpressConfig = {\r\n trustProxy?: boolean;\r\n};\r\ntype QuikServerConfig = {\r\n language: Language,\r\n timeZone?: string;\r\n bodyParser: BodyParserConfig;\r\n http: HTTPConfig;\r\n express: ExpressConfig;\r\n};\r\ntype RoutingDict = Record<string, QuikRouter>;\r\n\r\nconst defaultConfig: QuikServerConfig = {\r\n language: \"en\",\r\n bodyParser: {\r\n type: \"json\"\r\n },\r\n\r\n http: {\r\n port: 8080\r\n },\r\n\r\n express: {}\r\n}\r\n\r\nclass QuikServer {\r\n app: Express;\r\n httpServer: HTTPServer;\r\n middlewares: RequestHandler[] = [];\r\n routes: RoutingDict = {};\r\n staticDirs: string[] = [];\r\n crons: QuikCron[] = [];\r\n config: QuikServerConfig;\r\n\r\n constructor() {\r\n this.app = express();\r\n this.config = structuredClone(defaultConfig);\r\n this.httpServer = http.createServer(\r\n this.app\r\n );\r\n }\r\n\r\n\r\n setConfig(config: Partial<QuikServerConfig>) {\r\n this.config = {\r\n ...this.config,\r\n ...config,\r\n http: {\r\n ...this.config.http,\r\n ...config.http\r\n },\r\n express: {\r\n ...this.config.express,\r\n ...config.express\r\n }\r\n };\r\n\r\n // Notify if the provided time zone is invalid\r\n if (config.timeZone && !isValidTimeZone(config.timeZone)) {\r\n const messages = translate(this.config.language, \"time\");\r\n\r\n logger.warning(\r\n `${messages.invalidTimeZone1} ${config.timeZone}. ${messages.invalidTimeZone2}`\r\n );\r\n }\r\n\r\n return this;\r\n }\r\n\r\n addMiddleware(...middlewares: RequestHandler[]) {\r\n this.middlewares.push(\r\n ...middlewares\r\n );\r\n\r\n return this;\r\n }\r\n\r\n addRoute(path: string, router: QuikRouter) {\r\n if (!(router instanceof QuikRouter)) {\r\n throw new ServerInvalidRouteError(path)\r\n }\r\n\r\n if (!path.startsWith(\"/\"))\r\n path = \"/\" + path;\r\n\r\n this.routes[path] = router;\r\n\r\n return this;\r\n }\r\n\r\n\r\n #listen() {\r\n const { port, host } = this.config.http;\r\n const messages = translate(this.config.language, \"server\");\r\n\r\n this.httpServer.listen(port, host, () => {\r\n logger.info(`${messages.start} ${host ?? \"localhost\"}:${port}`);\r\n }\r\n );\r\n\r\n return this;\r\n }\r\n\r\n addCron(cron: QuikCron) {\r\n if (cron.constructor.name != \"QuikCron\") {\r\n throw new ServerInvalidCronError()\r\n }\r\n this.crons.push(cron);\r\n\r\n return this;\r\n }\r\n\r\n addStaticDir(...paths: string[]) {\r\n for (const i in paths) {\r\n const dir = paths[i] ?? \"\";\r\n const dirPath = path.resolve(dir);\r\n\r\n const exists = fs.existsSync(dirPath)\r\n if (!exists) {\r\n const messages = translate(this.config.language, \"server\");\r\n logger.warning(`[ STATIC ] \"${dir}\" ${messages.static_warn}`);\r\n continue;\r\n }\r\n this.staticDirs.push(...paths);\r\n }\r\n\r\n return this;\r\n }\r\n\r\n #configureHTTP() {\r\n const config = this.config.http;\r\n\r\n if (config.timeout)\r\n this.httpServer.timeout = config.timeout;\r\n\r\n if (config.keepAlive)\r\n this.httpServer.keepAliveTimeout = config.keepAlive;\r\n\r\n if (config.maxConnections)\r\n this.httpServer.maxConnections = config.maxConnections;\r\n\r\n return this;\r\n }\r\n\r\n #configureExpress() {\r\n const config = this.config.express;\r\n\r\n if (config.trustProxy !== undefined) {\r\n this.app.set(\r\n \"trust proxy\",\r\n config.trustProxy\r\n );\r\n\r\n }\r\n\r\n return this;\r\n }\r\n\r\n #configureMiddleware() {\r\n const bodyParser = this.config.bodyParser;\r\n\r\n switch (bodyParser.type) {\r\n case \"json\":\r\n this.app.use(\r\n express.json(bodyParser.options)\r\n );\r\n break;\r\n\r\n\r\n case \"urlencoded\":\r\n this.app.use(\r\n express.urlencoded(bodyParser.options)\r\n );\r\n break;\r\n\r\n\r\n case \"raw\":\r\n this.app.use(\r\n express.raw(bodyParser.options)\r\n );\r\n break;\r\n\r\n\r\n case \"text\":\r\n this.app.use(\r\n express.text(bodyParser.options)\r\n );\r\n break;\r\n\r\n }\r\n\r\n if (this.middlewares.length > 0)\r\n this.app.use(...this.middlewares);\r\n\r\n return this;\r\n }\r\n\r\n\r\n #configureRoutes() {\r\n for (const [path, router] of Object.entries(this.routes)) {\r\n this.app.use(\r\n path,\r\n router.router\r\n );\r\n }\r\n const messages = translate(this.config.language, \"server\");\r\n logger.info(`[ ROUTER ] ${Object.entries(this.routes).length} ${messages.routers_loaded}.`);\r\n return this;\r\n }\r\n\r\n #loadCrons() {\r\n for (const cron of this.crons) {\r\n cron.start();\r\n }\r\n\r\n const messages = translate(this.config.language, \"server\")\r\n logger.info(`[ CRON ] ${this.crons.length} ${messages.crons_loaded}.`)\r\n\r\n return this;\r\n }\r\n\r\n #loadStaticDirs() {\r\n for (const dir of this.staticDirs) {\r\n const dirPath = path.resolve(dir);\r\n\r\n this.app.use(express.static(dirPath));\r\n }\r\n\r\n const messages = translate(this.config.language, \"server\")\r\n logger.info(`[ STATIC ] ${this.staticDirs.length} ${messages.static_loaded}.`)\r\n\r\n return this;\r\n }\r\n\r\n start() {\r\n this.#configureExpress();\r\n this.#configureMiddleware();\r\n\r\n this.#loadStaticDirs()\r\n this.#configureRoutes();\r\n this.#loadCrons();\r\n\r\n this.#configureHTTP();\r\n\r\n this.#listen();\r\n return this;\r\n }\r\n}\r\n\r\nfunction Server() {\r\n return new QuikServer();\r\n}\r\n\r\nexport {\r\n Server\r\n};\r\n","import cron from \"node-cron\";\r\nimport { type ScheduledTask } from \"node-cron\";\r\n\r\nimport {\r\n CronTaskAlreadyExistsError,\r\n CronInvalidScheduleError,\r\n CronInvalidTimeZoneError,\r\n CronTaskExecutionError,\r\n} from \"./exceptions.js\";\r\n\r\nimport { isValidTimeZone } from \"../core/time.js\";\r\nimport type { CronConfig, CronTask, PartialCronConfig } from \"./types.js\";\r\n\r\n// Default configuration \r\nconst defaultConfig: CronConfig = {\r\n language: \"en\",\r\n};\r\n\r\n// Cron Class\r\nclass QuikCron {\r\n private tasks = new Map<string, CronTask>();\r\n private jobs = new Map<string, ScheduledTask>();\r\n\r\n #config: CronConfig = structuredClone(defaultConfig);\r\n\r\n constructor() {\r\n \r\n }\r\n\r\n add(task: CronTask): void {\r\n if (this.tasks.has(task.name)) {\r\n throw new CronTaskAlreadyExistsError(\r\n task.name\r\n );\r\n }\r\n\r\n if (!cron.validate(task.schedule)) {\r\n throw new CronInvalidScheduleError(\r\n task.schedule\r\n );\r\n }\r\n\r\n if (\r\n task.timezone &&\r\n !isValidTimeZone(task.timezone)\r\n ) {\r\n throw new CronInvalidTimeZoneError(\r\n task.timezone\r\n );\r\n }\r\n\r\n this.tasks.set(task.name, {\r\n ...task,\r\n });\r\n }\r\n\r\n remove(name: string): boolean {\r\n this.jobs.get(name)?.stop();\r\n this.jobs.delete(name);\r\n\r\n return this.tasks.delete(name);\r\n }\r\n\r\n has(name: string): boolean {\r\n return this.tasks.has(name);\r\n }\r\n\r\n get(name: string): CronTask | undefined {\r\n return this.tasks.get(name);\r\n }\r\n\r\n getTasks(): CronTask[] {\r\n return [...this.tasks.values()];\r\n }\r\n\r\n start(): void {\r\n for (const task of this.tasks.values()) {\r\n if (this.jobs.has(task.name)) {\r\n continue;\r\n }\r\n\r\n const timezone =\r\n task.timezone ?? this.#config.timeZone;\r\n\r\n const options = timezone\r\n ? { timezone }\r\n : {};\r\n\r\n const job = cron.schedule(\r\n task.schedule,\r\n async () => {\r\n try {\r\n await task.task();\r\n } catch (error) {\r\n const exception =\r\n new CronTaskExecutionError(\r\n task.name,\r\n error\r\n );\r\n\r\n this.#config.onError?.(exception);\r\n }\r\n },\r\n options\r\n );\r\n\r\n this.jobs.set(task.name, job);\r\n }\r\n }\r\n\r\n stop(): void {\r\n for (const job of this.jobs.values()) {\r\n job.stop();\r\n }\r\n\r\n this.jobs.clear();\r\n }\r\n\r\n config(): Readonly<CronConfig> {\r\n return Object.freeze(\r\n structuredClone(this.#config)\r\n );\r\n }\r\n\r\n setConfig(config: PartialCronConfig): void {\r\n if (\r\n config.timeZone &&\r\n !isValidTimeZone(config.timeZone)\r\n ) {\r\n throw new CronInvalidTimeZoneError(\r\n config.timeZone\r\n );\r\n }\r\n\r\n this.#config = {\r\n ...this.#config,\r\n ...config,\r\n };\r\n }\r\n}\r\n\r\nfunction Cron(): QuikCron {\r\n return new QuikCron();\r\n}\r\n\r\nexport { QuikCron, Cron };\r\n"],"mappings":"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","names":["path","color","path","fs","ExpressRouter","path","import_express","import_node_path","import_node_fs","import_node_cron","defaultConfig","express","http","config","path","cron","fs"]}
|
package/dist/index.d.cts
CHANGED
|
@@ -111,6 +111,7 @@ declare class QuikServer {
|
|
|
111
111
|
httpServer: Server$1;
|
|
112
112
|
middlewares: RequestHandler[];
|
|
113
113
|
routes: RoutingDict;
|
|
114
|
+
staticDirs: string[];
|
|
114
115
|
crons: QuikCron[];
|
|
115
116
|
config: QuikServerConfig;
|
|
116
117
|
constructor();
|
|
@@ -118,6 +119,7 @@ declare class QuikServer {
|
|
|
118
119
|
addMiddleware(...middlewares: RequestHandler[]): this;
|
|
119
120
|
addRoute(path: string, router: QuikRouter): this;
|
|
120
121
|
addCron(cron: QuikCron): this;
|
|
122
|
+
addStaticDir(...paths: string[]): this;
|
|
121
123
|
start(): this;
|
|
122
124
|
}
|
|
123
125
|
declare function Server(): QuikServer;
|
package/dist/index.d.ts
CHANGED
|
@@ -111,6 +111,7 @@ declare class QuikServer {
|
|
|
111
111
|
httpServer: Server$1;
|
|
112
112
|
middlewares: RequestHandler[];
|
|
113
113
|
routes: RoutingDict;
|
|
114
|
+
staticDirs: string[];
|
|
114
115
|
crons: QuikCron[];
|
|
115
116
|
config: QuikServerConfig;
|
|
116
117
|
constructor();
|
|
@@ -118,6 +119,7 @@ declare class QuikServer {
|
|
|
118
119
|
addMiddleware(...middlewares: RequestHandler[]): this;
|
|
119
120
|
addRoute(path: string, router: QuikRouter): this;
|
|
120
121
|
addCron(cron: QuikCron): this;
|
|
122
|
+
addStaticDir(...paths: string[]): this;
|
|
121
123
|
start(): this;
|
|
122
124
|
}
|
|
123
125
|
declare function Server(): QuikServer;
|