@desaubv/quik 0.0.7 → 0.0.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cron/index.cjs.map +1 -1
- package/dist/cron/index.js.map +1 -1
- package/dist/http/index.cjs +218 -2
- package/dist/http/index.cjs.map +1 -1
- package/dist/http/index.d.cts +57 -1
- package/dist/http/index.d.ts +57 -1
- package/dist/http/index.js +214 -1
- package/dist/http/index.js.map +1 -1
- package/dist/index.cjs +45 -14
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +2 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +45 -14
- package/dist/index.js.map +1 -1
- package/package.json +69 -63
package/dist/index.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
// src/errors/
|
|
1
|
+
// src/core/errors/serverErrors.ts
|
|
2
2
|
var ServerInvalidRouteError = class extends Error {
|
|
3
|
-
constructor(
|
|
4
|
-
super(`"${
|
|
3
|
+
constructor(path3) {
|
|
4
|
+
super(`"${path3}" is not a QuikRouter instance.`);
|
|
5
5
|
}
|
|
6
6
|
};
|
|
7
7
|
var ServerInvalidCronError = class extends Error {
|
|
@@ -96,7 +96,9 @@ var en_default = {
|
|
|
96
96
|
name: "server",
|
|
97
97
|
start: "Server running at",
|
|
98
98
|
routers_loaded: "routers loaded",
|
|
99
|
-
crons_loaded: "crons loaded"
|
|
99
|
+
crons_loaded: "crons loaded",
|
|
100
|
+
static_loaded: "static dirs loaded",
|
|
101
|
+
static_warn: "directory does not exist"
|
|
100
102
|
},
|
|
101
103
|
time: {
|
|
102
104
|
invalidTimeZone1: "Invalid time zone:",
|
|
@@ -119,7 +121,9 @@ var es_default = {
|
|
|
119
121
|
name: "servidor",
|
|
120
122
|
start: "Servidor corriendo en",
|
|
121
123
|
routers_loaded: "rutas cargadas",
|
|
122
|
-
crons_loaded: "crons cargados"
|
|
124
|
+
crons_loaded: "crons cargados",
|
|
125
|
+
static_loaded: "carpetas estaticas cargadas",
|
|
126
|
+
static_warn: "no existe el directorio"
|
|
123
127
|
},
|
|
124
128
|
time: {
|
|
125
129
|
invalidTimeZone1: "Zona horaria inv\xE1lida:",
|
|
@@ -325,8 +329,8 @@ var QuikRouter = class {
|
|
|
325
329
|
this.pendingMiddleware.push(...handlers);
|
|
326
330
|
return this;
|
|
327
331
|
}
|
|
328
|
-
path(
|
|
329
|
-
this.currentPath =
|
|
332
|
+
path(path3) {
|
|
333
|
+
this.currentPath = path3;
|
|
330
334
|
return this;
|
|
331
335
|
}
|
|
332
336
|
register(method, handler) {
|
|
@@ -368,6 +372,8 @@ function Router() {
|
|
|
368
372
|
// src/core/server.ts
|
|
369
373
|
import express from "express";
|
|
370
374
|
import http from "http";
|
|
375
|
+
import path2 from "path";
|
|
376
|
+
import fs2 from "fs";
|
|
371
377
|
|
|
372
378
|
// src/cron/cron.ts
|
|
373
379
|
import cron from "node-cron";
|
|
@@ -389,6 +395,7 @@ var QuikServer = class {
|
|
|
389
395
|
httpServer;
|
|
390
396
|
middlewares = [];
|
|
391
397
|
routes = {};
|
|
398
|
+
staticDirs = [];
|
|
392
399
|
crons = [];
|
|
393
400
|
config;
|
|
394
401
|
constructor() {
|
|
@@ -425,13 +432,13 @@ var QuikServer = class {
|
|
|
425
432
|
);
|
|
426
433
|
return this;
|
|
427
434
|
}
|
|
428
|
-
addRoute(
|
|
435
|
+
addRoute(path3, router) {
|
|
429
436
|
if (!(router instanceof QuikRouter)) {
|
|
430
|
-
throw new ServerInvalidRouteError(
|
|
437
|
+
throw new ServerInvalidRouteError(path3);
|
|
431
438
|
}
|
|
432
|
-
if (!
|
|
433
|
-
|
|
434
|
-
this.routes[
|
|
439
|
+
if (!path3.startsWith("/"))
|
|
440
|
+
path3 = "/" + path3;
|
|
441
|
+
this.routes[path3] = router;
|
|
435
442
|
return this;
|
|
436
443
|
}
|
|
437
444
|
#listen() {
|
|
@@ -453,6 +460,20 @@ var QuikServer = class {
|
|
|
453
460
|
this.crons.push(cron2);
|
|
454
461
|
return this;
|
|
455
462
|
}
|
|
463
|
+
addStaticDir(...paths) {
|
|
464
|
+
for (const i in paths) {
|
|
465
|
+
const dir = paths[i] ?? "";
|
|
466
|
+
const dirPath = path2.resolve(dir);
|
|
467
|
+
const exists = fs2.existsSync(dirPath);
|
|
468
|
+
if (!exists) {
|
|
469
|
+
const messages = translate(this.config.language, "server");
|
|
470
|
+
logger.warning(`[ STATIC ] "${dir}" ${messages.static_warn}`);
|
|
471
|
+
continue;
|
|
472
|
+
}
|
|
473
|
+
this.staticDirs.push(...paths);
|
|
474
|
+
}
|
|
475
|
+
return this;
|
|
476
|
+
}
|
|
456
477
|
#configureHTTP() {
|
|
457
478
|
const config2 = this.config.http;
|
|
458
479
|
if (config2.timeout)
|
|
@@ -502,9 +523,9 @@ var QuikServer = class {
|
|
|
502
523
|
return this;
|
|
503
524
|
}
|
|
504
525
|
#configureRoutes() {
|
|
505
|
-
for (const [
|
|
526
|
+
for (const [path3, router] of Object.entries(this.routes)) {
|
|
506
527
|
this.app.use(
|
|
507
|
-
|
|
528
|
+
path3,
|
|
508
529
|
router.router
|
|
509
530
|
);
|
|
510
531
|
}
|
|
@@ -520,9 +541,19 @@ var QuikServer = class {
|
|
|
520
541
|
logger.info(`[ CRON ] ${this.crons.length} ${messages.crons_loaded}.`);
|
|
521
542
|
return this;
|
|
522
543
|
}
|
|
544
|
+
#loadStaticDirs() {
|
|
545
|
+
for (const dir of this.staticDirs) {
|
|
546
|
+
const dirPath = path2.resolve(dir);
|
|
547
|
+
this.app.use(express.static(dirPath));
|
|
548
|
+
}
|
|
549
|
+
const messages = translate(this.config.language, "server");
|
|
550
|
+
logger.info(`[ STATIC ] ${this.staticDirs.length} ${messages.static_loaded}.`);
|
|
551
|
+
return this;
|
|
552
|
+
}
|
|
523
553
|
start() {
|
|
524
554
|
this.#configureExpress();
|
|
525
555
|
this.#configureMiddleware();
|
|
556
|
+
this.#loadStaticDirs();
|
|
526
557
|
this.#configureRoutes();
|
|
527
558
|
this.#loadCrons();
|
|
528
559
|
this.#configureHTTP();
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/errors/serverError.ts","../src/core/logger.ts","../src/core/colors.ts","../src/core/time.ts","../src/locales/en.json","../src/locales/es.json","../src/core/translator.ts","../src/core/router.ts","../src/core/server.ts","../src/cron/cron.ts"],"sourcesContent":["class ServerInvalidRouteError extends Error {\r\n constructor(path: string) {\r\n super(`\"${path}\" is not a QuikRouter instance.`);\r\n }\r\n}\r\n\r\nclass ServerInvalidCronError extends Error {\r\n constructor() {\r\n super(`Invalid object, must be a QuikCron instance.`);\r\n }\r\n}\r\n\r\nexport { ServerInvalidRouteError, ServerInvalidCronError }","import fs from \"node:fs\"\r\nimport path from \"node:path\";\r\n\r\nimport { colors } from \"./colors.js\"\r\nimport { dateToString, isValidTimeZone } from \"./time.js\";\r\nimport { translate } from \"./translator.js\";\r\n\r\n/* Types */\r\ntype ConfigValue = string | null | false;\r\ntype Cases = \"uppercase\" | \"lowercase\" | \"capitalize\" | \"none\" | null;\r\ntype ColorName =\r\n | \"black\"\r\n | \"red\"\r\n | \"green\"\r\n | \"yellow\"\r\n | \"blue\"\r\n | \"magenta\"\r\n | \"cyan\"\r\n | \"white\";\r\n\r\ntype ColorValue = ColorName | null;\r\ntype SaveConfig = {\r\n infoFilePath: ConfigValue,\r\n logFilePath: ConfigValue,\r\n errorFilePath: ConfigValue,\r\n warningFilePath: ConfigValue,\r\n}\r\ntype ColorConfig = {\r\n logColor: ColorValue;\r\n infoColor: ColorValue;\r\n errorColor: ColorValue;\r\n warningColor: ColorValue;\r\n debugColor: ColorValue;\r\n}\r\ntype Formatconfig = {\r\n timestampFormat: ConfigValue,\r\n titleCase: Cases,\r\n prefix?: string\r\n suffix?: string\r\n timeZone?: string\r\n}\r\n\r\ntype LoggerConfig = {\r\n language: Language,\r\n save: SaveConfig,\r\n color: ColorConfig,\r\n format: Formatconfig,\r\n}\r\ntype PartialConfig = Partial<{\r\n save: Partial<SaveConfig>;\r\n color: Partial<ColorConfig>;\r\n format: Partial<Formatconfig>;\r\n}>;\r\n\r\nconst defaultConfig: LoggerConfig = {\r\n language: \"en\",\r\n save: {\r\n logFilePath: null,\r\n infoFilePath: null,\r\n errorFilePath: \"logs/error.log\",\r\n warningFilePath: \"logs/warning.log\",\r\n },\r\n color: {\r\n logColor: \"blue\",\r\n infoColor: \"green\",\r\n errorColor: \"red\",\r\n warningColor: \"yellow\",\r\n debugColor: null\r\n },\r\n format: {\r\n timestampFormat: \"DD-MM-YYYY hh:mm:ss\",\r\n titleCase: \"uppercase\"\r\n }\r\n}\r\n\r\nlet config = structuredClone(defaultConfig);\r\n\r\nfunction tokenize(...args: unknown[]): string[] {\r\n return args.map(arg => {\r\n if (typeof arg === \"string\") return arg;\r\n\r\n if (arg instanceof Error) {\r\n return arg.stack ?? arg.message;\r\n }\r\n\r\n if (arg === null || arg === undefined) {\r\n return String(arg);\r\n }\r\n\r\n if (typeof arg === \"object\") {\r\n try {\r\n return JSON.stringify(arg);\r\n } catch {\r\n return \"[Circular]\";\r\n }\r\n }\r\n\r\n return String(arg);\r\n });\r\n}\r\n\r\nfunction write(\r\n level: string,\r\n color: ColorName | null | false,\r\n file: ConfigValue,\r\n ...content: unknown[]\r\n) {\r\n const [header, body] = parseContent(level, ...content);\r\n saveToFile(file, header + body);\r\n\r\n const prefix = config.format.prefix ?? \"\";\r\n const suffix = config.format.suffix ?? \"\";\r\n\r\n if (color) {\r\n const colorFn = colors[color] ?? ((s: string) => s);\r\n console.log(`${prefix}${header}${colorFn(body)}${suffix}`);\r\n } else {\r\n console.log(`${prefix}${header}${body}${suffix}`);\r\n }\r\n}\r\n\r\nfunction parseContent(level: string, ...body: unknown[]): [string, string] {\r\n let header = \"\";\r\n if (config.format.timestampFormat) {\r\n const now = new Date();\r\n const timeZone = config.format.timeZone;\r\n let tz = timeZone;\r\n\r\n if (timeZone && !isValidTimeZone(timeZone)) {\r\n tz = undefined;\r\n }\r\n\r\n const timestamp = dateToString(\r\n now,\r\n config.format.timestampFormat,\r\n tz\r\n );\r\n\r\n header += `${timestamp} `;\r\n }\r\n\r\n switch (config.format.titleCase) {\r\n case \"uppercase\":\r\n level = `[${level.toUpperCase()}] `;\r\n break;\r\n case \"lowercase\":\r\n level = `[${level.toLocaleLowerCase()}] `;\r\n break;\r\n case \"capitalize\":\r\n level = `[${level.charAt(0).toUpperCase() + level.slice(1).toLowerCase()}] `;\r\n break;\r\n case \"none\":\r\n level = `[${level}] `;\r\n break;\r\n default:\r\n level = \"\";\r\n break;\r\n }\r\n let content = level + tokenize(...body).join(\" \");\r\n return [header, content];\r\n}\r\n\r\nfunction saveToFile(filePath: ConfigValue, content: string): void {\r\n if (!filePath || !content.length) return;\r\n\r\n const dir = path.dirname(filePath);\r\n const logMessage = content + \"\\n\";\r\n\r\n fs.mkdirSync(dir, { recursive: true });\r\n fs.appendFileSync(filePath, logMessage);\r\n}\r\n\r\nfunction mergeConfig(\r\n current: LoggerConfig,\r\n update: PartialConfig\r\n): LoggerConfig {\r\n return {\r\n ...current,\r\n ...update,\r\n save: {\r\n ...current.save,\r\n ...update.save,\r\n },\r\n color: {\r\n ...current.color,\r\n ...update.color,\r\n },\r\n format: {\r\n ...current.format,\r\n ...update.format,\r\n },\r\n };\r\n}\r\n\r\nexport const logger = {\r\n // Setter config\r\n setConfig(newConfig: PartialConfig): void {\r\n config = mergeConfig(config, newConfig);\r\n },\r\n\r\n // Getter config\r\n config(): Readonly<LoggerConfig> {\r\n return Object.freeze(structuredClone(config));\r\n },\r\n\r\n log(...content: unknown[]) {\r\n const messages = translate(config.language, \"logger\");\r\n write(\r\n messages.levels.log,\r\n config.color.logColor,\r\n config.save.logFilePath,\r\n ...content\r\n );\r\n },\r\n\r\n info(...content: unknown[]) {\r\n const messages = translate(config.language, \"logger\");\r\n write(\r\n messages.levels.info,\r\n config.color.infoColor,\r\n config.save.infoFilePath,\r\n ...content\r\n );\r\n },\r\n\r\n error(...content: unknown[]) {\r\n const messages = translate(config.language, \"logger\");\r\n write(\r\n messages.levels.error,\r\n config.color.errorColor,\r\n config.save.errorFilePath,\r\n ...content\r\n );\r\n },\r\n\r\n warning(...content: unknown[]) {\r\n const messages = translate(config.language, \"logger\");\r\n write(\r\n messages.levels.warning,\r\n config.color.warningColor,\r\n config.save.warningFilePath,\r\n ...content\r\n );\r\n },\r\n\r\n debug(...content: unknown[]) {\r\n const messages = translate(config.language, \"logger\");\r\n write(\r\n messages.levels.debug,\r\n config.color.debugColor,\r\n null,\r\n ...content\r\n );\r\n },\r\n\r\n clear() {\r\n console.clear();\r\n },\r\n\r\n custom(\r\n level: string,\r\n color: ColorName | null | false,\r\n file: ConfigValue,\r\n ...content: unknown[]\r\n ) {\r\n write(level, color, file, ...content);\r\n }\r\n}","const color = {\r\n reset: \"\\x1b[0m\",\r\n\r\n black: \"\\x1b[30m\",\r\n red: \"\\x1b[31m\",\r\n green: \"\\x1b[32m\",\r\n yellow: \"\\x1b[33m\",\r\n blue: \"\\x1b[34m\",\r\n magenta: \"\\x1b[35m\",\r\n cyan: \"\\x1b[36m\",\r\n white: \"\\x1b[37m\",\r\n\r\n bold: \"\\x1b[1m\",\r\n underline: \"\\x1b[4m\"\r\n} as const;\r\n\r\n\r\ntype Color = keyof Omit<typeof color, \"reset\">;\r\nconst colors = Object.fromEntries(\r\n Object.entries(color)\r\n .filter(([key]) => key !== \"reset\")\r\n .map(([key, value]) => [\r\n key,\r\n (text: string) => `${value}${text}${color.reset}`\r\n ])\r\n) as Record<Color, (text: string) => string>;\r\n\r\nexport { color, colors };","function dateToString(date: Date, format: string, timeZone?: string): string {\r\n const formatter = new Intl.DateTimeFormat(\"en-US\", {\r\n timeZone,\r\n year: \"numeric\",\r\n month: \"2-digit\",\r\n day: \"2-digit\",\r\n hour: \"2-digit\",\r\n minute: \"2-digit\",\r\n second: \"2-digit\",\r\n hourCycle: \"h23\",\r\n });\r\n\r\n const parts = formatter.formatToParts(date);\r\n const values = Object.fromEntries(\r\n parts\r\n .filter(({ type }) => type !== \"literal\")\r\n .map(({ type, value }) => [type, value])\r\n );\r\n\r\n return format.replace(/(YYYY|MM|DD|hh|mm|ss)/g, (match): string => {\r\n switch (match) {\r\n case \"YYYY\":\r\n return values.year || \"\";\r\n case \"MM\":\r\n return values.month || \"\";\r\n case \"DD\":\r\n return values.day || \"\";\r\n case \"hh\":\r\n return values.hour || \"\";\r\n case \"mm\":\r\n return values.minute || \"\";\r\n case \"ss\":\r\n return values.second || \"\";\r\n default:\r\n return match;\r\n }\r\n });\r\n}\r\n\r\nfunction isValidTimeZone(timeZone: string): boolean {\r\n try {\r\n new Intl.DateTimeFormat(\"en-US\", {\r\n timeZone,\r\n });\r\n\r\n return true;\r\n } catch {\r\n return false;\r\n }\r\n}\r\n\r\nexport { dateToString, isValidTimeZone };\r\n","{\r\n \"logger\": {\r\n \"levels\": {\r\n \"log\": \"log\",\r\n \"info\": \"info\",\r\n \"warning\": \"warning\",\r\n \"error\": \"error\",\r\n \"debug\": \"debug\"\r\n }\r\n },\r\n \"server\": {\r\n \"name\": \"server\",\r\n \"start\": \"Server running at\",\r\n \"routers_loaded\": \"routers loaded\",\r\n \"crons_loaded\": \"crons loaded\"\r\n },\r\n \"time\": {\r\n \"invalidTimeZone1\": \"Invalid time zone:\",\r\n \"invalidTimeZone2\": \"Using system default time zone.\"\r\n }\r\n}","{\r\n \"logger\": {\r\n \"levels\": {\r\n \"log\": \"log\",\r\n \"info\": \"info\",\r\n \"warning\": \"advertencia\",\r\n \"error\": \"error\",\r\n \"debug\": \"depuración\"\r\n }\r\n },\r\n \"server\": {\r\n \"name\": \"servidor\",\r\n \"start\": \"Servidor corriendo en\",\r\n \"routers_loaded\": \"rutas cargadas\",\r\n \"crons_loaded\": \"crons cargados\"\r\n },\r\n \"time\": {\r\n \"invalidTimeZone1\": \"Zona horaria inválida:\",\r\n \"invalidTimeZone2\": \"Usando la zona horaria predeterminada del sistema.\"\r\n }\r\n}","import en from \"../locales/en.json\" with { type: \"json\" };\r\nimport es from \"../locales/es.json\" with { type: \"json\" };\r\n\r\ntype Locale = typeof en;\r\n\r\nconst locales = {\r\n en,\r\n es,\r\n} satisfies Record<string, Locale>;\r\n\r\ntype Language = keyof typeof locales;\r\ntype TranslationKey = keyof Locale;\r\n\r\nfunction translate<K extends TranslationKey>(\r\n language: Language,\r\n key: K\r\n): Locale[K] {\r\n return locales[language][key];\r\n}\r\n\r\nexport {\r\n translate,\r\n};\r\n","import type { RequestHandler, Router as RouterType } from \"express\";\r\nimport { Router as ExpressRouter } from \"express\";\r\n\r\ntype HttpMethod =\r\n | \"get\"\r\n | \"post\"\r\n | \"put\"\r\n | \"patch\"\r\n | \"delete\"\r\n | \"options\"\r\n | \"head\"\r\n | \"all\";\r\n\r\nclass QuikRouter {\r\n readonly router: RouterType;\r\n private pendingMiddleware: RequestHandler[] = [];\r\n private currentPath: string = \"\";\r\n\r\n constructor() {\r\n this.router = ExpressRouter();\r\n }\r\n\r\n middleware(...handlers: RequestHandler[]) {\r\n this.pendingMiddleware.push(...handlers);\r\n return this;\r\n }\r\n\r\n path(path: string) {\r\n this.currentPath = path;\r\n return this;\r\n }\r\n\r\n private register (\r\n method: HttpMethod,\r\n handler: RequestHandler\r\n ) {\r\n this.router[method](\r\n this.currentPath,\r\n ...this.pendingMiddleware,\r\n async (req, res, next) => {\r\n try {\r\n await handler(req, res, next);\r\n } catch (err) {\r\n next(err);\r\n }\r\n }\r\n );\r\n\r\n this.pendingMiddleware = [];\r\n this.currentPath = \"\";\r\n\r\n return this;\r\n }\r\n\r\n get(handler: RequestHandler) {\r\n return this.register(\"get\", handler);\r\n }\r\n\r\n post(handler: RequestHandler) {\r\n return this.register(\"post\", handler);\r\n }\r\n\r\n put(handler: RequestHandler) {\r\n return this.register(\"put\", handler);\r\n }\r\n\r\n patch(handler: RequestHandler) {\r\n return this.register(\"patch\", handler);\r\n }\r\n\r\n delete(handler: RequestHandler) {\r\n return this.register(\"delete\", handler);\r\n }\r\n \r\n}\r\n\r\nfunction Router() {\r\n return new QuikRouter;\r\n}\r\n\r\nexport { QuikRouter, Router };","import express, { type Express, type RequestHandler } from \"express\";\r\nimport http, { type Server as HTTPServer } from \"node:http\";\r\n\r\nimport { QuikRouter } from \"./router.js\";\r\nimport { logger } from \"./logger.js\";\r\nimport { translate } from \"./translator.js\";\r\nimport { isValidTimeZone } from \"./time.js\";\r\nimport { QuikCron } from \"../cron/cron.js\";\r\nimport { ServerInvalidCronError, ServerInvalidRouteError } from \"../errors/serverError.js\";\r\n\r\ntype JsonOptions = Parameters<typeof express.json>[0];\r\ntype UrlencodedOptions = Parameters<typeof express.urlencoded>[0];\r\ntype RawOptions = Parameters<typeof express.raw>[0];\r\ntype TextOptions = Parameters<typeof express.text>[0];\r\ntype BodyParserConfig =\r\n | {\r\n type: \"json\";\r\n options?: JsonOptions;\r\n }\r\n | {\r\n type: \"urlencoded\";\r\n options?: UrlencodedOptions;\r\n }\r\n | {\r\n type: \"raw\";\r\n options?: RawOptions;\r\n }\r\n | {\r\n type: \"text\";\r\n options?: TextOptions;\r\n };\r\ntype HTTPConfig = {\r\n port: number;\r\n host?: string;\r\n\r\n keepAlive?: number;\r\n timeout?: number;\r\n maxConnections?: number;\r\n shutdownTimeout?: number;\r\n};\r\ntype ExpressConfig = {\r\n trustProxy?: boolean;\r\n};\r\ntype QuikServerConfig = {\r\n language: Language,\r\n timeZone?: string;\r\n bodyParser: BodyParserConfig;\r\n http: HTTPConfig;\r\n express: ExpressConfig;\r\n};\r\ntype RoutingDict = Record<string, QuikRouter>;\r\n\r\nconst defaultConfig: QuikServerConfig = {\r\n language: \"en\",\r\n bodyParser: {\r\n type: \"json\"\r\n },\r\n\r\n http: {\r\n port: 8080\r\n },\r\n\r\n express: {}\r\n}\r\n\r\nclass QuikServer {\r\n app: Express;\r\n httpServer: HTTPServer;\r\n middlewares: RequestHandler[] = [];\r\n routes: RoutingDict = {};\r\n crons: QuikCron[] = [];\r\n config: QuikServerConfig;\r\n\r\n constructor() {\r\n this.app = express();\r\n this.config = structuredClone(defaultConfig);\r\n this.httpServer = http.createServer(\r\n this.app\r\n );\r\n }\r\n\r\n\r\n setConfig(config: Partial<QuikServerConfig>) {\r\n this.config = {\r\n ...this.config,\r\n ...config,\r\n http: {\r\n ...this.config.http,\r\n ...config.http\r\n },\r\n express: {\r\n ...this.config.express,\r\n ...config.express\r\n }\r\n };\r\n\r\n // Notify if the provided time zone is invalid\r\n if (config.timeZone && !isValidTimeZone(config.timeZone)) {\r\n const messages = translate(this.config.language, \"time\");\r\n\r\n logger.warning(\r\n `${messages.invalidTimeZone1} ${config.timeZone}. ${messages.invalidTimeZone2}`\r\n );\r\n }\r\n\r\n return this;\r\n }\r\n\r\n addMiddleware(...middlewares: RequestHandler[]) {\r\n this.middlewares.push(\r\n ...middlewares\r\n );\r\n\r\n return this;\r\n }\r\n\r\n addRoute(path: string, router: QuikRouter) {\r\n if(!(router instanceof QuikRouter)){\r\n throw new ServerInvalidRouteError(path)\r\n }\r\n\r\n if(!path.startsWith(\"/\"))\r\n path = \"/\" + path;\r\n\r\n this.routes[path] = router;\r\n \r\n return this;\r\n }\r\n\r\n\r\n #listen() {\r\n const { port, host } = this.config.http;\r\n const messages = translate(this.config.language, \"server\");\r\n\r\n this.httpServer.listen(port, host, () => {\r\n logger.info(`${messages.start} ${host ?? \"localhost\"}:${port}`);\r\n }\r\n );\r\n\r\n return this;\r\n }\r\n\r\n addCron(cron: QuikCron) { \r\n if(cron.constructor.name != \"QuikCron\"){\r\n throw new ServerInvalidCronError()\r\n }\r\n this.crons.push(cron);\r\n\r\n return this;\r\n }\r\n\r\n #configureHTTP() {\r\n const config = this.config.http;\r\n\r\n if (config.timeout)\r\n this.httpServer.timeout = config.timeout;\r\n\r\n if (config.keepAlive)\r\n this.httpServer.keepAliveTimeout = config.keepAlive;\r\n\r\n if (config.maxConnections)\r\n this.httpServer.maxConnections = config.maxConnections;\r\n\r\n return this;\r\n }\r\n\r\n #configureExpress() {\r\n const config = this.config.express;\r\n\r\n if (config.trustProxy !== undefined) {\r\n this.app.set(\r\n \"trust proxy\",\r\n config.trustProxy\r\n );\r\n\r\n }\r\n\r\n return this;\r\n }\r\n\r\n #configureMiddleware() {\r\n const bodyParser = this.config.bodyParser;\r\n\r\n switch (bodyParser.type) {\r\n case \"json\":\r\n this.app.use(\r\n express.json(bodyParser.options)\r\n );\r\n break;\r\n\r\n\r\n case \"urlencoded\":\r\n this.app.use(\r\n express.urlencoded(bodyParser.options)\r\n );\r\n break;\r\n\r\n\r\n case \"raw\":\r\n this.app.use(\r\n express.raw(bodyParser.options)\r\n );\r\n break;\r\n\r\n\r\n case \"text\":\r\n this.app.use(\r\n express.text(bodyParser.options)\r\n );\r\n break;\r\n\r\n }\r\n\r\n if (this.middlewares.length > 0)\r\n this.app.use(...this.middlewares);\r\n\r\n return this;\r\n }\r\n\r\n\r\n #configureRoutes() {\r\n for (const [path, router] of Object.entries(this.routes)) {\r\n this.app.use(\r\n path,\r\n router.router\r\n );\r\n }\r\n const messages = translate(this.config.language, \"server\");\r\n logger.info(`[ ROUTER ] ${Object.entries(this.routes).length} ${messages.routers_loaded}.`);\r\n return this;\r\n }\r\n\r\n #loadCrons() {\r\n for (const cron of this.crons) {\r\n cron.start();\r\n }\r\n \r\n const messages = translate(this.config.language, \"server\")\r\n logger.info(`[ CRON ] ${this.crons.length} ${messages.crons_loaded}.`)\r\n\r\n return this;\r\n }\r\n\r\n start() {\r\n this.#configureExpress();\r\n this.#configureMiddleware();\r\n this.#configureRoutes();\r\n this.#loadCrons();\r\n\r\n this.#configureHTTP();\r\n\r\n this.#listen();\r\n return this;\r\n }\r\n}\r\n\r\nfunction Server() {\r\n return new QuikServer();\r\n}\r\n\r\nexport {\r\n Server\r\n};\r\n","import cron from \"node-cron\";\r\nimport { type ScheduledTask } from \"node-cron\";\r\n\r\nimport {\r\n CronTaskAlreadyExistsError,\r\n CronInvalidScheduleError,\r\n CronInvalidTimeZoneError,\r\n CronTaskExecutionError,\r\n} from \"./exceptions.js\";\r\n\r\nimport { isValidTimeZone } from \"../core/time.js\";\r\nimport type { CronConfig, CronTask, PartialCronConfig } from \"./types.js\";\r\n\r\n// Default configuration \r\nconst defaultConfig: CronConfig = {\r\n language: \"en\",\r\n};\r\n\r\n// Cron Class\r\nclass QuikCron {\r\n private tasks = new Map<string, CronTask>();\r\n private jobs = new Map<string, ScheduledTask>();\r\n\r\n #config: CronConfig = structuredClone(defaultConfig);\r\n\r\n constructor() {\r\n \r\n }\r\n\r\n add(task: CronTask): void {\r\n if (this.tasks.has(task.name)) {\r\n throw new CronTaskAlreadyExistsError(\r\n task.name\r\n );\r\n }\r\n\r\n if (!cron.validate(task.schedule)) {\r\n throw new CronInvalidScheduleError(\r\n task.schedule\r\n );\r\n }\r\n\r\n if (\r\n task.timezone &&\r\n !isValidTimeZone(task.timezone)\r\n ) {\r\n throw new CronInvalidTimeZoneError(\r\n task.timezone\r\n );\r\n }\r\n\r\n this.tasks.set(task.name, {\r\n ...task,\r\n });\r\n }\r\n\r\n remove(name: string): boolean {\r\n this.jobs.get(name)?.stop();\r\n this.jobs.delete(name);\r\n\r\n return this.tasks.delete(name);\r\n }\r\n\r\n has(name: string): boolean {\r\n return this.tasks.has(name);\r\n }\r\n\r\n get(name: string): CronTask | undefined {\r\n return this.tasks.get(name);\r\n }\r\n\r\n getTasks(): CronTask[] {\r\n return [...this.tasks.values()];\r\n }\r\n\r\n start(): void {\r\n for (const task of this.tasks.values()) {\r\n if (this.jobs.has(task.name)) {\r\n continue;\r\n }\r\n\r\n const timezone =\r\n task.timezone ?? this.#config.timeZone;\r\n\r\n const options = timezone\r\n ? { timezone }\r\n : {};\r\n\r\n const job = cron.schedule(\r\n task.schedule,\r\n async () => {\r\n try {\r\n await task.task();\r\n } catch (error) {\r\n const exception =\r\n new CronTaskExecutionError(\r\n task.name,\r\n error\r\n );\r\n\r\n this.#config.onError?.(exception);\r\n }\r\n },\r\n options\r\n );\r\n\r\n this.jobs.set(task.name, job);\r\n }\r\n }\r\n\r\n stop(): void {\r\n for (const job of this.jobs.values()) {\r\n job.stop();\r\n }\r\n\r\n this.jobs.clear();\r\n }\r\n\r\n config(): Readonly<CronConfig> {\r\n return Object.freeze(\r\n structuredClone(this.#config)\r\n );\r\n }\r\n\r\n setConfig(config: PartialCronConfig): void {\r\n if (\r\n config.timeZone &&\r\n !isValidTimeZone(config.timeZone)\r\n ) {\r\n throw new CronInvalidTimeZoneError(\r\n config.timeZone\r\n );\r\n }\r\n\r\n this.#config = {\r\n ...this.#config,\r\n ...config,\r\n };\r\n }\r\n}\r\n\r\nfunction Cron(): QuikCron {\r\n return new QuikCron();\r\n}\r\n\r\nexport { QuikCron, Cron };\r\n"],"mappings":"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","names":["path","color","path","defaultConfig","config","path","cron"]}
|
|
1
|
+
{"version":3,"sources":["../src/core/errors/serverErrors.ts","../src/core/logger.ts","../src/core/colors.ts","../src/core/time.ts","../src/locales/en.json","../src/locales/es.json","../src/core/translator.ts","../src/core/router.ts","../src/core/server.ts","../src/cron/cron.ts"],"sourcesContent":["class ServerInvalidRouteError extends Error {\r\n constructor(path: string) {\r\n super(`\"${path}\" is not a QuikRouter instance.`);\r\n }\r\n}\r\n\r\nclass ServerInvalidCronError extends Error {\r\n constructor() {\r\n super(`Invalid object, must be a QuikCron instance.`);\r\n }\r\n}\r\n\r\nexport { ServerInvalidRouteError, ServerInvalidCronError }","import fs from \"node:fs\"\r\nimport path from \"node:path\";\r\n\r\nimport { colors } from \"./colors.js\"\r\nimport { dateToString, isValidTimeZone } from \"./time.js\";\r\nimport { translate } from \"./translator.js\";\r\n\r\n/* Types */\r\ntype ConfigValue = string | null | false;\r\ntype Cases = \"uppercase\" | \"lowercase\" | \"capitalize\" | \"none\" | null;\r\ntype ColorName =\r\n | \"black\"\r\n | \"red\"\r\n | \"green\"\r\n | \"yellow\"\r\n | \"blue\"\r\n | \"magenta\"\r\n | \"cyan\"\r\n | \"white\";\r\n\r\ntype ColorValue = ColorName | null;\r\ntype SaveConfig = {\r\n infoFilePath: ConfigValue,\r\n logFilePath: ConfigValue,\r\n errorFilePath: ConfigValue,\r\n warningFilePath: ConfigValue,\r\n}\r\ntype ColorConfig = {\r\n logColor: ColorValue;\r\n infoColor: ColorValue;\r\n errorColor: ColorValue;\r\n warningColor: ColorValue;\r\n debugColor: ColorValue;\r\n}\r\ntype Formatconfig = {\r\n timestampFormat: ConfigValue,\r\n titleCase: Cases,\r\n prefix?: string\r\n suffix?: string\r\n timeZone?: string\r\n}\r\n\r\ntype LoggerConfig = {\r\n language: Language,\r\n save: SaveConfig,\r\n color: ColorConfig,\r\n format: Formatconfig,\r\n}\r\ntype PartialConfig = Partial<{\r\n save: Partial<SaveConfig>;\r\n color: Partial<ColorConfig>;\r\n format: Partial<Formatconfig>;\r\n}>;\r\n\r\nconst defaultConfig: LoggerConfig = {\r\n language: \"en\",\r\n save: {\r\n logFilePath: null,\r\n infoFilePath: null,\r\n errorFilePath: \"logs/error.log\",\r\n warningFilePath: \"logs/warning.log\",\r\n },\r\n color: {\r\n logColor: \"blue\",\r\n infoColor: \"green\",\r\n errorColor: \"red\",\r\n warningColor: \"yellow\",\r\n debugColor: null\r\n },\r\n format: {\r\n timestampFormat: \"DD-MM-YYYY hh:mm:ss\",\r\n titleCase: \"uppercase\"\r\n }\r\n}\r\n\r\nlet config = structuredClone(defaultConfig);\r\n\r\nfunction tokenize(...args: unknown[]): string[] {\r\n return args.map(arg => {\r\n if (typeof arg === \"string\") return arg;\r\n\r\n if (arg instanceof Error) {\r\n return arg.stack ?? arg.message;\r\n }\r\n\r\n if (arg === null || arg === undefined) {\r\n return String(arg);\r\n }\r\n\r\n if (typeof arg === \"object\") {\r\n try {\r\n return JSON.stringify(arg);\r\n } catch {\r\n return \"[Circular]\";\r\n }\r\n }\r\n\r\n return String(arg);\r\n });\r\n}\r\n\r\nfunction write(\r\n level: string,\r\n color: ColorName | null | false,\r\n file: ConfigValue,\r\n ...content: unknown[]\r\n) {\r\n const [header, body] = parseContent(level, ...content);\r\n saveToFile(file, header + body);\r\n\r\n const prefix = config.format.prefix ?? \"\";\r\n const suffix = config.format.suffix ?? \"\";\r\n\r\n if (color) {\r\n const colorFn = colors[color] ?? ((s: string) => s);\r\n console.log(`${prefix}${header}${colorFn(body)}${suffix}`);\r\n } else {\r\n console.log(`${prefix}${header}${body}${suffix}`);\r\n }\r\n}\r\n\r\nfunction parseContent(level: string, ...body: unknown[]): [string, string] {\r\n let header = \"\";\r\n if (config.format.timestampFormat) {\r\n const now = new Date();\r\n const timeZone = config.format.timeZone;\r\n let tz = timeZone;\r\n\r\n if (timeZone && !isValidTimeZone(timeZone)) {\r\n tz = undefined;\r\n }\r\n\r\n const timestamp = dateToString(\r\n now,\r\n config.format.timestampFormat,\r\n tz\r\n );\r\n\r\n header += `${timestamp} `;\r\n }\r\n\r\n switch (config.format.titleCase) {\r\n case \"uppercase\":\r\n level = `[${level.toUpperCase()}] `;\r\n break;\r\n case \"lowercase\":\r\n level = `[${level.toLocaleLowerCase()}] `;\r\n break;\r\n case \"capitalize\":\r\n level = `[${level.charAt(0).toUpperCase() + level.slice(1).toLowerCase()}] `;\r\n break;\r\n case \"none\":\r\n level = `[${level}] `;\r\n break;\r\n default:\r\n level = \"\";\r\n break;\r\n }\r\n let content = level + tokenize(...body).join(\" \");\r\n return [header, content];\r\n}\r\n\r\nfunction saveToFile(filePath: ConfigValue, content: string): void {\r\n if (!filePath || !content.length) return;\r\n\r\n const dir = path.dirname(filePath);\r\n const logMessage = content + \"\\n\";\r\n\r\n fs.mkdirSync(dir, { recursive: true });\r\n fs.appendFileSync(filePath, logMessage);\r\n}\r\n\r\nfunction mergeConfig(\r\n current: LoggerConfig,\r\n update: PartialConfig\r\n): LoggerConfig {\r\n return {\r\n ...current,\r\n ...update,\r\n save: {\r\n ...current.save,\r\n ...update.save,\r\n },\r\n color: {\r\n ...current.color,\r\n ...update.color,\r\n },\r\n format: {\r\n ...current.format,\r\n ...update.format,\r\n },\r\n };\r\n}\r\n\r\nexport const logger = {\r\n // Setter config\r\n setConfig(newConfig: PartialConfig): void {\r\n config = mergeConfig(config, newConfig);\r\n },\r\n\r\n // Getter config\r\n config(): Readonly<LoggerConfig> {\r\n return Object.freeze(structuredClone(config));\r\n },\r\n\r\n log(...content: unknown[]) {\r\n const messages = translate(config.language, \"logger\");\r\n write(\r\n messages.levels.log,\r\n config.color.logColor,\r\n config.save.logFilePath,\r\n ...content\r\n );\r\n },\r\n\r\n info(...content: unknown[]) {\r\n const messages = translate(config.language, \"logger\");\r\n write(\r\n messages.levels.info,\r\n config.color.infoColor,\r\n config.save.infoFilePath,\r\n ...content\r\n );\r\n },\r\n\r\n error(...content: unknown[]) {\r\n const messages = translate(config.language, \"logger\");\r\n write(\r\n messages.levels.error,\r\n config.color.errorColor,\r\n config.save.errorFilePath,\r\n ...content\r\n );\r\n },\r\n\r\n warning(...content: unknown[]) {\r\n const messages = translate(config.language, \"logger\");\r\n write(\r\n messages.levels.warning,\r\n config.color.warningColor,\r\n config.save.warningFilePath,\r\n ...content\r\n );\r\n },\r\n\r\n debug(...content: unknown[]) {\r\n const messages = translate(config.language, \"logger\");\r\n write(\r\n messages.levels.debug,\r\n config.color.debugColor,\r\n null,\r\n ...content\r\n );\r\n },\r\n\r\n clear() {\r\n console.clear();\r\n },\r\n\r\n custom(\r\n level: string,\r\n color: ColorName | null | false,\r\n file: ConfigValue,\r\n ...content: unknown[]\r\n ) {\r\n write(level, color, file, ...content);\r\n }\r\n}","const color = {\r\n reset: \"\\x1b[0m\",\r\n\r\n black: \"\\x1b[30m\",\r\n red: \"\\x1b[31m\",\r\n green: \"\\x1b[32m\",\r\n yellow: \"\\x1b[33m\",\r\n blue: \"\\x1b[34m\",\r\n magenta: \"\\x1b[35m\",\r\n cyan: \"\\x1b[36m\",\r\n white: \"\\x1b[37m\",\r\n\r\n bold: \"\\x1b[1m\",\r\n underline: \"\\x1b[4m\"\r\n} as const;\r\n\r\n\r\ntype Color = keyof Omit<typeof color, \"reset\">;\r\nconst colors = Object.fromEntries(\r\n Object.entries(color)\r\n .filter(([key]) => key !== \"reset\")\r\n .map(([key, value]) => [\r\n key,\r\n (text: string) => `${value}${text}${color.reset}`\r\n ])\r\n) as Record<Color, (text: string) => string>;\r\n\r\nexport { color, colors };","function dateToString(date: Date, format: string, timeZone?: string): string {\r\n const formatter = new Intl.DateTimeFormat(\"en-US\", {\r\n timeZone,\r\n year: \"numeric\",\r\n month: \"2-digit\",\r\n day: \"2-digit\",\r\n hour: \"2-digit\",\r\n minute: \"2-digit\",\r\n second: \"2-digit\",\r\n hourCycle: \"h23\",\r\n });\r\n\r\n const parts = formatter.formatToParts(date);\r\n const values = Object.fromEntries(\r\n parts\r\n .filter(({ type }) => type !== \"literal\")\r\n .map(({ type, value }) => [type, value])\r\n );\r\n\r\n return format.replace(/(YYYY|MM|DD|hh|mm|ss)/g, (match): string => {\r\n switch (match) {\r\n case \"YYYY\":\r\n return values.year || \"\";\r\n case \"MM\":\r\n return values.month || \"\";\r\n case \"DD\":\r\n return values.day || \"\";\r\n case \"hh\":\r\n return values.hour || \"\";\r\n case \"mm\":\r\n return values.minute || \"\";\r\n case \"ss\":\r\n return values.second || \"\";\r\n default:\r\n return match;\r\n }\r\n });\r\n}\r\n\r\nfunction isValidTimeZone(timeZone: string): boolean {\r\n try {\r\n new Intl.DateTimeFormat(\"en-US\", {\r\n timeZone,\r\n });\r\n\r\n return true;\r\n } catch {\r\n return false;\r\n }\r\n}\r\n\r\nexport { dateToString, isValidTimeZone };\r\n","{\r\n \"logger\": {\r\n \"levels\": {\r\n \"log\": \"log\",\r\n \"info\": \"info\",\r\n \"warning\": \"warning\",\r\n \"error\": \"error\",\r\n \"debug\": \"debug\"\r\n }\r\n },\r\n \"server\": {\r\n \"name\": \"server\",\r\n \"start\": \"Server running at\",\r\n \"routers_loaded\": \"routers loaded\",\r\n \"crons_loaded\": \"crons loaded\",\r\n \"static_loaded\": \"static dirs loaded\",\r\n \"static_warn\": \"directory does not exist\"\r\n },\r\n \"time\": {\r\n \"invalidTimeZone1\": \"Invalid time zone:\",\r\n \"invalidTimeZone2\": \"Using system default time zone.\"\r\n }\r\n}","{\r\n \"logger\": {\r\n \"levels\": {\r\n \"log\": \"log\",\r\n \"info\": \"info\",\r\n \"warning\": \"advertencia\",\r\n \"error\": \"error\",\r\n \"debug\": \"depuración\"\r\n }\r\n },\r\n \"server\": {\r\n \"name\": \"servidor\",\r\n \"start\": \"Servidor corriendo en\",\r\n \"routers_loaded\": \"rutas cargadas\",\r\n \"crons_loaded\": \"crons cargados\",\r\n \"static_loaded\": \"carpetas estaticas cargadas\",\r\n \"static_warn\": \"no existe el directorio\"\r\n },\r\n \"time\": {\r\n \"invalidTimeZone1\": \"Zona horaria inválida:\",\r\n \"invalidTimeZone2\": \"Usando la zona horaria predeterminada del sistema.\"\r\n }\r\n}","import en from \"../locales/en.json\" with { type: \"json\" };\r\nimport es from \"../locales/es.json\" with { type: \"json\" };\r\n\r\ntype Locale = typeof en;\r\n\r\nconst locales = {\r\n en,\r\n es,\r\n} satisfies Record<string, Locale>;\r\n\r\ntype Language = keyof typeof locales;\r\ntype TranslationKey = keyof Locale;\r\n\r\nfunction translate<K extends TranslationKey>(\r\n language: Language,\r\n key: K\r\n): Locale[K] {\r\n return locales[language][key];\r\n}\r\n\r\nexport {\r\n translate,\r\n};\r\n","import type { RequestHandler, Router as RouterType } from \"express\";\r\nimport { Router as ExpressRouter } from \"express\";\r\n\r\ntype HttpMethod =\r\n | \"get\"\r\n | \"post\"\r\n | \"put\"\r\n | \"patch\"\r\n | \"delete\"\r\n | \"options\"\r\n | \"head\"\r\n | \"all\";\r\n\r\nclass QuikRouter {\r\n readonly router: RouterType;\r\n private pendingMiddleware: RequestHandler[] = [];\r\n private currentPath: string = \"\";\r\n\r\n constructor() {\r\n this.router = ExpressRouter();\r\n }\r\n\r\n middleware(...handlers: RequestHandler[]) {\r\n this.pendingMiddleware.push(...handlers);\r\n return this;\r\n }\r\n\r\n path(path: string) {\r\n this.currentPath = path;\r\n return this;\r\n }\r\n\r\n private register (\r\n method: HttpMethod,\r\n handler: RequestHandler\r\n ) {\r\n this.router[method](\r\n this.currentPath,\r\n ...this.pendingMiddleware,\r\n async (req, res, next) => {\r\n try {\r\n await handler(req, res, next);\r\n } catch (err) {\r\n next(err);\r\n }\r\n }\r\n );\r\n\r\n this.pendingMiddleware = [];\r\n this.currentPath = \"\";\r\n\r\n return this;\r\n }\r\n\r\n get(handler: RequestHandler) {\r\n return this.register(\"get\", handler);\r\n }\r\n\r\n post(handler: RequestHandler) {\r\n return this.register(\"post\", handler);\r\n }\r\n\r\n put(handler: RequestHandler) {\r\n return this.register(\"put\", handler);\r\n }\r\n\r\n patch(handler: RequestHandler) {\r\n return this.register(\"patch\", handler);\r\n }\r\n\r\n delete(handler: RequestHandler) {\r\n return this.register(\"delete\", handler);\r\n }\r\n \r\n}\r\n\r\nfunction Router() {\r\n return new QuikRouter;\r\n}\r\n\r\nexport { QuikRouter, Router };","import express, { type Express, type RequestHandler } from \"express\";\r\nimport http, { type Server as HTTPServer } from \"node:http\";\r\nimport path from \"node:path\";\r\nimport fs from \"node:fs\";\r\n\r\nimport { QuikRouter } from \"./router.js\";\r\nimport { logger } from \"./logger.js\";\r\nimport { translate } from \"./translator.js\";\r\nimport { isValidTimeZone } from \"./time.js\";\r\nimport { QuikCron } from \"../cron/cron.js\";\r\nimport { ServerInvalidCronError, ServerInvalidRouteError } from \"./errors/serverErrors.js\";\r\n\r\ntype JsonOptions = Parameters<typeof express.json>[0];\r\ntype UrlencodedOptions = Parameters<typeof express.urlencoded>[0];\r\ntype RawOptions = Parameters<typeof express.raw>[0];\r\ntype TextOptions = Parameters<typeof express.text>[0];\r\ntype BodyParserConfig =\r\n | {\r\n type: \"json\";\r\n options?: JsonOptions;\r\n }\r\n | {\r\n type: \"urlencoded\";\r\n options?: UrlencodedOptions;\r\n }\r\n | {\r\n type: \"raw\";\r\n options?: RawOptions;\r\n }\r\n | {\r\n type: \"text\";\r\n options?: TextOptions;\r\n };\r\ntype HTTPConfig = {\r\n port: number;\r\n host?: string;\r\n\r\n keepAlive?: number;\r\n timeout?: number;\r\n maxConnections?: number;\r\n shutdownTimeout?: number;\r\n};\r\ntype ExpressConfig = {\r\n trustProxy?: boolean;\r\n};\r\ntype QuikServerConfig = {\r\n language: Language,\r\n timeZone?: string;\r\n bodyParser: BodyParserConfig;\r\n http: HTTPConfig;\r\n express: ExpressConfig;\r\n};\r\ntype RoutingDict = Record<string, QuikRouter>;\r\n\r\nconst defaultConfig: QuikServerConfig = {\r\n language: \"en\",\r\n bodyParser: {\r\n type: \"json\"\r\n },\r\n\r\n http: {\r\n port: 8080\r\n },\r\n\r\n express: {}\r\n}\r\n\r\nclass QuikServer {\r\n app: Express;\r\n httpServer: HTTPServer;\r\n middlewares: RequestHandler[] = [];\r\n routes: RoutingDict = {};\r\n staticDirs: string[] = [];\r\n crons: QuikCron[] = [];\r\n config: QuikServerConfig;\r\n\r\n constructor() {\r\n this.app = express();\r\n this.config = structuredClone(defaultConfig);\r\n this.httpServer = http.createServer(\r\n this.app\r\n );\r\n }\r\n\r\n\r\n setConfig(config: Partial<QuikServerConfig>) {\r\n this.config = {\r\n ...this.config,\r\n ...config,\r\n http: {\r\n ...this.config.http,\r\n ...config.http\r\n },\r\n express: {\r\n ...this.config.express,\r\n ...config.express\r\n }\r\n };\r\n\r\n // Notify if the provided time zone is invalid\r\n if (config.timeZone && !isValidTimeZone(config.timeZone)) {\r\n const messages = translate(this.config.language, \"time\");\r\n\r\n logger.warning(\r\n `${messages.invalidTimeZone1} ${config.timeZone}. ${messages.invalidTimeZone2}`\r\n );\r\n }\r\n\r\n return this;\r\n }\r\n\r\n addMiddleware(...middlewares: RequestHandler[]) {\r\n this.middlewares.push(\r\n ...middlewares\r\n );\r\n\r\n return this;\r\n }\r\n\r\n addRoute(path: string, router: QuikRouter) {\r\n if (!(router instanceof QuikRouter)) {\r\n throw new ServerInvalidRouteError(path)\r\n }\r\n\r\n if (!path.startsWith(\"/\"))\r\n path = \"/\" + path;\r\n\r\n this.routes[path] = router;\r\n\r\n return this;\r\n }\r\n\r\n\r\n #listen() {\r\n const { port, host } = this.config.http;\r\n const messages = translate(this.config.language, \"server\");\r\n\r\n this.httpServer.listen(port, host, () => {\r\n logger.info(`${messages.start} ${host ?? \"localhost\"}:${port}`);\r\n }\r\n );\r\n\r\n return this;\r\n }\r\n\r\n addCron(cron: QuikCron) {\r\n if (cron.constructor.name != \"QuikCron\") {\r\n throw new ServerInvalidCronError()\r\n }\r\n this.crons.push(cron);\r\n\r\n return this;\r\n }\r\n\r\n addStaticDir(...paths: string[]) {\r\n for (const i in paths) {\r\n const dir = paths[i] ?? \"\";\r\n const dirPath = path.resolve(dir);\r\n\r\n const exists = fs.existsSync(dirPath)\r\n if (!exists) {\r\n const messages = translate(this.config.language, \"server\");\r\n logger.warning(`[ STATIC ] \"${dir}\" ${messages.static_warn}`);\r\n continue;\r\n }\r\n this.staticDirs.push(...paths);\r\n }\r\n\r\n return this;\r\n }\r\n\r\n #configureHTTP() {\r\n const config = this.config.http;\r\n\r\n if (config.timeout)\r\n this.httpServer.timeout = config.timeout;\r\n\r\n if (config.keepAlive)\r\n this.httpServer.keepAliveTimeout = config.keepAlive;\r\n\r\n if (config.maxConnections)\r\n this.httpServer.maxConnections = config.maxConnections;\r\n\r\n return this;\r\n }\r\n\r\n #configureExpress() {\r\n const config = this.config.express;\r\n\r\n if (config.trustProxy !== undefined) {\r\n this.app.set(\r\n \"trust proxy\",\r\n config.trustProxy\r\n );\r\n\r\n }\r\n\r\n return this;\r\n }\r\n\r\n #configureMiddleware() {\r\n const bodyParser = this.config.bodyParser;\r\n\r\n switch (bodyParser.type) {\r\n case \"json\":\r\n this.app.use(\r\n express.json(bodyParser.options)\r\n );\r\n break;\r\n\r\n\r\n case \"urlencoded\":\r\n this.app.use(\r\n express.urlencoded(bodyParser.options)\r\n );\r\n break;\r\n\r\n\r\n case \"raw\":\r\n this.app.use(\r\n express.raw(bodyParser.options)\r\n );\r\n break;\r\n\r\n\r\n case \"text\":\r\n this.app.use(\r\n express.text(bodyParser.options)\r\n );\r\n break;\r\n\r\n }\r\n\r\n if (this.middlewares.length > 0)\r\n this.app.use(...this.middlewares);\r\n\r\n return this;\r\n }\r\n\r\n\r\n #configureRoutes() {\r\n for (const [path, router] of Object.entries(this.routes)) {\r\n this.app.use(\r\n path,\r\n router.router\r\n );\r\n }\r\n const messages = translate(this.config.language, \"server\");\r\n logger.info(`[ ROUTER ] ${Object.entries(this.routes).length} ${messages.routers_loaded}.`);\r\n return this;\r\n }\r\n\r\n #loadCrons() {\r\n for (const cron of this.crons) {\r\n cron.start();\r\n }\r\n\r\n const messages = translate(this.config.language, \"server\")\r\n logger.info(`[ CRON ] ${this.crons.length} ${messages.crons_loaded}.`)\r\n\r\n return this;\r\n }\r\n\r\n #loadStaticDirs() {\r\n for (const dir of this.staticDirs) {\r\n const dirPath = path.resolve(dir);\r\n\r\n this.app.use(express.static(dirPath));\r\n }\r\n\r\n const messages = translate(this.config.language, \"server\")\r\n logger.info(`[ STATIC ] ${this.staticDirs.length} ${messages.static_loaded}.`)\r\n\r\n return this;\r\n }\r\n\r\n start() {\r\n this.#configureExpress();\r\n this.#configureMiddleware();\r\n\r\n this.#loadStaticDirs()\r\n this.#configureRoutes();\r\n this.#loadCrons();\r\n\r\n this.#configureHTTP();\r\n\r\n this.#listen();\r\n return this;\r\n }\r\n}\r\n\r\nfunction Server() {\r\n return new QuikServer();\r\n}\r\n\r\nexport {\r\n Server\r\n};\r\n","import cron from \"node-cron\";\r\nimport { type ScheduledTask } from \"node-cron\";\r\n\r\nimport {\r\n CronTaskAlreadyExistsError,\r\n CronInvalidScheduleError,\r\n CronInvalidTimeZoneError,\r\n CronTaskExecutionError,\r\n} from \"./exceptions.js\";\r\n\r\nimport { isValidTimeZone } from \"../core/time.js\";\r\nimport type { CronConfig, CronTask, PartialCronConfig } from \"./types.js\";\r\n\r\n// Default configuration \r\nconst defaultConfig: CronConfig = {\r\n language: \"en\",\r\n};\r\n\r\n// Cron Class\r\nclass QuikCron {\r\n private tasks = new Map<string, CronTask>();\r\n private jobs = new Map<string, ScheduledTask>();\r\n\r\n #config: CronConfig = structuredClone(defaultConfig);\r\n\r\n constructor() {\r\n \r\n }\r\n\r\n add(task: CronTask): void {\r\n if (this.tasks.has(task.name)) {\r\n throw new CronTaskAlreadyExistsError(\r\n task.name\r\n );\r\n }\r\n\r\n if (!cron.validate(task.schedule)) {\r\n throw new CronInvalidScheduleError(\r\n task.schedule\r\n );\r\n }\r\n\r\n if (\r\n task.timezone &&\r\n !isValidTimeZone(task.timezone)\r\n ) {\r\n throw new CronInvalidTimeZoneError(\r\n task.timezone\r\n );\r\n }\r\n\r\n this.tasks.set(task.name, {\r\n ...task,\r\n });\r\n }\r\n\r\n remove(name: string): boolean {\r\n this.jobs.get(name)?.stop();\r\n this.jobs.delete(name);\r\n\r\n return this.tasks.delete(name);\r\n }\r\n\r\n has(name: string): boolean {\r\n return this.tasks.has(name);\r\n }\r\n\r\n get(name: string): CronTask | undefined {\r\n return this.tasks.get(name);\r\n }\r\n\r\n getTasks(): CronTask[] {\r\n return [...this.tasks.values()];\r\n }\r\n\r\n start(): void {\r\n for (const task of this.tasks.values()) {\r\n if (this.jobs.has(task.name)) {\r\n continue;\r\n }\r\n\r\n const timezone =\r\n task.timezone ?? this.#config.timeZone;\r\n\r\n const options = timezone\r\n ? { timezone }\r\n : {};\r\n\r\n const job = cron.schedule(\r\n task.schedule,\r\n async () => {\r\n try {\r\n await task.task();\r\n } catch (error) {\r\n const exception =\r\n new CronTaskExecutionError(\r\n task.name,\r\n error\r\n );\r\n\r\n this.#config.onError?.(exception);\r\n }\r\n },\r\n options\r\n );\r\n\r\n this.jobs.set(task.name, job);\r\n }\r\n }\r\n\r\n stop(): void {\r\n for (const job of this.jobs.values()) {\r\n job.stop();\r\n }\r\n\r\n this.jobs.clear();\r\n }\r\n\r\n config(): Readonly<CronConfig> {\r\n return Object.freeze(\r\n structuredClone(this.#config)\r\n );\r\n }\r\n\r\n setConfig(config: PartialCronConfig): void {\r\n if (\r\n config.timeZone &&\r\n !isValidTimeZone(config.timeZone)\r\n ) {\r\n throw new CronInvalidTimeZoneError(\r\n config.timeZone\r\n );\r\n }\r\n\r\n this.#config = {\r\n ...this.#config,\r\n ...config,\r\n };\r\n }\r\n}\r\n\r\nfunction Cron(): QuikCron {\r\n return new QuikCron();\r\n}\r\n\r\nexport { QuikCron, Cron };\r\n"],"mappings":"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","names":["path","color","path","path","fs","defaultConfig","config","path","cron","fs"]}
|
package/package.json
CHANGED
|
@@ -1,64 +1,70 @@
|
|
|
1
|
-
{
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
"
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
"
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
"
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
"
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
"
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
"
|
|
58
|
-
"
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
1
|
+
{
|
|
2
|
+
"name": "@desaubv/quik",
|
|
3
|
+
"version": "0.0.8",
|
|
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
|
+
"type": "module",
|
|
6
|
+
"main": "./dist/index.cjs",
|
|
7
|
+
"module": "./dist/index.js",
|
|
8
|
+
"types": "./dist/index.d.ts",
|
|
9
|
+
"exports": {
|
|
10
|
+
".": {
|
|
11
|
+
"types": "./dist/index.d.ts",
|
|
12
|
+
"import": "./dist/index.js",
|
|
13
|
+
"require": "./dist/index.cjs"
|
|
14
|
+
},
|
|
15
|
+
"./cron": {
|
|
16
|
+
"types": "./dist/cron/index.d.ts",
|
|
17
|
+
"import": "./dist/cron/index.js",
|
|
18
|
+
"require": "./dist/cron/index.cjs"
|
|
19
|
+
},
|
|
20
|
+
"./http": {
|
|
21
|
+
"types": "./dist/http/index.d.ts",
|
|
22
|
+
"import": "./dist/http/index.js",
|
|
23
|
+
"require": "./dist/http/index.cjs"
|
|
24
|
+
},
|
|
25
|
+
"./ws": {
|
|
26
|
+
"types": "./dist/ws/index.d.ts",
|
|
27
|
+
"import": "./dist/ws/index.js",
|
|
28
|
+
"require": "./dist/ws/index.cjs"
|
|
29
|
+
}
|
|
30
|
+
},
|
|
31
|
+
"files": [
|
|
32
|
+
"dist"
|
|
33
|
+
],
|
|
34
|
+
"scripts": {
|
|
35
|
+
"build": "tsup",
|
|
36
|
+
"dev": "tsup --watch"
|
|
37
|
+
},
|
|
38
|
+
"keywords": [
|
|
39
|
+
"quik",
|
|
40
|
+
"typescript",
|
|
41
|
+
"nodejs",
|
|
42
|
+
"express",
|
|
43
|
+
"router",
|
|
44
|
+
"middleware",
|
|
45
|
+
"typescript",
|
|
46
|
+
"backend"
|
|
47
|
+
],
|
|
48
|
+
"author": "desaubv",
|
|
49
|
+
"homepage": "https://github.com/DiegoBarajas/quik",
|
|
50
|
+
"repository": {
|
|
51
|
+
"type": "git",
|
|
52
|
+
"url": "https://github.com/DiegoBarajas/quik.git"
|
|
53
|
+
},
|
|
54
|
+
"bugs": {
|
|
55
|
+
"url": "https://github.com/DiegoBarajas/quik/issues"
|
|
56
|
+
},
|
|
57
|
+
"license": "MIT",
|
|
58
|
+
"devDependencies": {
|
|
59
|
+
"@types/express": "^5.0.6",
|
|
60
|
+
"@types/node": "^26.1.2",
|
|
61
|
+
"@types/node-cron": "^3.0.11",
|
|
62
|
+
"tsup": "^8.5.1",
|
|
63
|
+
"typescript": "~5.9.3"
|
|
64
|
+
},
|
|
65
|
+
"dependencies": {
|
|
66
|
+
"express": "^5.2.1",
|
|
67
|
+
"node-cron": "^4.6.0",
|
|
68
|
+
"socket.io": "^4.8.3"
|
|
69
|
+
}
|
|
64
70
|
}
|