@desaubv/quik 0.0.3 → 0.0.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +274 -20
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +65 -6
- package/dist/index.d.ts +65 -6
- package/dist/index.js +272 -20
- package/dist/index.js.map +1 -1
- package/package.json +22 -8
package/dist/index.cjs
CHANGED
|
@@ -30,7 +30,9 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
|
|
|
30
30
|
// src/index.ts
|
|
31
31
|
var index_exports = {};
|
|
32
32
|
__export(index_exports, {
|
|
33
|
+
QuickRouter: () => QuickRouter,
|
|
33
34
|
Router: () => Router,
|
|
35
|
+
Server: () => Server,
|
|
34
36
|
logger: () => logger
|
|
35
37
|
});
|
|
36
38
|
module.exports = __toCommonJS(index_exports);
|
|
@@ -61,37 +63,114 @@ var colors = Object.fromEntries(
|
|
|
61
63
|
);
|
|
62
64
|
|
|
63
65
|
// src/core/time.ts
|
|
64
|
-
function dateToString(date, format) {
|
|
66
|
+
function dateToString(date, format, timeZone) {
|
|
67
|
+
const formatter = new Intl.DateTimeFormat("en-US", {
|
|
68
|
+
timeZone,
|
|
69
|
+
year: "numeric",
|
|
70
|
+
month: "2-digit",
|
|
71
|
+
day: "2-digit",
|
|
72
|
+
hour: "2-digit",
|
|
73
|
+
minute: "2-digit",
|
|
74
|
+
second: "2-digit",
|
|
75
|
+
hourCycle: "h23"
|
|
76
|
+
});
|
|
77
|
+
const parts = formatter.formatToParts(date);
|
|
78
|
+
const values = Object.fromEntries(
|
|
79
|
+
parts.filter(({ type }) => type !== "literal").map(({ type, value }) => [type, value])
|
|
80
|
+
);
|
|
65
81
|
return format.replace(/(YYYY|MM|DD|hh|mm|ss)/g, (match) => {
|
|
66
82
|
switch (match) {
|
|
67
83
|
case "YYYY":
|
|
68
|
-
return
|
|
84
|
+
return values.year || "";
|
|
69
85
|
case "MM":
|
|
70
|
-
return
|
|
86
|
+
return values.month || "";
|
|
71
87
|
case "DD":
|
|
72
|
-
return
|
|
88
|
+
return values.day || "";
|
|
73
89
|
case "hh":
|
|
74
|
-
return
|
|
90
|
+
return values.hour || "";
|
|
75
91
|
case "mm":
|
|
76
|
-
return
|
|
92
|
+
return values.minute || "";
|
|
77
93
|
case "ss":
|
|
78
|
-
return
|
|
94
|
+
return values.second || "";
|
|
79
95
|
default:
|
|
80
96
|
return match;
|
|
81
97
|
}
|
|
82
98
|
});
|
|
83
99
|
}
|
|
100
|
+
function isValidTimeZone(timeZone) {
|
|
101
|
+
try {
|
|
102
|
+
new Intl.DateTimeFormat("en-US", {
|
|
103
|
+
timeZone
|
|
104
|
+
});
|
|
105
|
+
return true;
|
|
106
|
+
} catch {
|
|
107
|
+
return false;
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
// src/locales/en.json
|
|
112
|
+
var en_default = {
|
|
113
|
+
logger: {
|
|
114
|
+
levels: {
|
|
115
|
+
log: "log",
|
|
116
|
+
info: "info",
|
|
117
|
+
warning: "warning",
|
|
118
|
+
error: "error",
|
|
119
|
+
debug: "debug"
|
|
120
|
+
}
|
|
121
|
+
},
|
|
122
|
+
server: {
|
|
123
|
+
name: "server",
|
|
124
|
+
start: "Server running at"
|
|
125
|
+
},
|
|
126
|
+
time: {
|
|
127
|
+
invalidTimeZone1: "Invalid time zone:",
|
|
128
|
+
invalidTimeZone2: "Using system default time zone."
|
|
129
|
+
}
|
|
130
|
+
};
|
|
131
|
+
|
|
132
|
+
// src/locales/es.json
|
|
133
|
+
var es_default = {
|
|
134
|
+
logger: {
|
|
135
|
+
levels: {
|
|
136
|
+
log: "log",
|
|
137
|
+
info: "info",
|
|
138
|
+
warning: "advertencia",
|
|
139
|
+
error: "error",
|
|
140
|
+
debug: "depuraci\xF3n"
|
|
141
|
+
}
|
|
142
|
+
},
|
|
143
|
+
server: {
|
|
144
|
+
name: "servidor",
|
|
145
|
+
start: "Servidor corriendo en"
|
|
146
|
+
},
|
|
147
|
+
time: {
|
|
148
|
+
invalidTimeZone1: "Zona horaria inv\xE1lida:",
|
|
149
|
+
invalidTimeZone2: "Usando la zona horaria predeterminada del sistema."
|
|
150
|
+
}
|
|
151
|
+
};
|
|
152
|
+
|
|
153
|
+
// src/core/translator.ts
|
|
154
|
+
var locales = {
|
|
155
|
+
en: en_default,
|
|
156
|
+
es: es_default
|
|
157
|
+
};
|
|
158
|
+
function translate(language, key) {
|
|
159
|
+
return locales[language][key];
|
|
160
|
+
}
|
|
84
161
|
|
|
85
162
|
// src/core/logger.ts
|
|
86
163
|
var defaultConfig = {
|
|
164
|
+
language: "en",
|
|
87
165
|
save: {
|
|
88
166
|
logFilePath: null,
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
warningFilePath:
|
|
167
|
+
infoFilePath: null,
|
|
168
|
+
errorFilePath: "logs/error.log",
|
|
169
|
+
warningFilePath: "logs/warning.log"
|
|
92
170
|
},
|
|
93
171
|
color: {
|
|
94
172
|
logColor: "blue",
|
|
173
|
+
infoColor: "green",
|
|
95
174
|
errorColor: "red",
|
|
96
175
|
warningColor: "yellow",
|
|
97
176
|
debugColor: null
|
|
@@ -136,7 +215,17 @@ function write(level, color2, file, ...content) {
|
|
|
136
215
|
function parseContent(level, ...body) {
|
|
137
216
|
let header = "";
|
|
138
217
|
if (config.format.timestampFormat) {
|
|
139
|
-
const
|
|
218
|
+
const now = /* @__PURE__ */ new Date();
|
|
219
|
+
const timeZone = config.format.timeZone;
|
|
220
|
+
let tz = timeZone;
|
|
221
|
+
if (timeZone && !isValidTimeZone(timeZone)) {
|
|
222
|
+
tz = void 0;
|
|
223
|
+
}
|
|
224
|
+
const timestamp = dateToString(
|
|
225
|
+
now,
|
|
226
|
+
config.format.timestampFormat,
|
|
227
|
+
tz
|
|
228
|
+
);
|
|
140
229
|
header += `${timestamp} `;
|
|
141
230
|
}
|
|
142
231
|
switch (config.format.titleCase) {
|
|
@@ -168,6 +257,8 @@ function saveToFile(filePath, content) {
|
|
|
168
257
|
}
|
|
169
258
|
function mergeConfig(current, update) {
|
|
170
259
|
return {
|
|
260
|
+
...current,
|
|
261
|
+
...update,
|
|
171
262
|
save: {
|
|
172
263
|
...current.save,
|
|
173
264
|
...update.save
|
|
@@ -192,32 +283,45 @@ var logger = {
|
|
|
192
283
|
return Object.freeze(structuredClone(config));
|
|
193
284
|
},
|
|
194
285
|
log(...content) {
|
|
286
|
+
const messages = translate(config.language, "logger");
|
|
195
287
|
write(
|
|
196
|
-
|
|
288
|
+
messages.levels.log,
|
|
197
289
|
config.color.logColor,
|
|
198
290
|
config.save.logFilePath,
|
|
199
291
|
...content
|
|
200
292
|
);
|
|
201
293
|
},
|
|
294
|
+
info(...content) {
|
|
295
|
+
const messages = translate(config.language, "logger");
|
|
296
|
+
write(
|
|
297
|
+
messages.levels.info,
|
|
298
|
+
config.color.infoColor,
|
|
299
|
+
config.save.infoFilePath,
|
|
300
|
+
...content
|
|
301
|
+
);
|
|
302
|
+
},
|
|
202
303
|
error(...content) {
|
|
304
|
+
const messages = translate(config.language, "logger");
|
|
203
305
|
write(
|
|
204
|
-
|
|
306
|
+
messages.levels.error,
|
|
205
307
|
config.color.errorColor,
|
|
206
308
|
config.save.errorFilePath,
|
|
207
309
|
...content
|
|
208
310
|
);
|
|
209
311
|
},
|
|
210
312
|
warning(...content) {
|
|
313
|
+
const messages = translate(config.language, "logger");
|
|
211
314
|
write(
|
|
212
|
-
|
|
315
|
+
messages.levels.warning,
|
|
213
316
|
config.color.warningColor,
|
|
214
317
|
config.save.warningFilePath,
|
|
215
318
|
...content
|
|
216
319
|
);
|
|
217
320
|
},
|
|
218
321
|
debug(...content) {
|
|
322
|
+
const messages = translate(config.language, "logger");
|
|
219
323
|
write(
|
|
220
|
-
|
|
324
|
+
messages.levels.debug,
|
|
221
325
|
config.color.debugColor,
|
|
222
326
|
null,
|
|
223
327
|
...content
|
|
@@ -230,10 +334,10 @@ var logger = {
|
|
|
230
334
|
|
|
231
335
|
// src/core/router.ts
|
|
232
336
|
var import_express = require("express");
|
|
233
|
-
var
|
|
337
|
+
var QuickRouter = class {
|
|
234
338
|
router;
|
|
235
339
|
pendingMiddleware = [];
|
|
236
|
-
|
|
340
|
+
currentPath = "";
|
|
237
341
|
constructor() {
|
|
238
342
|
this.router = (0, import_express.Router)();
|
|
239
343
|
}
|
|
@@ -242,12 +346,12 @@ var Router = class {
|
|
|
242
346
|
return this;
|
|
243
347
|
}
|
|
244
348
|
path(path2) {
|
|
245
|
-
this.
|
|
349
|
+
this.currentPath = path2;
|
|
246
350
|
return this;
|
|
247
351
|
}
|
|
248
352
|
register(method, handler) {
|
|
249
353
|
this.router[method](
|
|
250
|
-
this.
|
|
354
|
+
this.currentPath,
|
|
251
355
|
...this.pendingMiddleware,
|
|
252
356
|
async (req, res, next) => {
|
|
253
357
|
try {
|
|
@@ -258,7 +362,7 @@ var Router = class {
|
|
|
258
362
|
}
|
|
259
363
|
);
|
|
260
364
|
this.pendingMiddleware = [];
|
|
261
|
-
this.
|
|
365
|
+
this.currentPath = "";
|
|
262
366
|
return this;
|
|
263
367
|
}
|
|
264
368
|
get(handler) {
|
|
@@ -277,9 +381,159 @@ var Router = class {
|
|
|
277
381
|
return this.register("delete", handler);
|
|
278
382
|
}
|
|
279
383
|
};
|
|
384
|
+
function Router() {
|
|
385
|
+
return new QuickRouter();
|
|
386
|
+
}
|
|
387
|
+
|
|
388
|
+
// src/core/server.ts
|
|
389
|
+
var import_express2 = __toESM(require("express"), 1);
|
|
390
|
+
var import_node_http = __toESM(require("http"), 1);
|
|
391
|
+
var defaultConfig2 = {
|
|
392
|
+
language: "en",
|
|
393
|
+
bodyParser: {
|
|
394
|
+
type: "json"
|
|
395
|
+
},
|
|
396
|
+
http: {
|
|
397
|
+
port: 8080
|
|
398
|
+
},
|
|
399
|
+
express: {}
|
|
400
|
+
};
|
|
401
|
+
var QuikServer = class {
|
|
402
|
+
app;
|
|
403
|
+
httpQuikServer;
|
|
404
|
+
middlewares = [];
|
|
405
|
+
routes = {};
|
|
406
|
+
#config;
|
|
407
|
+
constructor() {
|
|
408
|
+
this.app = (0, import_express2.default)();
|
|
409
|
+
this.#config = structuredClone(defaultConfig2);
|
|
410
|
+
this.httpQuikServer = import_node_http.default.createServer(
|
|
411
|
+
this.app
|
|
412
|
+
);
|
|
413
|
+
}
|
|
414
|
+
config() {
|
|
415
|
+
return Object.freeze(structuredClone(this.#config));
|
|
416
|
+
}
|
|
417
|
+
setConfig(config2) {
|
|
418
|
+
this.#config = {
|
|
419
|
+
...this.#config,
|
|
420
|
+
...config2,
|
|
421
|
+
http: {
|
|
422
|
+
...this.#config.http,
|
|
423
|
+
...config2.http
|
|
424
|
+
},
|
|
425
|
+
express: {
|
|
426
|
+
...this.#config.express,
|
|
427
|
+
...config2.express
|
|
428
|
+
}
|
|
429
|
+
};
|
|
430
|
+
if (config2.timeZone && !isValidTimeZone(config2.timeZone)) {
|
|
431
|
+
const messages = translate(this.#config.language, "time");
|
|
432
|
+
logger.warning(
|
|
433
|
+
`${messages.invalidTimeZone1} ${config2.timeZone}. ${messages.invalidTimeZone2}`
|
|
434
|
+
);
|
|
435
|
+
}
|
|
436
|
+
return this;
|
|
437
|
+
}
|
|
438
|
+
middleware(...middlewares) {
|
|
439
|
+
this.middlewares.push(
|
|
440
|
+
...middlewares
|
|
441
|
+
);
|
|
442
|
+
return this;
|
|
443
|
+
}
|
|
444
|
+
route(path2, router) {
|
|
445
|
+
this.routes[path2] = router;
|
|
446
|
+
return this;
|
|
447
|
+
}
|
|
448
|
+
listen() {
|
|
449
|
+
const { port, host } = this.#config.http;
|
|
450
|
+
const messages = translate(this.#config.language, "server");
|
|
451
|
+
this.httpQuikServer.listen(
|
|
452
|
+
port,
|
|
453
|
+
host,
|
|
454
|
+
() => {
|
|
455
|
+
logger.info(`${messages.start} ${host ?? "localhost"}:${port}`);
|
|
456
|
+
}
|
|
457
|
+
);
|
|
458
|
+
return this;
|
|
459
|
+
}
|
|
460
|
+
#configureHTTP() {
|
|
461
|
+
const config2 = this.#config.http;
|
|
462
|
+
if (config2.timeout)
|
|
463
|
+
this.httpQuikServer.timeout = config2.timeout;
|
|
464
|
+
if (config2.keepAlive)
|
|
465
|
+
this.httpQuikServer.keepAliveTimeout = config2.keepAlive;
|
|
466
|
+
if (config2.maxConnections)
|
|
467
|
+
this.httpQuikServer.maxConnections = config2.maxConnections;
|
|
468
|
+
return this;
|
|
469
|
+
}
|
|
470
|
+
#configureExpress() {
|
|
471
|
+
const config2 = this.#config.express;
|
|
472
|
+
if (config2.trustProxy !== void 0) {
|
|
473
|
+
this.app.set(
|
|
474
|
+
"trust proxy",
|
|
475
|
+
config2.trustProxy
|
|
476
|
+
);
|
|
477
|
+
}
|
|
478
|
+
return this;
|
|
479
|
+
}
|
|
480
|
+
#configureMiddleware() {
|
|
481
|
+
const bodyParser = this.#config.bodyParser;
|
|
482
|
+
switch (bodyParser.type) {
|
|
483
|
+
case "json":
|
|
484
|
+
this.app.use(
|
|
485
|
+
import_express2.default.json(bodyParser.options)
|
|
486
|
+
);
|
|
487
|
+
break;
|
|
488
|
+
case "urlencoded":
|
|
489
|
+
this.app.use(
|
|
490
|
+
import_express2.default.urlencoded(bodyParser.options)
|
|
491
|
+
);
|
|
492
|
+
break;
|
|
493
|
+
case "raw":
|
|
494
|
+
this.app.use(
|
|
495
|
+
import_express2.default.raw(bodyParser.options)
|
|
496
|
+
);
|
|
497
|
+
break;
|
|
498
|
+
case "text":
|
|
499
|
+
this.app.use(
|
|
500
|
+
import_express2.default.text(bodyParser.options)
|
|
501
|
+
);
|
|
502
|
+
break;
|
|
503
|
+
}
|
|
504
|
+
if (this.middlewares.length > 0)
|
|
505
|
+
this.app.use(...this.middlewares);
|
|
506
|
+
return this;
|
|
507
|
+
}
|
|
508
|
+
#configureRoutes() {
|
|
509
|
+
for (const [path2, router] of Object.entries(this.routes)) {
|
|
510
|
+
this.app.use(
|
|
511
|
+
path2,
|
|
512
|
+
router.router
|
|
513
|
+
);
|
|
514
|
+
}
|
|
515
|
+
return this;
|
|
516
|
+
}
|
|
517
|
+
start() {
|
|
518
|
+
this.#configureExpress();
|
|
519
|
+
this.#configureMiddleware();
|
|
520
|
+
this.#configureRoutes();
|
|
521
|
+
this.#configureHTTP();
|
|
522
|
+
this.listen();
|
|
523
|
+
return this;
|
|
524
|
+
}
|
|
525
|
+
};
|
|
526
|
+
function Server() {
|
|
527
|
+
return new QuikServer();
|
|
528
|
+
}
|
|
529
|
+
|
|
530
|
+
// src/cron/cron.ts
|
|
531
|
+
var import_node_cron = __toESM(require("node-cron"), 1);
|
|
280
532
|
// Annotate the CommonJS export names for ESM import in node:
|
|
281
533
|
0 && (module.exports = {
|
|
534
|
+
QuickRouter,
|
|
282
535
|
Router,
|
|
536
|
+
Server,
|
|
283
537
|
logger
|
|
284
538
|
});
|
|
285
539
|
//# sourceMappingURL=index.cjs.map
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/core/logger.ts","../src/core/colors.ts","../src/core/time.ts","../src/core/router.ts"],"sourcesContent":["export { logger } from \"./core/logger.js\";\r\nexport { Router } from \"./core/router.js\";","import fs from \"node:fs\"\r\nimport path from \"node:path\";\r\n\r\nimport {colors} from \"./colors.js\"\r\nimport { dateToString } from \"./time.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 logFilePath: ConfigValue,\r\n errorFilePath: ConfigValue,\r\n warningFilePath: ConfigValue,\r\n}\r\ntype ColorConfig = {\r\n logColor: 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}\r\n\r\ntype Config = {\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: Config = {\r\n save: {\r\n logFilePath: null,\r\n errorFilePath: null, //\"logs/error.log\",\r\n warningFilePath: null,\r\n },\r\n color: {\r\n logColor: \"blue\",\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 timestamp = dateToString(new Date(), config.format.timestampFormat);\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: Config,\r\n update: PartialConfig\r\n): Config {\r\n return {\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<Config> {\r\n return Object.freeze(structuredClone(config));\r\n },\r\n\r\n log(...content: unknown[]) {\r\n write(\r\n \"log\",\r\n config.color.logColor,\r\n config.save.logFilePath,\r\n ...content\r\n );\r\n },\r\n\r\n error(...content: unknown[]) {\r\n write(\r\n \"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 write(\r\n \"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 write(\r\n \"debug\",\r\n config.color.debugColor,\r\n null,\r\n ...content\r\n );\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\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): string {\r\n return format.replace(/(YYYY|MM|DD|hh|mm|ss)/g, (match) => {\r\n switch (match) {\r\n case 'YYYY':\r\n return date.getFullYear().toString();\r\n case 'MM':\r\n return (date.getMonth() + 1).toString().padStart(2, '0');\r\n case 'DD':\r\n return date.getDate().toString().padStart(2, '0');\r\n case 'hh':\r\n return date.getHours().toString().padStart(2, '0');\r\n case 'mm':\r\n return date.getMinutes().toString().padStart(2, '0');\r\n case 'ss':\r\n return date.getSeconds().toString().padStart(2, '0');\r\n default:\r\n return match;\r\n }\r\n }) \r\n};\r\n\r\nexport { dateToString };","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 Router {\r\n readonly router: RouterType;\r\n private pendingMiddleware: RequestHandler[] = [];\r\n private pnedingPath: 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.pnedingPath = 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.pnedingPath,\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.pnedingPath = \"\";\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\nexport { Router };"],"mappings":"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","names":["color","path","fs","ExpressRouter","path"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.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 { logger } from \"./core/logger.js\";\r\nexport { Router, QuickRouter } from \"./core/router.js\";\r\nexport { Server } from \"./core/server.js\";\r\nimport { Cron } from \"./cron/cron.js\";\r\nimport { Status } from \"./http/status.js\";","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 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\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 \"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 },\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 },\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};","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 QuickRouter {\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 QuickRouter;\r\n}\r\n\r\nexport { QuickRouter, Router };","import express, { type Express, type RequestHandler } from \"express\";\r\nimport http, { type Server as HTTPServer } from \"node:http\";\r\n\r\nimport type { QuickRouter } from \"./router.js\";\r\nimport { logger } from \"./logger.js\";\r\nimport { translate } from \"./translator.js\";\r\nimport { isValidTimeZone } from \"./time.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, QuickRouter>;\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 httpQuikServer: HTTPServer;\r\n middlewares: RequestHandler[] = [];\r\n routes: RoutingDict = {};\r\n #config: QuikServerConfig;\r\n\r\n constructor() {\r\n this.app = express();\r\n this.#config = structuredClone(defaultConfig);\r\n this.httpQuikServer = http.createServer(\r\n this.app\r\n );\r\n }\r\n\r\n config(): Readonly<QuikServerConfig> {\r\n return Object.freeze(structuredClone(this.#config));\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 middleware(...middlewares: RequestHandler[]) {\r\n this.middlewares.push(\r\n ...middlewares\r\n );\r\n\r\n return this;\r\n }\r\n\r\n route(path: string, router: QuickRouter) {\r\n this.routes[path] = router;\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.httpQuikServer.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 #configureHTTP() {\r\n const config = this.#config.http;\r\n\r\n if (config.timeout)\r\n this.httpQuikServer.timeout = config.timeout;\r\n\r\n if (config.keepAlive)\r\n this.httpQuikServer.keepAliveTimeout = config.keepAlive;\r\n\r\n if (config.maxConnections)\r\n this.httpQuikServer.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\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\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};","import cron, { 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\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 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 { Cron };\r\n"],"mappings":"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","names":["color","path","fs","ExpressRouter","path","import_express","defaultConfig","express","http","config","path"]}
|
package/dist/index.d.cts
CHANGED
|
@@ -1,16 +1,19 @@
|
|
|
1
|
-
import { Router as Router$1, RequestHandler } from 'express';
|
|
1
|
+
import express, { Router as Router$1, RequestHandler, Express } from 'express';
|
|
2
|
+
import { Server as Server$1 } from 'node:http';
|
|
2
3
|
|
|
3
4
|
type ConfigValue = string | null | false;
|
|
4
5
|
type Cases = "uppercase" | "lowercase" | "capitalize" | "none" | null;
|
|
5
6
|
type ColorName = "black" | "red" | "green" | "yellow" | "blue" | "magenta" | "cyan" | "white";
|
|
6
7
|
type ColorValue = ColorName | null;
|
|
7
8
|
type SaveConfig = {
|
|
9
|
+
infoFilePath: ConfigValue;
|
|
8
10
|
logFilePath: ConfigValue;
|
|
9
11
|
errorFilePath: ConfigValue;
|
|
10
12
|
warningFilePath: ConfigValue;
|
|
11
13
|
};
|
|
12
14
|
type ColorConfig = {
|
|
13
15
|
logColor: ColorValue;
|
|
16
|
+
infoColor: ColorValue;
|
|
14
17
|
errorColor: ColorValue;
|
|
15
18
|
warningColor: ColorValue;
|
|
16
19
|
debugColor: ColorValue;
|
|
@@ -20,8 +23,10 @@ type Formatconfig = {
|
|
|
20
23
|
titleCase: Cases;
|
|
21
24
|
prefix?: string;
|
|
22
25
|
suffix?: string;
|
|
26
|
+
timeZone?: string;
|
|
23
27
|
};
|
|
24
|
-
type
|
|
28
|
+
type LoggerConfig = {
|
|
29
|
+
language: Language;
|
|
25
30
|
save: SaveConfig;
|
|
26
31
|
color: ColorConfig;
|
|
27
32
|
format: Formatconfig;
|
|
@@ -33,18 +38,19 @@ type PartialConfig = Partial<{
|
|
|
33
38
|
}>;
|
|
34
39
|
declare const logger: {
|
|
35
40
|
setConfig(newConfig: PartialConfig): void;
|
|
36
|
-
config(): Readonly<
|
|
41
|
+
config(): Readonly<LoggerConfig>;
|
|
37
42
|
log(...content: unknown[]): void;
|
|
43
|
+
info(...content: unknown[]): void;
|
|
38
44
|
error(...content: unknown[]): void;
|
|
39
45
|
warning(...content: unknown[]): void;
|
|
40
46
|
debug(...content: unknown[]): void;
|
|
41
47
|
custom(level: string, color: ColorName | null | false, file: ConfigValue, ...content: unknown[]): void;
|
|
42
48
|
};
|
|
43
49
|
|
|
44
|
-
declare class
|
|
50
|
+
declare class QuickRouter {
|
|
45
51
|
readonly router: Router$1;
|
|
46
52
|
private pendingMiddleware;
|
|
47
|
-
private
|
|
53
|
+
private currentPath;
|
|
48
54
|
constructor();
|
|
49
55
|
middleware(...handlers: RequestHandler[]): this;
|
|
50
56
|
path(path: string): this;
|
|
@@ -55,5 +61,58 @@ declare class Router {
|
|
|
55
61
|
patch(handler: RequestHandler): this;
|
|
56
62
|
delete(handler: RequestHandler): this;
|
|
57
63
|
}
|
|
64
|
+
declare function Router(): QuickRouter;
|
|
58
65
|
|
|
59
|
-
|
|
66
|
+
type JsonOptions = Parameters<typeof express.json>[0];
|
|
67
|
+
type UrlencodedOptions = Parameters<typeof express.urlencoded>[0];
|
|
68
|
+
type RawOptions = Parameters<typeof express.raw>[0];
|
|
69
|
+
type TextOptions = Parameters<typeof express.text>[0];
|
|
70
|
+
type BodyParserConfig = {
|
|
71
|
+
type: "json";
|
|
72
|
+
options?: JsonOptions;
|
|
73
|
+
} | {
|
|
74
|
+
type: "urlencoded";
|
|
75
|
+
options?: UrlencodedOptions;
|
|
76
|
+
} | {
|
|
77
|
+
type: "raw";
|
|
78
|
+
options?: RawOptions;
|
|
79
|
+
} | {
|
|
80
|
+
type: "text";
|
|
81
|
+
options?: TextOptions;
|
|
82
|
+
};
|
|
83
|
+
type HTTPConfig = {
|
|
84
|
+
port: number;
|
|
85
|
+
host?: string;
|
|
86
|
+
keepAlive?: number;
|
|
87
|
+
timeout?: number;
|
|
88
|
+
maxConnections?: number;
|
|
89
|
+
shutdownTimeout?: number;
|
|
90
|
+
};
|
|
91
|
+
type ExpressConfig = {
|
|
92
|
+
trustProxy?: boolean;
|
|
93
|
+
};
|
|
94
|
+
type QuikServerConfig = {
|
|
95
|
+
language: Language;
|
|
96
|
+
timeZone?: string;
|
|
97
|
+
bodyParser: BodyParserConfig;
|
|
98
|
+
http: HTTPConfig;
|
|
99
|
+
express: ExpressConfig;
|
|
100
|
+
};
|
|
101
|
+
type RoutingDict = Record<string, QuickRouter>;
|
|
102
|
+
declare class QuikServer {
|
|
103
|
+
#private;
|
|
104
|
+
app: Express;
|
|
105
|
+
httpQuikServer: Server$1;
|
|
106
|
+
middlewares: RequestHandler[];
|
|
107
|
+
routes: RoutingDict;
|
|
108
|
+
constructor();
|
|
109
|
+
config(): Readonly<QuikServerConfig>;
|
|
110
|
+
setConfig(config: Partial<QuikServerConfig>): this;
|
|
111
|
+
middleware(...middlewares: RequestHandler[]): this;
|
|
112
|
+
route(path: string, router: QuickRouter): this;
|
|
113
|
+
listen(): this;
|
|
114
|
+
start(): this;
|
|
115
|
+
}
|
|
116
|
+
declare function Server(): QuikServer;
|
|
117
|
+
|
|
118
|
+
export { QuickRouter, Router, Server, logger };
|
package/dist/index.d.ts
CHANGED
|
@@ -1,16 +1,19 @@
|
|
|
1
|
-
import { Router as Router$1, RequestHandler } from 'express';
|
|
1
|
+
import express, { Router as Router$1, RequestHandler, Express } from 'express';
|
|
2
|
+
import { Server as Server$1 } from 'node:http';
|
|
2
3
|
|
|
3
4
|
type ConfigValue = string | null | false;
|
|
4
5
|
type Cases = "uppercase" | "lowercase" | "capitalize" | "none" | null;
|
|
5
6
|
type ColorName = "black" | "red" | "green" | "yellow" | "blue" | "magenta" | "cyan" | "white";
|
|
6
7
|
type ColorValue = ColorName | null;
|
|
7
8
|
type SaveConfig = {
|
|
9
|
+
infoFilePath: ConfigValue;
|
|
8
10
|
logFilePath: ConfigValue;
|
|
9
11
|
errorFilePath: ConfigValue;
|
|
10
12
|
warningFilePath: ConfigValue;
|
|
11
13
|
};
|
|
12
14
|
type ColorConfig = {
|
|
13
15
|
logColor: ColorValue;
|
|
16
|
+
infoColor: ColorValue;
|
|
14
17
|
errorColor: ColorValue;
|
|
15
18
|
warningColor: ColorValue;
|
|
16
19
|
debugColor: ColorValue;
|
|
@@ -20,8 +23,10 @@ type Formatconfig = {
|
|
|
20
23
|
titleCase: Cases;
|
|
21
24
|
prefix?: string;
|
|
22
25
|
suffix?: string;
|
|
26
|
+
timeZone?: string;
|
|
23
27
|
};
|
|
24
|
-
type
|
|
28
|
+
type LoggerConfig = {
|
|
29
|
+
language: Language;
|
|
25
30
|
save: SaveConfig;
|
|
26
31
|
color: ColorConfig;
|
|
27
32
|
format: Formatconfig;
|
|
@@ -33,18 +38,19 @@ type PartialConfig = Partial<{
|
|
|
33
38
|
}>;
|
|
34
39
|
declare const logger: {
|
|
35
40
|
setConfig(newConfig: PartialConfig): void;
|
|
36
|
-
config(): Readonly<
|
|
41
|
+
config(): Readonly<LoggerConfig>;
|
|
37
42
|
log(...content: unknown[]): void;
|
|
43
|
+
info(...content: unknown[]): void;
|
|
38
44
|
error(...content: unknown[]): void;
|
|
39
45
|
warning(...content: unknown[]): void;
|
|
40
46
|
debug(...content: unknown[]): void;
|
|
41
47
|
custom(level: string, color: ColorName | null | false, file: ConfigValue, ...content: unknown[]): void;
|
|
42
48
|
};
|
|
43
49
|
|
|
44
|
-
declare class
|
|
50
|
+
declare class QuickRouter {
|
|
45
51
|
readonly router: Router$1;
|
|
46
52
|
private pendingMiddleware;
|
|
47
|
-
private
|
|
53
|
+
private currentPath;
|
|
48
54
|
constructor();
|
|
49
55
|
middleware(...handlers: RequestHandler[]): this;
|
|
50
56
|
path(path: string): this;
|
|
@@ -55,5 +61,58 @@ declare class Router {
|
|
|
55
61
|
patch(handler: RequestHandler): this;
|
|
56
62
|
delete(handler: RequestHandler): this;
|
|
57
63
|
}
|
|
64
|
+
declare function Router(): QuickRouter;
|
|
58
65
|
|
|
59
|
-
|
|
66
|
+
type JsonOptions = Parameters<typeof express.json>[0];
|
|
67
|
+
type UrlencodedOptions = Parameters<typeof express.urlencoded>[0];
|
|
68
|
+
type RawOptions = Parameters<typeof express.raw>[0];
|
|
69
|
+
type TextOptions = Parameters<typeof express.text>[0];
|
|
70
|
+
type BodyParserConfig = {
|
|
71
|
+
type: "json";
|
|
72
|
+
options?: JsonOptions;
|
|
73
|
+
} | {
|
|
74
|
+
type: "urlencoded";
|
|
75
|
+
options?: UrlencodedOptions;
|
|
76
|
+
} | {
|
|
77
|
+
type: "raw";
|
|
78
|
+
options?: RawOptions;
|
|
79
|
+
} | {
|
|
80
|
+
type: "text";
|
|
81
|
+
options?: TextOptions;
|
|
82
|
+
};
|
|
83
|
+
type HTTPConfig = {
|
|
84
|
+
port: number;
|
|
85
|
+
host?: string;
|
|
86
|
+
keepAlive?: number;
|
|
87
|
+
timeout?: number;
|
|
88
|
+
maxConnections?: number;
|
|
89
|
+
shutdownTimeout?: number;
|
|
90
|
+
};
|
|
91
|
+
type ExpressConfig = {
|
|
92
|
+
trustProxy?: boolean;
|
|
93
|
+
};
|
|
94
|
+
type QuikServerConfig = {
|
|
95
|
+
language: Language;
|
|
96
|
+
timeZone?: string;
|
|
97
|
+
bodyParser: BodyParserConfig;
|
|
98
|
+
http: HTTPConfig;
|
|
99
|
+
express: ExpressConfig;
|
|
100
|
+
};
|
|
101
|
+
type RoutingDict = Record<string, QuickRouter>;
|
|
102
|
+
declare class QuikServer {
|
|
103
|
+
#private;
|
|
104
|
+
app: Express;
|
|
105
|
+
httpQuikServer: Server$1;
|
|
106
|
+
middlewares: RequestHandler[];
|
|
107
|
+
routes: RoutingDict;
|
|
108
|
+
constructor();
|
|
109
|
+
config(): Readonly<QuikServerConfig>;
|
|
110
|
+
setConfig(config: Partial<QuikServerConfig>): this;
|
|
111
|
+
middleware(...middlewares: RequestHandler[]): this;
|
|
112
|
+
route(path: string, router: QuickRouter): this;
|
|
113
|
+
listen(): this;
|
|
114
|
+
start(): this;
|
|
115
|
+
}
|
|
116
|
+
declare function Server(): QuikServer;
|
|
117
|
+
|
|
118
|
+
export { QuickRouter, Router, Server, logger };
|
package/dist/index.js
CHANGED
|
@@ -24,37 +24,114 @@ var colors = Object.fromEntries(
|
|
|
24
24
|
);
|
|
25
25
|
|
|
26
26
|
// src/core/time.ts
|
|
27
|
-
function dateToString(date, format) {
|
|
27
|
+
function dateToString(date, format, timeZone) {
|
|
28
|
+
const formatter = new Intl.DateTimeFormat("en-US", {
|
|
29
|
+
timeZone,
|
|
30
|
+
year: "numeric",
|
|
31
|
+
month: "2-digit",
|
|
32
|
+
day: "2-digit",
|
|
33
|
+
hour: "2-digit",
|
|
34
|
+
minute: "2-digit",
|
|
35
|
+
second: "2-digit",
|
|
36
|
+
hourCycle: "h23"
|
|
37
|
+
});
|
|
38
|
+
const parts = formatter.formatToParts(date);
|
|
39
|
+
const values = Object.fromEntries(
|
|
40
|
+
parts.filter(({ type }) => type !== "literal").map(({ type, value }) => [type, value])
|
|
41
|
+
);
|
|
28
42
|
return format.replace(/(YYYY|MM|DD|hh|mm|ss)/g, (match) => {
|
|
29
43
|
switch (match) {
|
|
30
44
|
case "YYYY":
|
|
31
|
-
return
|
|
45
|
+
return values.year || "";
|
|
32
46
|
case "MM":
|
|
33
|
-
return
|
|
47
|
+
return values.month || "";
|
|
34
48
|
case "DD":
|
|
35
|
-
return
|
|
49
|
+
return values.day || "";
|
|
36
50
|
case "hh":
|
|
37
|
-
return
|
|
51
|
+
return values.hour || "";
|
|
38
52
|
case "mm":
|
|
39
|
-
return
|
|
53
|
+
return values.minute || "";
|
|
40
54
|
case "ss":
|
|
41
|
-
return
|
|
55
|
+
return values.second || "";
|
|
42
56
|
default:
|
|
43
57
|
return match;
|
|
44
58
|
}
|
|
45
59
|
});
|
|
46
60
|
}
|
|
61
|
+
function isValidTimeZone(timeZone) {
|
|
62
|
+
try {
|
|
63
|
+
new Intl.DateTimeFormat("en-US", {
|
|
64
|
+
timeZone
|
|
65
|
+
});
|
|
66
|
+
return true;
|
|
67
|
+
} catch {
|
|
68
|
+
return false;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
// src/locales/en.json
|
|
73
|
+
var en_default = {
|
|
74
|
+
logger: {
|
|
75
|
+
levels: {
|
|
76
|
+
log: "log",
|
|
77
|
+
info: "info",
|
|
78
|
+
warning: "warning",
|
|
79
|
+
error: "error",
|
|
80
|
+
debug: "debug"
|
|
81
|
+
}
|
|
82
|
+
},
|
|
83
|
+
server: {
|
|
84
|
+
name: "server",
|
|
85
|
+
start: "Server running at"
|
|
86
|
+
},
|
|
87
|
+
time: {
|
|
88
|
+
invalidTimeZone1: "Invalid time zone:",
|
|
89
|
+
invalidTimeZone2: "Using system default time zone."
|
|
90
|
+
}
|
|
91
|
+
};
|
|
92
|
+
|
|
93
|
+
// src/locales/es.json
|
|
94
|
+
var es_default = {
|
|
95
|
+
logger: {
|
|
96
|
+
levels: {
|
|
97
|
+
log: "log",
|
|
98
|
+
info: "info",
|
|
99
|
+
warning: "advertencia",
|
|
100
|
+
error: "error",
|
|
101
|
+
debug: "depuraci\xF3n"
|
|
102
|
+
}
|
|
103
|
+
},
|
|
104
|
+
server: {
|
|
105
|
+
name: "servidor",
|
|
106
|
+
start: "Servidor corriendo en"
|
|
107
|
+
},
|
|
108
|
+
time: {
|
|
109
|
+
invalidTimeZone1: "Zona horaria inv\xE1lida:",
|
|
110
|
+
invalidTimeZone2: "Usando la zona horaria predeterminada del sistema."
|
|
111
|
+
}
|
|
112
|
+
};
|
|
113
|
+
|
|
114
|
+
// src/core/translator.ts
|
|
115
|
+
var locales = {
|
|
116
|
+
en: en_default,
|
|
117
|
+
es: es_default
|
|
118
|
+
};
|
|
119
|
+
function translate(language, key) {
|
|
120
|
+
return locales[language][key];
|
|
121
|
+
}
|
|
47
122
|
|
|
48
123
|
// src/core/logger.ts
|
|
49
124
|
var defaultConfig = {
|
|
125
|
+
language: "en",
|
|
50
126
|
save: {
|
|
51
127
|
logFilePath: null,
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
warningFilePath:
|
|
128
|
+
infoFilePath: null,
|
|
129
|
+
errorFilePath: "logs/error.log",
|
|
130
|
+
warningFilePath: "logs/warning.log"
|
|
55
131
|
},
|
|
56
132
|
color: {
|
|
57
133
|
logColor: "blue",
|
|
134
|
+
infoColor: "green",
|
|
58
135
|
errorColor: "red",
|
|
59
136
|
warningColor: "yellow",
|
|
60
137
|
debugColor: null
|
|
@@ -99,7 +176,17 @@ function write(level, color2, file, ...content) {
|
|
|
99
176
|
function parseContent(level, ...body) {
|
|
100
177
|
let header = "";
|
|
101
178
|
if (config.format.timestampFormat) {
|
|
102
|
-
const
|
|
179
|
+
const now = /* @__PURE__ */ new Date();
|
|
180
|
+
const timeZone = config.format.timeZone;
|
|
181
|
+
let tz = timeZone;
|
|
182
|
+
if (timeZone && !isValidTimeZone(timeZone)) {
|
|
183
|
+
tz = void 0;
|
|
184
|
+
}
|
|
185
|
+
const timestamp = dateToString(
|
|
186
|
+
now,
|
|
187
|
+
config.format.timestampFormat,
|
|
188
|
+
tz
|
|
189
|
+
);
|
|
103
190
|
header += `${timestamp} `;
|
|
104
191
|
}
|
|
105
192
|
switch (config.format.titleCase) {
|
|
@@ -131,6 +218,8 @@ function saveToFile(filePath, content) {
|
|
|
131
218
|
}
|
|
132
219
|
function mergeConfig(current, update) {
|
|
133
220
|
return {
|
|
221
|
+
...current,
|
|
222
|
+
...update,
|
|
134
223
|
save: {
|
|
135
224
|
...current.save,
|
|
136
225
|
...update.save
|
|
@@ -155,32 +244,45 @@ var logger = {
|
|
|
155
244
|
return Object.freeze(structuredClone(config));
|
|
156
245
|
},
|
|
157
246
|
log(...content) {
|
|
247
|
+
const messages = translate(config.language, "logger");
|
|
158
248
|
write(
|
|
159
|
-
|
|
249
|
+
messages.levels.log,
|
|
160
250
|
config.color.logColor,
|
|
161
251
|
config.save.logFilePath,
|
|
162
252
|
...content
|
|
163
253
|
);
|
|
164
254
|
},
|
|
255
|
+
info(...content) {
|
|
256
|
+
const messages = translate(config.language, "logger");
|
|
257
|
+
write(
|
|
258
|
+
messages.levels.info,
|
|
259
|
+
config.color.infoColor,
|
|
260
|
+
config.save.infoFilePath,
|
|
261
|
+
...content
|
|
262
|
+
);
|
|
263
|
+
},
|
|
165
264
|
error(...content) {
|
|
265
|
+
const messages = translate(config.language, "logger");
|
|
166
266
|
write(
|
|
167
|
-
|
|
267
|
+
messages.levels.error,
|
|
168
268
|
config.color.errorColor,
|
|
169
269
|
config.save.errorFilePath,
|
|
170
270
|
...content
|
|
171
271
|
);
|
|
172
272
|
},
|
|
173
273
|
warning(...content) {
|
|
274
|
+
const messages = translate(config.language, "logger");
|
|
174
275
|
write(
|
|
175
|
-
|
|
276
|
+
messages.levels.warning,
|
|
176
277
|
config.color.warningColor,
|
|
177
278
|
config.save.warningFilePath,
|
|
178
279
|
...content
|
|
179
280
|
);
|
|
180
281
|
},
|
|
181
282
|
debug(...content) {
|
|
283
|
+
const messages = translate(config.language, "logger");
|
|
182
284
|
write(
|
|
183
|
-
|
|
285
|
+
messages.levels.debug,
|
|
184
286
|
config.color.debugColor,
|
|
185
287
|
null,
|
|
186
288
|
...content
|
|
@@ -193,10 +295,10 @@ var logger = {
|
|
|
193
295
|
|
|
194
296
|
// src/core/router.ts
|
|
195
297
|
import { Router as ExpressRouter } from "express";
|
|
196
|
-
var
|
|
298
|
+
var QuickRouter = class {
|
|
197
299
|
router;
|
|
198
300
|
pendingMiddleware = [];
|
|
199
|
-
|
|
301
|
+
currentPath = "";
|
|
200
302
|
constructor() {
|
|
201
303
|
this.router = ExpressRouter();
|
|
202
304
|
}
|
|
@@ -205,12 +307,12 @@ var Router = class {
|
|
|
205
307
|
return this;
|
|
206
308
|
}
|
|
207
309
|
path(path2) {
|
|
208
|
-
this.
|
|
310
|
+
this.currentPath = path2;
|
|
209
311
|
return this;
|
|
210
312
|
}
|
|
211
313
|
register(method, handler) {
|
|
212
314
|
this.router[method](
|
|
213
|
-
this.
|
|
315
|
+
this.currentPath,
|
|
214
316
|
...this.pendingMiddleware,
|
|
215
317
|
async (req, res, next) => {
|
|
216
318
|
try {
|
|
@@ -221,7 +323,7 @@ var Router = class {
|
|
|
221
323
|
}
|
|
222
324
|
);
|
|
223
325
|
this.pendingMiddleware = [];
|
|
224
|
-
this.
|
|
326
|
+
this.currentPath = "";
|
|
225
327
|
return this;
|
|
226
328
|
}
|
|
227
329
|
get(handler) {
|
|
@@ -240,8 +342,158 @@ var Router = class {
|
|
|
240
342
|
return this.register("delete", handler);
|
|
241
343
|
}
|
|
242
344
|
};
|
|
345
|
+
function Router() {
|
|
346
|
+
return new QuickRouter();
|
|
347
|
+
}
|
|
348
|
+
|
|
349
|
+
// src/core/server.ts
|
|
350
|
+
import express from "express";
|
|
351
|
+
import http from "http";
|
|
352
|
+
var defaultConfig2 = {
|
|
353
|
+
language: "en",
|
|
354
|
+
bodyParser: {
|
|
355
|
+
type: "json"
|
|
356
|
+
},
|
|
357
|
+
http: {
|
|
358
|
+
port: 8080
|
|
359
|
+
},
|
|
360
|
+
express: {}
|
|
361
|
+
};
|
|
362
|
+
var QuikServer = class {
|
|
363
|
+
app;
|
|
364
|
+
httpQuikServer;
|
|
365
|
+
middlewares = [];
|
|
366
|
+
routes = {};
|
|
367
|
+
#config;
|
|
368
|
+
constructor() {
|
|
369
|
+
this.app = express();
|
|
370
|
+
this.#config = structuredClone(defaultConfig2);
|
|
371
|
+
this.httpQuikServer = http.createServer(
|
|
372
|
+
this.app
|
|
373
|
+
);
|
|
374
|
+
}
|
|
375
|
+
config() {
|
|
376
|
+
return Object.freeze(structuredClone(this.#config));
|
|
377
|
+
}
|
|
378
|
+
setConfig(config2) {
|
|
379
|
+
this.#config = {
|
|
380
|
+
...this.#config,
|
|
381
|
+
...config2,
|
|
382
|
+
http: {
|
|
383
|
+
...this.#config.http,
|
|
384
|
+
...config2.http
|
|
385
|
+
},
|
|
386
|
+
express: {
|
|
387
|
+
...this.#config.express,
|
|
388
|
+
...config2.express
|
|
389
|
+
}
|
|
390
|
+
};
|
|
391
|
+
if (config2.timeZone && !isValidTimeZone(config2.timeZone)) {
|
|
392
|
+
const messages = translate(this.#config.language, "time");
|
|
393
|
+
logger.warning(
|
|
394
|
+
`${messages.invalidTimeZone1} ${config2.timeZone}. ${messages.invalidTimeZone2}`
|
|
395
|
+
);
|
|
396
|
+
}
|
|
397
|
+
return this;
|
|
398
|
+
}
|
|
399
|
+
middleware(...middlewares) {
|
|
400
|
+
this.middlewares.push(
|
|
401
|
+
...middlewares
|
|
402
|
+
);
|
|
403
|
+
return this;
|
|
404
|
+
}
|
|
405
|
+
route(path2, router) {
|
|
406
|
+
this.routes[path2] = router;
|
|
407
|
+
return this;
|
|
408
|
+
}
|
|
409
|
+
listen() {
|
|
410
|
+
const { port, host } = this.#config.http;
|
|
411
|
+
const messages = translate(this.#config.language, "server");
|
|
412
|
+
this.httpQuikServer.listen(
|
|
413
|
+
port,
|
|
414
|
+
host,
|
|
415
|
+
() => {
|
|
416
|
+
logger.info(`${messages.start} ${host ?? "localhost"}:${port}`);
|
|
417
|
+
}
|
|
418
|
+
);
|
|
419
|
+
return this;
|
|
420
|
+
}
|
|
421
|
+
#configureHTTP() {
|
|
422
|
+
const config2 = this.#config.http;
|
|
423
|
+
if (config2.timeout)
|
|
424
|
+
this.httpQuikServer.timeout = config2.timeout;
|
|
425
|
+
if (config2.keepAlive)
|
|
426
|
+
this.httpQuikServer.keepAliveTimeout = config2.keepAlive;
|
|
427
|
+
if (config2.maxConnections)
|
|
428
|
+
this.httpQuikServer.maxConnections = config2.maxConnections;
|
|
429
|
+
return this;
|
|
430
|
+
}
|
|
431
|
+
#configureExpress() {
|
|
432
|
+
const config2 = this.#config.express;
|
|
433
|
+
if (config2.trustProxy !== void 0) {
|
|
434
|
+
this.app.set(
|
|
435
|
+
"trust proxy",
|
|
436
|
+
config2.trustProxy
|
|
437
|
+
);
|
|
438
|
+
}
|
|
439
|
+
return this;
|
|
440
|
+
}
|
|
441
|
+
#configureMiddleware() {
|
|
442
|
+
const bodyParser = this.#config.bodyParser;
|
|
443
|
+
switch (bodyParser.type) {
|
|
444
|
+
case "json":
|
|
445
|
+
this.app.use(
|
|
446
|
+
express.json(bodyParser.options)
|
|
447
|
+
);
|
|
448
|
+
break;
|
|
449
|
+
case "urlencoded":
|
|
450
|
+
this.app.use(
|
|
451
|
+
express.urlencoded(bodyParser.options)
|
|
452
|
+
);
|
|
453
|
+
break;
|
|
454
|
+
case "raw":
|
|
455
|
+
this.app.use(
|
|
456
|
+
express.raw(bodyParser.options)
|
|
457
|
+
);
|
|
458
|
+
break;
|
|
459
|
+
case "text":
|
|
460
|
+
this.app.use(
|
|
461
|
+
express.text(bodyParser.options)
|
|
462
|
+
);
|
|
463
|
+
break;
|
|
464
|
+
}
|
|
465
|
+
if (this.middlewares.length > 0)
|
|
466
|
+
this.app.use(...this.middlewares);
|
|
467
|
+
return this;
|
|
468
|
+
}
|
|
469
|
+
#configureRoutes() {
|
|
470
|
+
for (const [path2, router] of Object.entries(this.routes)) {
|
|
471
|
+
this.app.use(
|
|
472
|
+
path2,
|
|
473
|
+
router.router
|
|
474
|
+
);
|
|
475
|
+
}
|
|
476
|
+
return this;
|
|
477
|
+
}
|
|
478
|
+
start() {
|
|
479
|
+
this.#configureExpress();
|
|
480
|
+
this.#configureMiddleware();
|
|
481
|
+
this.#configureRoutes();
|
|
482
|
+
this.#configureHTTP();
|
|
483
|
+
this.listen();
|
|
484
|
+
return this;
|
|
485
|
+
}
|
|
486
|
+
};
|
|
487
|
+
function Server() {
|
|
488
|
+
return new QuikServer();
|
|
489
|
+
}
|
|
490
|
+
|
|
491
|
+
// src/cron/cron.ts
|
|
492
|
+
import cron from "node-cron";
|
|
243
493
|
export {
|
|
494
|
+
QuickRouter,
|
|
244
495
|
Router,
|
|
496
|
+
Server,
|
|
245
497
|
logger
|
|
246
498
|
};
|
|
247
499
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/core/logger.ts","../src/core/colors.ts","../src/core/time.ts","../src/core/router.ts"],"sourcesContent":["import fs from \"node:fs\"\r\nimport path from \"node:path\";\r\n\r\nimport {colors} from \"./colors.js\"\r\nimport { dateToString } from \"./time.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 logFilePath: ConfigValue,\r\n errorFilePath: ConfigValue,\r\n warningFilePath: ConfigValue,\r\n}\r\ntype ColorConfig = {\r\n logColor: 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}\r\n\r\ntype Config = {\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: Config = {\r\n save: {\r\n logFilePath: null,\r\n errorFilePath: null, //\"logs/error.log\",\r\n warningFilePath: null,\r\n },\r\n color: {\r\n logColor: \"blue\",\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 timestamp = dateToString(new Date(), config.format.timestampFormat);\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: Config,\r\n update: PartialConfig\r\n): Config {\r\n return {\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<Config> {\r\n return Object.freeze(structuredClone(config));\r\n },\r\n\r\n log(...content: unknown[]) {\r\n write(\r\n \"log\",\r\n config.color.logColor,\r\n config.save.logFilePath,\r\n ...content\r\n );\r\n },\r\n\r\n error(...content: unknown[]) {\r\n write(\r\n \"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 write(\r\n \"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 write(\r\n \"debug\",\r\n config.color.debugColor,\r\n null,\r\n ...content\r\n );\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\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): string {\r\n return format.replace(/(YYYY|MM|DD|hh|mm|ss)/g, (match) => {\r\n switch (match) {\r\n case 'YYYY':\r\n return date.getFullYear().toString();\r\n case 'MM':\r\n return (date.getMonth() + 1).toString().padStart(2, '0');\r\n case 'DD':\r\n return date.getDate().toString().padStart(2, '0');\r\n case 'hh':\r\n return date.getHours().toString().padStart(2, '0');\r\n case 'mm':\r\n return date.getMinutes().toString().padStart(2, '0');\r\n case 'ss':\r\n return date.getSeconds().toString().padStart(2, '0');\r\n default:\r\n return match;\r\n }\r\n }) \r\n};\r\n\r\nexport { dateToString };","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 Router {\r\n readonly router: RouterType;\r\n private pendingMiddleware: RequestHandler[] = [];\r\n private pnedingPath: 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.pnedingPath = 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.pnedingPath,\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.pnedingPath = \"\";\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\nexport { Router };"],"mappings":"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","names":["color","path"]}
|
|
1
|
+
{"version":3,"sources":["../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":["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 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\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 \"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 },\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 },\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};","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 QuickRouter {\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 QuickRouter;\r\n}\r\n\r\nexport { QuickRouter, Router };","import express, { type Express, type RequestHandler } from \"express\";\r\nimport http, { type Server as HTTPServer } from \"node:http\";\r\n\r\nimport type { QuickRouter } from \"./router.js\";\r\nimport { logger } from \"./logger.js\";\r\nimport { translate } from \"./translator.js\";\r\nimport { isValidTimeZone } from \"./time.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, QuickRouter>;\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 httpQuikServer: HTTPServer;\r\n middlewares: RequestHandler[] = [];\r\n routes: RoutingDict = {};\r\n #config: QuikServerConfig;\r\n\r\n constructor() {\r\n this.app = express();\r\n this.#config = structuredClone(defaultConfig);\r\n this.httpQuikServer = http.createServer(\r\n this.app\r\n );\r\n }\r\n\r\n config(): Readonly<QuikServerConfig> {\r\n return Object.freeze(structuredClone(this.#config));\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 middleware(...middlewares: RequestHandler[]) {\r\n this.middlewares.push(\r\n ...middlewares\r\n );\r\n\r\n return this;\r\n }\r\n\r\n route(path: string, router: QuickRouter) {\r\n this.routes[path] = router;\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.httpQuikServer.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 #configureHTTP() {\r\n const config = this.#config.http;\r\n\r\n if (config.timeout)\r\n this.httpQuikServer.timeout = config.timeout;\r\n\r\n if (config.keepAlive)\r\n this.httpQuikServer.keepAliveTimeout = config.keepAlive;\r\n\r\n if (config.maxConnections)\r\n this.httpQuikServer.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\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\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};","import cron, { 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\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 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 { Cron };\r\n"],"mappings":";AAAA,OAAO,QAAQ;AACf,OAAO,UAAU;;;ACDjB,IAAM,QAAQ;AAAA,EACZ,OAAO;AAAA,EAEP,OAAO;AAAA,EACP,KAAK;AAAA,EACL,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,SAAS;AAAA,EACT,MAAM;AAAA,EACN,OAAO;AAAA,EAEP,MAAM;AAAA,EACN,WAAW;AACb;AAIA,IAAM,SAAS,OAAO;AAAA,EACpB,OAAO,QAAQ,KAAK,EACjB,OAAO,CAAC,CAAC,GAAG,MAAM,QAAQ,OAAO,EACjC,IAAI,CAAC,CAAC,KAAK,KAAK,MAAM;AAAA,IACrB;AAAA,IACA,CAAC,SAAiB,GAAG,KAAK,GAAG,IAAI,GAAG,MAAM,KAAK;AAAA,EACjD,CAAC;AACL;;;ACzBA,SAAS,aAAa,MAAY,QAAgB,UAA2B;AACzE,QAAM,YAAY,IAAI,KAAK,eAAe,SAAS;AAAA,IAC/C;AAAA,IACA,MAAM;AAAA,IACN,OAAO;AAAA,IACP,KAAK;AAAA,IACL,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,WAAW;AAAA,EACf,CAAC;AAED,QAAM,QAAQ,UAAU,cAAc,IAAI;AAC1C,QAAM,SAAS,OAAO;AAAA,IAClB,MACK,OAAO,CAAC,EAAE,KAAK,MAAM,SAAS,SAAS,EACvC,IAAI,CAAC,EAAE,MAAM,MAAM,MAAM,CAAC,MAAM,KAAK,CAAC;AAAA,EAC/C;AAEA,SAAO,OAAO,QAAQ,0BAA0B,CAAC,UAAkB;AAC/D,YAAQ,OAAO;AAAA,MACX,KAAK;AACD,eAAO,OAAO,QAAQ;AAAA,MAC1B,KAAK;AACD,eAAO,OAAO,SAAS;AAAA,MAC3B,KAAK;AACD,eAAO,OAAO,OAAO;AAAA,MACzB,KAAK;AACD,eAAO,OAAO,QAAQ;AAAA,MAC1B,KAAK;AACD,eAAO,OAAO,UAAU;AAAA,MAC5B,KAAK;AACD,eAAO,OAAO,UAAU;AAAA,MAC5B;AACI,eAAO;AAAA,IACf;AAAA,EACJ,CAAC;AACL;AAEA,SAAS,gBAAgB,UAA2B;AAChD,MAAI;AACA,QAAI,KAAK,eAAe,SAAS;AAAA,MAC7B;AAAA,IACJ,CAAC;AAED,WAAO;AAAA,EACX,QAAQ;AACJ,WAAO;AAAA,EACX;AACJ;;;ACjDA;AAAA,EACI,QAAU;AAAA,IACN,QAAU;AAAA,MACN,KAAO;AAAA,MACP,MAAQ;AAAA,MACR,SAAW;AAAA,MACX,OAAS;AAAA,MACT,OAAS;AAAA,IACb;AAAA,EACJ;AAAA,EACA,QAAU;AAAA,IACN,MAAQ;AAAA,IACR,OAAS;AAAA,EACb;AAAA,EACA,MAAQ;AAAA,IACJ,kBAAoB;AAAA,IACpB,kBAAoB;AAAA,EACxB;AACJ;;;AClBA;AAAA,EACI,QAAU;AAAA,IACN,QAAU;AAAA,MACN,KAAO;AAAA,MACP,MAAQ;AAAA,MACR,SAAW;AAAA,MACX,OAAS;AAAA,MACT,OAAS;AAAA,IACb;AAAA,EACJ;AAAA,EACA,QAAU;AAAA,IACN,MAAQ;AAAA,IACR,OAAS;AAAA,EACb;AAAA,EACA,MAAQ;AAAA,IACJ,kBAAoB;AAAA,IACpB,kBAAoB;AAAA,EACxB;AACJ;;;ACbA,IAAM,UAAU;AAAA,EACZ;AAAA,EACA;AACJ;AAKA,SAAS,UACL,UACA,KACS;AACT,SAAO,QAAQ,QAAQ,EAAE,GAAG;AAChC;;;ALoCA,IAAM,gBAA8B;AAAA,EAChC,UAAU;AAAA,EACV,MAAM;AAAA,IACF,aAAa;AAAA,IACb,cAAc;AAAA,IACd,eAAe;AAAA,IACf,iBAAiB;AAAA,EACrB;AAAA,EACA,OAAO;AAAA,IACH,UAAU;AAAA,IACV,WAAW;AAAA,IACX,YAAY;AAAA,IACZ,cAAc;AAAA,IACd,YAAY;AAAA,EAChB;AAAA,EACA,QAAQ;AAAA,IACJ,iBAAiB;AAAA,IACjB,WAAW;AAAA,EACf;AACJ;AAEA,IAAI,SAAS,gBAAgB,aAAa;AAE1C,SAAS,YAAY,MAA2B;AAC5C,SAAO,KAAK,IAAI,SAAO;AACnB,QAAI,OAAO,QAAQ,SAAU,QAAO;AAEpC,QAAI,eAAe,OAAO;AACtB,aAAO,IAAI,SAAS,IAAI;AAAA,IAC5B;AAEA,QAAI,QAAQ,QAAQ,QAAQ,QAAW;AACnC,aAAO,OAAO,GAAG;AAAA,IACrB;AAEA,QAAI,OAAO,QAAQ,UAAU;AACzB,UAAI;AACA,eAAO,KAAK,UAAU,GAAG;AAAA,MAC7B,QAAQ;AACJ,eAAO;AAAA,MACX;AAAA,IACJ;AAEA,WAAO,OAAO,GAAG;AAAA,EACrB,CAAC;AACL;AAEA,SAAS,MACL,OACAA,QACA,SACG,SACL;AACE,QAAM,CAAC,QAAQ,IAAI,IAAI,aAAa,OAAO,GAAG,OAAO;AACrD,aAAW,MAAM,SAAS,IAAI;AAE9B,QAAM,SAAS,OAAO,OAAO,UAAU;AACvC,QAAM,SAAS,OAAO,OAAO,UAAU;AAEvC,MAAIA,QAAO;AACP,UAAM,UAAU,OAAOA,MAAK,MAAM,CAAC,MAAc;AACjD,YAAQ,IAAI,GAAG,MAAM,GAAG,MAAM,GAAG,QAAQ,IAAI,CAAC,GAAG,MAAM,EAAE;AAAA,EAC7D,OAAO;AACH,YAAQ,IAAI,GAAG,MAAM,GAAG,MAAM,GAAG,IAAI,GAAG,MAAM,EAAE;AAAA,EACpD;AACJ;AAEA,SAAS,aAAa,UAAkB,MAAmC;AACvE,MAAI,SAAS;AACb,MAAI,OAAO,OAAO,iBAAiB;AAC/B,UAAM,MAAM,oBAAI,KAAK;AACrB,UAAM,WAAW,OAAO,OAAO;AAC/B,QAAI,KAAK;AAET,QAAI,YAAY,CAAC,gBAAgB,QAAQ,GAAG;AACxC,WAAK;AAAA,IACT;AAEA,UAAM,YAAY;AAAA,MACd;AAAA,MACA,OAAO,OAAO;AAAA,MACd;AAAA,IACJ;AAEA,cAAU,GAAG,SAAS;AAAA,EAC1B;AAEA,UAAQ,OAAO,OAAO,WAAW;AAAA,IAC7B,KAAK;AACD,cAAQ,IAAI,MAAM,YAAY,CAAC;AAC/B;AAAA,IACJ,KAAK;AACD,cAAQ,IAAI,MAAM,kBAAkB,CAAC;AACrC;AAAA,IACJ,KAAK;AACD,cAAQ,IAAI,MAAM,OAAO,CAAC,EAAE,YAAY,IAAI,MAAM,MAAM,CAAC,EAAE,YAAY,CAAC;AACxE;AAAA,IACJ,KAAK;AACD,cAAQ,IAAI,KAAK;AACjB;AAAA,IACJ;AACI,cAAQ;AACR;AAAA,EACR;AACA,MAAI,UAAU,QAAQ,SAAS,GAAG,IAAI,EAAE,KAAK,GAAG;AAChD,SAAO,CAAC,QAAQ,OAAO;AAC3B;AAEA,SAAS,WAAW,UAAuB,SAAuB;AAC9D,MAAI,CAAC,YAAY,CAAC,QAAQ,OAAQ;AAElC,QAAM,MAAM,KAAK,QAAQ,QAAQ;AACjC,QAAM,aAAa,UAAU;AAE7B,KAAG,UAAU,KAAK,EAAE,WAAW,KAAK,CAAC;AACrC,KAAG,eAAe,UAAU,UAAU;AAC1C;AAEA,SAAS,YACL,SACA,QACY;AACZ,SAAO;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,MAAM;AAAA,MACF,GAAG,QAAQ;AAAA,MACX,GAAG,OAAO;AAAA,IACd;AAAA,IACA,OAAO;AAAA,MACH,GAAG,QAAQ;AAAA,MACX,GAAG,OAAO;AAAA,IACd;AAAA,IACA,QAAQ;AAAA,MACJ,GAAG,QAAQ;AAAA,MACX,GAAG,OAAO;AAAA,IACd;AAAA,EACJ;AACJ;AAEO,IAAM,SAAS;AAAA;AAAA,EAElB,UAAU,WAAgC;AACtC,aAAS,YAAY,QAAQ,SAAS;AAAA,EAC1C;AAAA;AAAA,EAGA,SAAiC;AAC7B,WAAO,OAAO,OAAO,gBAAgB,MAAM,CAAC;AAAA,EAChD;AAAA,EAEA,OAAO,SAAoB;AACvB,UAAM,WAAW,UAAU,OAAO,UAAU,QAAQ;AACpD;AAAA,MACI,SAAS,OAAO;AAAA,MAChB,OAAO,MAAM;AAAA,MACb,OAAO,KAAK;AAAA,MACZ,GAAG;AAAA,IACP;AAAA,EACJ;AAAA,EAEA,QAAQ,SAAoB;AACxB,UAAM,WAAW,UAAU,OAAO,UAAU,QAAQ;AACpD;AAAA,MACI,SAAS,OAAO;AAAA,MAChB,OAAO,MAAM;AAAA,MACb,OAAO,KAAK;AAAA,MACZ,GAAG;AAAA,IACP;AAAA,EACJ;AAAA,EAEA,SAAS,SAAoB;AACzB,UAAM,WAAW,UAAU,OAAO,UAAU,QAAQ;AACpD;AAAA,MACI,SAAS,OAAO;AAAA,MAChB,OAAO,MAAM;AAAA,MACb,OAAO,KAAK;AAAA,MACZ,GAAG;AAAA,IACP;AAAA,EACJ;AAAA,EAEA,WAAW,SAAoB;AAC3B,UAAM,WAAW,UAAU,OAAO,UAAU,QAAQ;AACpD;AAAA,MACI,SAAS,OAAO;AAAA,MAChB,OAAO,MAAM;AAAA,MACb,OAAO,KAAK;AAAA,MACZ,GAAG;AAAA,IACP;AAAA,EACJ;AAAA,EAEA,SAAS,SAAoB;AACzB,UAAM,WAAW,UAAU,OAAO,UAAU,QAAQ;AACpD;AAAA,MACI,SAAS,OAAO;AAAA,MAChB,OAAO,MAAM;AAAA,MACb;AAAA,MACA,GAAG;AAAA,IACP;AAAA,EACJ;AAAA,EAEA,OACI,OACAA,QACA,SACG,SACL;AACE,UAAM,OAAOA,QAAO,MAAM,GAAG,OAAO;AAAA,EACxC;AAGJ;;;AMxQA,SAAS,UAAU,qBAAqB;AAYxC,IAAM,cAAN,MAAkB;AAAA,EACL;AAAA,EACD,oBAAsC,CAAC;AAAA,EACvC,cAAsB;AAAA,EAE9B,cAAc;AACV,SAAK,SAAS,cAAc;AAAA,EAChC;AAAA,EAEA,cAAc,UAA4B;AACtC,SAAK,kBAAkB,KAAK,GAAG,QAAQ;AACvC,WAAO;AAAA,EACX;AAAA,EAEA,KAAKC,OAAc;AACf,SAAK,cAAcA;AACnB,WAAO;AAAA,EACX;AAAA,EAEQ,SACJ,QACA,SACF;AACE,SAAK,OAAO,MAAM;AAAA,MACd,KAAK;AAAA,MACL,GAAG,KAAK;AAAA,MACR,OAAO,KAAK,KAAK,SAAS;AACtB,YAAI;AACA,gBAAM,QAAQ,KAAK,KAAK,IAAI;AAAA,QAChC,SAAS,KAAK;AACV,eAAK,GAAG;AAAA,QACZ;AAAA,MACJ;AAAA,IACJ;AAEA,SAAK,oBAAoB,CAAC;AAC1B,SAAK,cAAc;AAEnB,WAAO;AAAA,EACX;AAAA,EAEA,IAAI,SAAyB;AACzB,WAAO,KAAK,SAAS,OAAO,OAAO;AAAA,EACvC;AAAA,EAEA,KAAK,SAAyB;AAC1B,WAAO,KAAK,SAAS,QAAQ,OAAO;AAAA,EACxC;AAAA,EAEA,IAAI,SAAyB;AACzB,WAAO,KAAK,SAAS,OAAO,OAAO;AAAA,EACvC;AAAA,EAEA,MAAM,SAAyB;AAC3B,WAAO,KAAK,SAAS,SAAS,OAAO;AAAA,EACzC;AAAA,EAEA,OAAO,SAAyB;AAC5B,WAAO,KAAK,SAAS,UAAU,OAAO;AAAA,EAC1C;AAEJ;AAEA,SAAS,SAAS;AACd,SAAO,IAAI;AACf;;;AC9EA,OAAO,aAAoD;AAC3D,OAAO,UAAyC;AAiDhD,IAAMC,iBAAkC;AAAA,EACpC,UAAU;AAAA,EACV,YAAY;AAAA,IACR,MAAM;AAAA,EACV;AAAA,EAEA,MAAM;AAAA,IACF,MAAM;AAAA,EACV;AAAA,EAEA,SAAS,CAAC;AACd;AAEA,IAAM,aAAN,MAAiB;AAAA,EACb;AAAA,EACA;AAAA,EACA,cAAgC,CAAC;AAAA,EACjC,SAAsB,CAAC;AAAA,EACvB;AAAA,EAEA,cAAc;AACV,SAAK,MAAM,QAAQ;AACnB,SAAK,UAAU,gBAAgBA,cAAa;AAC5C,SAAK,iBAAiB,KAAK;AAAA,MACvB,KAAK;AAAA,IACT;AAAA,EACJ;AAAA,EAEA,SAAqC;AACjC,WAAO,OAAO,OAAO,gBAAgB,KAAK,OAAO,CAAC;AAAA,EACtD;AAAA,EAEA,UAAUC,SAAmC;AACzC,SAAK,UAAU;AAAA,MACX,GAAG,KAAK;AAAA,MACR,GAAGA;AAAA,MACH,MAAM;AAAA,QACF,GAAG,KAAK,QAAQ;AAAA,QAChB,GAAGA,QAAO;AAAA,MACd;AAAA,MACA,SAAS;AAAA,QACL,GAAG,KAAK,QAAQ;AAAA,QAChB,GAAGA,QAAO;AAAA,MACd;AAAA,IACJ;AAGA,QAAIA,QAAO,YAAY,CAAC,gBAAgBA,QAAO,QAAQ,GAAG;AACtD,YAAM,WAAW,UAAU,KAAK,QAAQ,UAAU,MAAM;AAExD,aAAO;AAAA,QACH,GAAG,SAAS,gBAAgB,IAAIA,QAAO,QAAQ,KAAK,SAAS,gBAAgB;AAAA,MACjF;AAAA,IACJ;AAEA,WAAO;AAAA,EACX;AAAA,EAEA,cAAc,aAA+B;AACzC,SAAK,YAAY;AAAA,MACb,GAAG;AAAA,IACP;AAEA,WAAO;AAAA,EACX;AAAA,EAEA,MAAMC,OAAc,QAAqB;AACrC,SAAK,OAAOA,KAAI,IAAI;AACpB,WAAO;AAAA,EACX;AAAA,EAGA,SAAS;AACL,UAAM,EAAE,MAAM,KAAK,IAAI,KAAK,QAAQ;AACpC,UAAM,WAAW,UAAU,KAAK,QAAQ,UAAU,QAAQ;AAE1D,SAAK,eAAe;AAAA,MAAO;AAAA,MAAM;AAAA,MAAM,MAAM;AACzC,eAAO,KAAK,GAAG,SAAS,KAAK,IAAI,QAAQ,WAAW,IAAI,IAAI,EAAE;AAAA,MAClE;AAAA,IACA;AAEA,WAAO;AAAA,EACX;AAAA,EAEA,iBAAiB;AACb,UAAMD,UAAS,KAAK,QAAQ;AAE5B,QAAIA,QAAO;AACP,WAAK,eAAe,UAAUA,QAAO;AAEzC,QAAIA,QAAO;AACP,WAAK,eAAe,mBAAmBA,QAAO;AAElD,QAAIA,QAAO;AACP,WAAK,eAAe,iBAAiBA,QAAO;AAEhD,WAAO;AAAA,EACX;AAAA,EAEA,oBAAoB;AAChB,UAAMA,UAAS,KAAK,QAAQ;AAE5B,QAAIA,QAAO,eAAe,QAAW;AACjC,WAAK,IAAI;AAAA,QACL;AAAA,QACAA,QAAO;AAAA,MACX;AAAA,IAEJ;AAEA,WAAO;AAAA,EACX;AAAA,EAEA,uBAAuB;AACnB,UAAM,aAAa,KAAK,QAAQ;AAEhC,YAAQ,WAAW,MAAM;AAAA,MACrB,KAAK;AACD,aAAK,IAAI;AAAA,UACL,QAAQ,KAAK,WAAW,OAAO;AAAA,QACnC;AACA;AAAA,MAGJ,KAAK;AACD,aAAK,IAAI;AAAA,UACL,QAAQ,WAAW,WAAW,OAAO;AAAA,QACzC;AACA;AAAA,MAGJ,KAAK;AACD,aAAK,IAAI;AAAA,UACL,QAAQ,IAAI,WAAW,OAAO;AAAA,QAClC;AACA;AAAA,MAGJ,KAAK;AACD,aAAK,IAAI;AAAA,UACL,QAAQ,KAAK,WAAW,OAAO;AAAA,QACnC;AACA;AAAA,IAER;AAEA,QAAI,KAAK,YAAY,SAAS;AAC1B,WAAK,IAAI,IAAI,GAAG,KAAK,WAAW;AAEpC,WAAO;AAAA,EACX;AAAA,EAGA,mBAAmB;AACf,eAAW,CAACC,OAAM,MAAM,KAAK,OAAO,QAAQ,KAAK,MAAM,GAAG;AACtD,WAAK,IAAI;AAAA,QACLA;AAAA,QACA,OAAO;AAAA,MACX;AAAA,IACJ;AAEA,WAAO;AAAA,EACX;AAAA,EAEA,QAAQ;AACJ,SAAK,kBAAkB;AACvB,SAAK,qBAAqB;AAC1B,SAAK,iBAAiB;AAEtB,SAAK,eAAe;AAEpB,SAAK,OAAO;AACZ,WAAO;AAAA,EACX;AACJ;AAEA,SAAS,SAAS;AACd,SAAO,IAAI,WAAW;AAC1B;;;ACpOA,OAAO,UAAkC;","names":["color","path","defaultConfig","config","path"]}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@desaubv/quik",
|
|
3
|
-
"version": "0.0.
|
|
4
|
-
"description": "Quik",
|
|
3
|
+
"version": "0.0.5",
|
|
4
|
+
"description": "Quik is an Express-based library designed to simplify the creation of modern backends. It allows you to build APIs quickly, reducing repetitive code through clean syntax and intuitive tools.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.cjs",
|
|
7
7
|
"module": "./dist/index.js",
|
|
@@ -11,7 +11,8 @@
|
|
|
11
11
|
"types": "./dist/index.d.ts",
|
|
12
12
|
"import": "./dist/index.js",
|
|
13
13
|
"require": "./dist/index.cjs"
|
|
14
|
-
}
|
|
14
|
+
},
|
|
15
|
+
"./cron": "./dist/cron/index.js"
|
|
15
16
|
},
|
|
16
17
|
"files": [
|
|
17
18
|
"dist"
|
|
@@ -22,20 +23,33 @@
|
|
|
22
23
|
},
|
|
23
24
|
"keywords": [
|
|
24
25
|
"quik",
|
|
25
|
-
"logger",
|
|
26
|
-
"logging",
|
|
27
26
|
"typescript",
|
|
28
|
-
"nodejs"
|
|
27
|
+
"nodejs",
|
|
28
|
+
"express",
|
|
29
|
+
"router",
|
|
30
|
+
"middleware",
|
|
31
|
+
"typescript",
|
|
32
|
+
"backend"
|
|
29
33
|
],
|
|
30
34
|
"author": "desaubv",
|
|
31
|
-
"
|
|
35
|
+
"homepage": "https://github.com/DiegoBarajas/quik",
|
|
36
|
+
"repository": {
|
|
37
|
+
"type": "git",
|
|
38
|
+
"url": "https://github.com/DiegoBarajas/quik.git"
|
|
39
|
+
},
|
|
40
|
+
"bugs": {
|
|
41
|
+
"url": "https://github.com/DiegoBarajas/quik/issues"
|
|
42
|
+
},
|
|
43
|
+
"license": "MIT",
|
|
32
44
|
"devDependencies": {
|
|
33
45
|
"@types/express": "^5.0.6",
|
|
34
46
|
"@types/node": "^26.1.2",
|
|
47
|
+
"@types/node-cron": "^3.0.11",
|
|
35
48
|
"tsup": "^8.5.1",
|
|
36
49
|
"typescript": "~5.9.3"
|
|
37
50
|
},
|
|
38
51
|
"dependencies": {
|
|
39
|
-
"express": "^5.2.1"
|
|
52
|
+
"express": "^5.2.1",
|
|
53
|
+
"node-cron": "^4.6.0"
|
|
40
54
|
}
|
|
41
55
|
}
|