@desaubv/quik 0.0.1 → 0.0.3
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 +112 -35
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +26 -6
- package/dist/index.d.ts +26 -6
- package/dist/index.js +111 -35
- package/dist/index.js.map +1 -1
- package/package.json +3 -3
package/dist/index.cjs
CHANGED
|
@@ -30,6 +30,7 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
|
|
|
30
30
|
// src/index.ts
|
|
31
31
|
var index_exports = {};
|
|
32
32
|
__export(index_exports, {
|
|
33
|
+
Router: () => Router,
|
|
33
34
|
logger: () => logger
|
|
34
35
|
});
|
|
35
36
|
module.exports = __toCommonJS(index_exports);
|
|
@@ -37,19 +38,39 @@ module.exports = __toCommonJS(index_exports);
|
|
|
37
38
|
// src/core/logger.ts
|
|
38
39
|
var import_node_fs = __toESM(require("fs"), 1);
|
|
39
40
|
var import_node_path = __toESM(require("path"), 1);
|
|
40
|
-
|
|
41
|
+
|
|
42
|
+
// src/core/colors.ts
|
|
43
|
+
var color = {
|
|
44
|
+
reset: "\x1B[0m",
|
|
45
|
+
black: "\x1B[30m",
|
|
46
|
+
red: "\x1B[31m",
|
|
47
|
+
green: "\x1B[32m",
|
|
48
|
+
yellow: "\x1B[33m",
|
|
49
|
+
blue: "\x1B[34m",
|
|
50
|
+
magenta: "\x1B[35m",
|
|
51
|
+
cyan: "\x1B[36m",
|
|
52
|
+
white: "\x1B[37m",
|
|
53
|
+
bold: "\x1B[1m",
|
|
54
|
+
underline: "\x1B[4m"
|
|
55
|
+
};
|
|
56
|
+
var colors = Object.fromEntries(
|
|
57
|
+
Object.entries(color).filter(([key]) => key !== "reset").map(([key, value]) => [
|
|
58
|
+
key,
|
|
59
|
+
(text) => `${value}${text}${color.reset}`
|
|
60
|
+
])
|
|
61
|
+
);
|
|
41
62
|
|
|
42
63
|
// src/core/time.ts
|
|
43
64
|
function dateToString(date, format) {
|
|
44
|
-
return format.replace(/(
|
|
65
|
+
return format.replace(/(YYYY|MM|DD|hh|mm|ss)/g, (match) => {
|
|
45
66
|
switch (match) {
|
|
46
|
-
case "
|
|
67
|
+
case "YYYY":
|
|
47
68
|
return date.getFullYear().toString();
|
|
48
69
|
case "MM":
|
|
49
70
|
return (date.getMonth() + 1).toString().padStart(2, "0");
|
|
50
|
-
case "
|
|
71
|
+
case "DD":
|
|
51
72
|
return date.getDate().toString().padStart(2, "0");
|
|
52
|
-
case "
|
|
73
|
+
case "hh":
|
|
53
74
|
return date.getHours().toString().padStart(2, "0");
|
|
54
75
|
case "mm":
|
|
55
76
|
return date.getMinutes().toString().padStart(2, "0");
|
|
@@ -65,7 +86,8 @@ function dateToString(date, format) {
|
|
|
65
86
|
var defaultConfig = {
|
|
66
87
|
save: {
|
|
67
88
|
logFilePath: null,
|
|
68
|
-
errorFilePath:
|
|
89
|
+
errorFilePath: null,
|
|
90
|
+
//"logs/error.log",
|
|
69
91
|
warningFilePath: null
|
|
70
92
|
},
|
|
71
93
|
color: {
|
|
@@ -75,7 +97,7 @@ var defaultConfig = {
|
|
|
75
97
|
debugColor: null
|
|
76
98
|
},
|
|
77
99
|
format: {
|
|
78
|
-
timestampFormat: "
|
|
100
|
+
timestampFormat: "DD-MM-YYYY hh:mm:ss",
|
|
79
101
|
titleCase: "uppercase"
|
|
80
102
|
}
|
|
81
103
|
};
|
|
@@ -99,21 +121,23 @@ function tokenize(...args) {
|
|
|
99
121
|
return String(arg);
|
|
100
122
|
});
|
|
101
123
|
}
|
|
102
|
-
function write(level,
|
|
103
|
-
const body = parseContent(level, ...content);
|
|
104
|
-
saveToFile(file, body);
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
124
|
+
function write(level, color2, file, ...content) {
|
|
125
|
+
const [header, body] = parseContent(level, ...content);
|
|
126
|
+
saveToFile(file, header + body);
|
|
127
|
+
const prefix = config.format.prefix ?? "";
|
|
128
|
+
const suffix = config.format.suffix ?? "";
|
|
129
|
+
if (color2) {
|
|
130
|
+
const colorFn = colors[color2] ?? ((s) => s);
|
|
131
|
+
console.log(`${prefix}${header}${colorFn(body)}${suffix}`);
|
|
108
132
|
} else {
|
|
109
|
-
console.log(body);
|
|
133
|
+
console.log(`${prefix}${header}${body}${suffix}`);
|
|
110
134
|
}
|
|
111
135
|
}
|
|
112
136
|
function parseContent(level, ...body) {
|
|
113
|
-
let
|
|
137
|
+
let header = "";
|
|
114
138
|
if (config.format.timestampFormat) {
|
|
115
139
|
const timestamp = dateToString(/* @__PURE__ */ new Date(), config.format.timestampFormat);
|
|
116
|
-
|
|
140
|
+
header += `${timestamp} `;
|
|
117
141
|
}
|
|
118
142
|
switch (config.format.titleCase) {
|
|
119
143
|
case "uppercase":
|
|
@@ -132,8 +156,8 @@ function parseContent(level, ...body) {
|
|
|
132
156
|
level = "";
|
|
133
157
|
break;
|
|
134
158
|
}
|
|
135
|
-
|
|
136
|
-
return
|
|
159
|
+
let content = level + tokenize(...body).join(" ");
|
|
160
|
+
return [header, content];
|
|
137
161
|
}
|
|
138
162
|
function saveToFile(filePath, content) {
|
|
139
163
|
if (!filePath || !content.length) return;
|
|
@@ -142,24 +166,26 @@ function saveToFile(filePath, content) {
|
|
|
142
166
|
import_node_fs.default.mkdirSync(dir, { recursive: true });
|
|
143
167
|
import_node_fs.default.appendFileSync(filePath, logMessage);
|
|
144
168
|
}
|
|
169
|
+
function mergeConfig(current, update) {
|
|
170
|
+
return {
|
|
171
|
+
save: {
|
|
172
|
+
...current.save,
|
|
173
|
+
...update.save
|
|
174
|
+
},
|
|
175
|
+
color: {
|
|
176
|
+
...current.color,
|
|
177
|
+
...update.color
|
|
178
|
+
},
|
|
179
|
+
format: {
|
|
180
|
+
...current.format,
|
|
181
|
+
...update.format
|
|
182
|
+
}
|
|
183
|
+
};
|
|
184
|
+
}
|
|
145
185
|
var logger = {
|
|
146
186
|
// Setter config
|
|
147
187
|
setConfig(newConfig) {
|
|
148
|
-
config =
|
|
149
|
-
...config,
|
|
150
|
-
save: {
|
|
151
|
-
...config.save,
|
|
152
|
-
...newConfig.save
|
|
153
|
-
},
|
|
154
|
-
color: {
|
|
155
|
-
...config.color,
|
|
156
|
-
...newConfig.color
|
|
157
|
-
},
|
|
158
|
-
format: {
|
|
159
|
-
...config.format,
|
|
160
|
-
...newConfig.format
|
|
161
|
-
}
|
|
162
|
-
};
|
|
188
|
+
config = mergeConfig(config, newConfig);
|
|
163
189
|
},
|
|
164
190
|
// Getter config
|
|
165
191
|
config() {
|
|
@@ -197,12 +223,63 @@ var logger = {
|
|
|
197
223
|
...content
|
|
198
224
|
);
|
|
199
225
|
},
|
|
200
|
-
custom(level,
|
|
201
|
-
write(level,
|
|
226
|
+
custom(level, color2, file, ...content) {
|
|
227
|
+
write(level, color2, file, ...content);
|
|
228
|
+
}
|
|
229
|
+
};
|
|
230
|
+
|
|
231
|
+
// src/core/router.ts
|
|
232
|
+
var import_express = require("express");
|
|
233
|
+
var Router = class {
|
|
234
|
+
router;
|
|
235
|
+
pendingMiddleware = [];
|
|
236
|
+
pnedingPath = "";
|
|
237
|
+
constructor() {
|
|
238
|
+
this.router = (0, import_express.Router)();
|
|
239
|
+
}
|
|
240
|
+
middleware(...handlers) {
|
|
241
|
+
this.pendingMiddleware.push(...handlers);
|
|
242
|
+
return this;
|
|
243
|
+
}
|
|
244
|
+
path(path2) {
|
|
245
|
+
this.pnedingPath = path2;
|
|
246
|
+
return this;
|
|
247
|
+
}
|
|
248
|
+
register(method, handler) {
|
|
249
|
+
this.router[method](
|
|
250
|
+
this.pnedingPath,
|
|
251
|
+
...this.pendingMiddleware,
|
|
252
|
+
async (req, res, next) => {
|
|
253
|
+
try {
|
|
254
|
+
await handler(req, res, next);
|
|
255
|
+
} catch (err) {
|
|
256
|
+
next(err);
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
);
|
|
260
|
+
this.pendingMiddleware = [];
|
|
261
|
+
this.pnedingPath = "";
|
|
262
|
+
return this;
|
|
263
|
+
}
|
|
264
|
+
get(handler) {
|
|
265
|
+
return this.register("get", handler);
|
|
266
|
+
}
|
|
267
|
+
post(handler) {
|
|
268
|
+
return this.register("post", handler);
|
|
269
|
+
}
|
|
270
|
+
put(handler) {
|
|
271
|
+
return this.register("put", handler);
|
|
272
|
+
}
|
|
273
|
+
patch(handler) {
|
|
274
|
+
return this.register("patch", handler);
|
|
275
|
+
}
|
|
276
|
+
delete(handler) {
|
|
277
|
+
return this.register("delete", handler);
|
|
202
278
|
}
|
|
203
279
|
};
|
|
204
280
|
// Annotate the CommonJS export names for ESM import in node:
|
|
205
281
|
0 && (module.exports = {
|
|
282
|
+
Router,
|
|
206
283
|
logger
|
|
207
284
|
});
|
|
208
285
|
//# 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/time.ts"],"sourcesContent":["export * from \"./core/logger.js\";","import fs from \"node:fs\"\r\nimport path from \"node:path\";\r\n\r\nimport colors from \"colors\"\r\n\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 | \"red\"\r\n | \"green\"\r\n | \"yellow\"\r\n | \"blue\"\r\n | \"magenta\"\r\n | \"cyan\"\r\n | \"white\"\r\n | \"gray\";\r\n\r\ntype SaveConfig = {\r\n logFilePath: ConfigValue,\r\n errorFilePath: ConfigValue,\r\n warningFilePath: ConfigValue,\r\n}\r\ntype ColorConfig = {\r\n logColor: ColorName | null | false;\r\n errorColor: ColorName | null | false;\r\n warningColor: ColorName | null | false;\r\n debugColor: ColorName | null | false;\r\n}\r\ntype Formatconfig = {\r\n timestampFormat: ConfigValue,\r\n titleCase: Cases,\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: \"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 body = parseContent(level, ...content);\r\n\r\n saveToFile(file, body);\r\n\r\n if (color) {\r\n const colorFn = colors[color] ?? ((s: string) => s);\r\n console.log(colorFn(body));\r\n } else {\r\n console.log(body);\r\n }\r\n}\r\n\r\nfunction parseContent(level: string, ...body: unknown[]): string {\r\n let message = \"\"\r\n if (config.format.timestampFormat) {\r\n const timestamp = dateToString(new Date(), config.format.timestampFormat);\r\n message += `${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\r\n message += level + tokenize(...body).join(\" \");\r\n return message;\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\nexport const logger = {\r\n // Setter config\r\n setConfig(newConfig: PartialConfig): void {\r\n config = {\r\n ...config,\r\n save: {\r\n ...config.save,\r\n ...newConfig.save,\r\n },\r\n color: {\r\n ...config.color,\r\n ...newConfig.color,\r\n },\r\n format: {\r\n ...config.format,\r\n ...newConfig.format,\r\n },\r\n };\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}","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 };"],"mappings":"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","names":["colors","path","fs"]}
|
|
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"]}
|
package/dist/index.d.cts
CHANGED
|
@@ -1,20 +1,25 @@
|
|
|
1
|
+
import { Router as Router$1, RequestHandler } from 'express';
|
|
2
|
+
|
|
1
3
|
type ConfigValue = string | null | false;
|
|
2
4
|
type Cases = "uppercase" | "lowercase" | "capitalize" | "none" | null;
|
|
3
|
-
type ColorName = "red" | "green" | "yellow" | "blue" | "magenta" | "cyan" | "white"
|
|
5
|
+
type ColorName = "black" | "red" | "green" | "yellow" | "blue" | "magenta" | "cyan" | "white";
|
|
6
|
+
type ColorValue = ColorName | null;
|
|
4
7
|
type SaveConfig = {
|
|
5
8
|
logFilePath: ConfigValue;
|
|
6
9
|
errorFilePath: ConfigValue;
|
|
7
10
|
warningFilePath: ConfigValue;
|
|
8
11
|
};
|
|
9
12
|
type ColorConfig = {
|
|
10
|
-
logColor:
|
|
11
|
-
errorColor:
|
|
12
|
-
warningColor:
|
|
13
|
-
debugColor:
|
|
13
|
+
logColor: ColorValue;
|
|
14
|
+
errorColor: ColorValue;
|
|
15
|
+
warningColor: ColorValue;
|
|
16
|
+
debugColor: ColorValue;
|
|
14
17
|
};
|
|
15
18
|
type Formatconfig = {
|
|
16
19
|
timestampFormat: ConfigValue;
|
|
17
20
|
titleCase: Cases;
|
|
21
|
+
prefix?: string;
|
|
22
|
+
suffix?: string;
|
|
18
23
|
};
|
|
19
24
|
type Config = {
|
|
20
25
|
save: SaveConfig;
|
|
@@ -36,4 +41,19 @@ declare const logger: {
|
|
|
36
41
|
custom(level: string, color: ColorName | null | false, file: ConfigValue, ...content: unknown[]): void;
|
|
37
42
|
};
|
|
38
43
|
|
|
39
|
-
|
|
44
|
+
declare class Router {
|
|
45
|
+
readonly router: Router$1;
|
|
46
|
+
private pendingMiddleware;
|
|
47
|
+
private pnedingPath;
|
|
48
|
+
constructor();
|
|
49
|
+
middleware(...handlers: RequestHandler[]): this;
|
|
50
|
+
path(path: string): this;
|
|
51
|
+
private register;
|
|
52
|
+
get(handler: RequestHandler): this;
|
|
53
|
+
post(handler: RequestHandler): this;
|
|
54
|
+
put(handler: RequestHandler): this;
|
|
55
|
+
patch(handler: RequestHandler): this;
|
|
56
|
+
delete(handler: RequestHandler): this;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
export { Router, logger };
|
package/dist/index.d.ts
CHANGED
|
@@ -1,20 +1,25 @@
|
|
|
1
|
+
import { Router as Router$1, RequestHandler } from 'express';
|
|
2
|
+
|
|
1
3
|
type ConfigValue = string | null | false;
|
|
2
4
|
type Cases = "uppercase" | "lowercase" | "capitalize" | "none" | null;
|
|
3
|
-
type ColorName = "red" | "green" | "yellow" | "blue" | "magenta" | "cyan" | "white"
|
|
5
|
+
type ColorName = "black" | "red" | "green" | "yellow" | "blue" | "magenta" | "cyan" | "white";
|
|
6
|
+
type ColorValue = ColorName | null;
|
|
4
7
|
type SaveConfig = {
|
|
5
8
|
logFilePath: ConfigValue;
|
|
6
9
|
errorFilePath: ConfigValue;
|
|
7
10
|
warningFilePath: ConfigValue;
|
|
8
11
|
};
|
|
9
12
|
type ColorConfig = {
|
|
10
|
-
logColor:
|
|
11
|
-
errorColor:
|
|
12
|
-
warningColor:
|
|
13
|
-
debugColor:
|
|
13
|
+
logColor: ColorValue;
|
|
14
|
+
errorColor: ColorValue;
|
|
15
|
+
warningColor: ColorValue;
|
|
16
|
+
debugColor: ColorValue;
|
|
14
17
|
};
|
|
15
18
|
type Formatconfig = {
|
|
16
19
|
timestampFormat: ConfigValue;
|
|
17
20
|
titleCase: Cases;
|
|
21
|
+
prefix?: string;
|
|
22
|
+
suffix?: string;
|
|
18
23
|
};
|
|
19
24
|
type Config = {
|
|
20
25
|
save: SaveConfig;
|
|
@@ -36,4 +41,19 @@ declare const logger: {
|
|
|
36
41
|
custom(level: string, color: ColorName | null | false, file: ConfigValue, ...content: unknown[]): void;
|
|
37
42
|
};
|
|
38
43
|
|
|
39
|
-
|
|
44
|
+
declare class Router {
|
|
45
|
+
readonly router: Router$1;
|
|
46
|
+
private pendingMiddleware;
|
|
47
|
+
private pnedingPath;
|
|
48
|
+
constructor();
|
|
49
|
+
middleware(...handlers: RequestHandler[]): this;
|
|
50
|
+
path(path: string): this;
|
|
51
|
+
private register;
|
|
52
|
+
get(handler: RequestHandler): this;
|
|
53
|
+
post(handler: RequestHandler): this;
|
|
54
|
+
put(handler: RequestHandler): this;
|
|
55
|
+
patch(handler: RequestHandler): this;
|
|
56
|
+
delete(handler: RequestHandler): this;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
export { Router, logger };
|
package/dist/index.js
CHANGED
|
@@ -1,19 +1,39 @@
|
|
|
1
1
|
// src/core/logger.ts
|
|
2
2
|
import fs from "fs";
|
|
3
3
|
import path from "path";
|
|
4
|
-
|
|
4
|
+
|
|
5
|
+
// src/core/colors.ts
|
|
6
|
+
var color = {
|
|
7
|
+
reset: "\x1B[0m",
|
|
8
|
+
black: "\x1B[30m",
|
|
9
|
+
red: "\x1B[31m",
|
|
10
|
+
green: "\x1B[32m",
|
|
11
|
+
yellow: "\x1B[33m",
|
|
12
|
+
blue: "\x1B[34m",
|
|
13
|
+
magenta: "\x1B[35m",
|
|
14
|
+
cyan: "\x1B[36m",
|
|
15
|
+
white: "\x1B[37m",
|
|
16
|
+
bold: "\x1B[1m",
|
|
17
|
+
underline: "\x1B[4m"
|
|
18
|
+
};
|
|
19
|
+
var colors = Object.fromEntries(
|
|
20
|
+
Object.entries(color).filter(([key]) => key !== "reset").map(([key, value]) => [
|
|
21
|
+
key,
|
|
22
|
+
(text) => `${value}${text}${color.reset}`
|
|
23
|
+
])
|
|
24
|
+
);
|
|
5
25
|
|
|
6
26
|
// src/core/time.ts
|
|
7
27
|
function dateToString(date, format) {
|
|
8
|
-
return format.replace(/(
|
|
28
|
+
return format.replace(/(YYYY|MM|DD|hh|mm|ss)/g, (match) => {
|
|
9
29
|
switch (match) {
|
|
10
|
-
case "
|
|
30
|
+
case "YYYY":
|
|
11
31
|
return date.getFullYear().toString();
|
|
12
32
|
case "MM":
|
|
13
33
|
return (date.getMonth() + 1).toString().padStart(2, "0");
|
|
14
|
-
case "
|
|
34
|
+
case "DD":
|
|
15
35
|
return date.getDate().toString().padStart(2, "0");
|
|
16
|
-
case "
|
|
36
|
+
case "hh":
|
|
17
37
|
return date.getHours().toString().padStart(2, "0");
|
|
18
38
|
case "mm":
|
|
19
39
|
return date.getMinutes().toString().padStart(2, "0");
|
|
@@ -29,7 +49,8 @@ function dateToString(date, format) {
|
|
|
29
49
|
var defaultConfig = {
|
|
30
50
|
save: {
|
|
31
51
|
logFilePath: null,
|
|
32
|
-
errorFilePath:
|
|
52
|
+
errorFilePath: null,
|
|
53
|
+
//"logs/error.log",
|
|
33
54
|
warningFilePath: null
|
|
34
55
|
},
|
|
35
56
|
color: {
|
|
@@ -39,7 +60,7 @@ var defaultConfig = {
|
|
|
39
60
|
debugColor: null
|
|
40
61
|
},
|
|
41
62
|
format: {
|
|
42
|
-
timestampFormat: "
|
|
63
|
+
timestampFormat: "DD-MM-YYYY hh:mm:ss",
|
|
43
64
|
titleCase: "uppercase"
|
|
44
65
|
}
|
|
45
66
|
};
|
|
@@ -63,21 +84,23 @@ function tokenize(...args) {
|
|
|
63
84
|
return String(arg);
|
|
64
85
|
});
|
|
65
86
|
}
|
|
66
|
-
function write(level,
|
|
67
|
-
const body = parseContent(level, ...content);
|
|
68
|
-
saveToFile(file, body);
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
87
|
+
function write(level, color2, file, ...content) {
|
|
88
|
+
const [header, body] = parseContent(level, ...content);
|
|
89
|
+
saveToFile(file, header + body);
|
|
90
|
+
const prefix = config.format.prefix ?? "";
|
|
91
|
+
const suffix = config.format.suffix ?? "";
|
|
92
|
+
if (color2) {
|
|
93
|
+
const colorFn = colors[color2] ?? ((s) => s);
|
|
94
|
+
console.log(`${prefix}${header}${colorFn(body)}${suffix}`);
|
|
72
95
|
} else {
|
|
73
|
-
console.log(body);
|
|
96
|
+
console.log(`${prefix}${header}${body}${suffix}`);
|
|
74
97
|
}
|
|
75
98
|
}
|
|
76
99
|
function parseContent(level, ...body) {
|
|
77
|
-
let
|
|
100
|
+
let header = "";
|
|
78
101
|
if (config.format.timestampFormat) {
|
|
79
102
|
const timestamp = dateToString(/* @__PURE__ */ new Date(), config.format.timestampFormat);
|
|
80
|
-
|
|
103
|
+
header += `${timestamp} `;
|
|
81
104
|
}
|
|
82
105
|
switch (config.format.titleCase) {
|
|
83
106
|
case "uppercase":
|
|
@@ -96,8 +119,8 @@ function parseContent(level, ...body) {
|
|
|
96
119
|
level = "";
|
|
97
120
|
break;
|
|
98
121
|
}
|
|
99
|
-
|
|
100
|
-
return
|
|
122
|
+
let content = level + tokenize(...body).join(" ");
|
|
123
|
+
return [header, content];
|
|
101
124
|
}
|
|
102
125
|
function saveToFile(filePath, content) {
|
|
103
126
|
if (!filePath || !content.length) return;
|
|
@@ -106,24 +129,26 @@ function saveToFile(filePath, content) {
|
|
|
106
129
|
fs.mkdirSync(dir, { recursive: true });
|
|
107
130
|
fs.appendFileSync(filePath, logMessage);
|
|
108
131
|
}
|
|
132
|
+
function mergeConfig(current, update) {
|
|
133
|
+
return {
|
|
134
|
+
save: {
|
|
135
|
+
...current.save,
|
|
136
|
+
...update.save
|
|
137
|
+
},
|
|
138
|
+
color: {
|
|
139
|
+
...current.color,
|
|
140
|
+
...update.color
|
|
141
|
+
},
|
|
142
|
+
format: {
|
|
143
|
+
...current.format,
|
|
144
|
+
...update.format
|
|
145
|
+
}
|
|
146
|
+
};
|
|
147
|
+
}
|
|
109
148
|
var logger = {
|
|
110
149
|
// Setter config
|
|
111
150
|
setConfig(newConfig) {
|
|
112
|
-
config =
|
|
113
|
-
...config,
|
|
114
|
-
save: {
|
|
115
|
-
...config.save,
|
|
116
|
-
...newConfig.save
|
|
117
|
-
},
|
|
118
|
-
color: {
|
|
119
|
-
...config.color,
|
|
120
|
-
...newConfig.color
|
|
121
|
-
},
|
|
122
|
-
format: {
|
|
123
|
-
...config.format,
|
|
124
|
-
...newConfig.format
|
|
125
|
-
}
|
|
126
|
-
};
|
|
151
|
+
config = mergeConfig(config, newConfig);
|
|
127
152
|
},
|
|
128
153
|
// Getter config
|
|
129
154
|
config() {
|
|
@@ -161,11 +186,62 @@ var logger = {
|
|
|
161
186
|
...content
|
|
162
187
|
);
|
|
163
188
|
},
|
|
164
|
-
custom(level,
|
|
165
|
-
write(level,
|
|
189
|
+
custom(level, color2, file, ...content) {
|
|
190
|
+
write(level, color2, file, ...content);
|
|
191
|
+
}
|
|
192
|
+
};
|
|
193
|
+
|
|
194
|
+
// src/core/router.ts
|
|
195
|
+
import { Router as ExpressRouter } from "express";
|
|
196
|
+
var Router = class {
|
|
197
|
+
router;
|
|
198
|
+
pendingMiddleware = [];
|
|
199
|
+
pnedingPath = "";
|
|
200
|
+
constructor() {
|
|
201
|
+
this.router = ExpressRouter();
|
|
202
|
+
}
|
|
203
|
+
middleware(...handlers) {
|
|
204
|
+
this.pendingMiddleware.push(...handlers);
|
|
205
|
+
return this;
|
|
206
|
+
}
|
|
207
|
+
path(path2) {
|
|
208
|
+
this.pnedingPath = path2;
|
|
209
|
+
return this;
|
|
210
|
+
}
|
|
211
|
+
register(method, handler) {
|
|
212
|
+
this.router[method](
|
|
213
|
+
this.pnedingPath,
|
|
214
|
+
...this.pendingMiddleware,
|
|
215
|
+
async (req, res, next) => {
|
|
216
|
+
try {
|
|
217
|
+
await handler(req, res, next);
|
|
218
|
+
} catch (err) {
|
|
219
|
+
next(err);
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
);
|
|
223
|
+
this.pendingMiddleware = [];
|
|
224
|
+
this.pnedingPath = "";
|
|
225
|
+
return this;
|
|
226
|
+
}
|
|
227
|
+
get(handler) {
|
|
228
|
+
return this.register("get", handler);
|
|
229
|
+
}
|
|
230
|
+
post(handler) {
|
|
231
|
+
return this.register("post", handler);
|
|
232
|
+
}
|
|
233
|
+
put(handler) {
|
|
234
|
+
return this.register("put", handler);
|
|
235
|
+
}
|
|
236
|
+
patch(handler) {
|
|
237
|
+
return this.register("patch", handler);
|
|
238
|
+
}
|
|
239
|
+
delete(handler) {
|
|
240
|
+
return this.register("delete", handler);
|
|
166
241
|
}
|
|
167
242
|
};
|
|
168
243
|
export {
|
|
244
|
+
Router,
|
|
169
245
|
logger
|
|
170
246
|
};
|
|
171
247
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/core/logger.ts","../src/core/time.ts"],"sourcesContent":["import fs from \"node:fs\"\r\nimport path from \"node:path\";\r\n\r\nimport colors from \"colors\"\r\n\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 | \"red\"\r\n | \"green\"\r\n | \"yellow\"\r\n | \"blue\"\r\n | \"magenta\"\r\n | \"cyan\"\r\n | \"white\"\r\n | \"gray\";\r\n\r\ntype SaveConfig = {\r\n logFilePath: ConfigValue,\r\n errorFilePath: ConfigValue,\r\n warningFilePath: ConfigValue,\r\n}\r\ntype ColorConfig = {\r\n logColor: ColorName | null | false;\r\n errorColor: ColorName | null | false;\r\n warningColor: ColorName | null | false;\r\n debugColor: ColorName | null | false;\r\n}\r\ntype Formatconfig = {\r\n timestampFormat: ConfigValue,\r\n titleCase: Cases,\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: \"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 body = parseContent(level, ...content);\r\n\r\n saveToFile(file, body);\r\n\r\n if (color) {\r\n const colorFn = colors[color] ?? ((s: string) => s);\r\n console.log(colorFn(body));\r\n } else {\r\n console.log(body);\r\n }\r\n}\r\n\r\nfunction parseContent(level: string, ...body: unknown[]): string {\r\n let message = \"\"\r\n if (config.format.timestampFormat) {\r\n const timestamp = dateToString(new Date(), config.format.timestampFormat);\r\n message += `${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\r\n message += level + tokenize(...body).join(\" \");\r\n return message;\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\nexport const logger = {\r\n // Setter config\r\n setConfig(newConfig: PartialConfig): void {\r\n config = {\r\n ...config,\r\n save: {\r\n ...config.save,\r\n ...newConfig.save,\r\n },\r\n color: {\r\n ...config.color,\r\n ...newConfig.color,\r\n },\r\n format: {\r\n ...config.format,\r\n ...newConfig.format,\r\n },\r\n };\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}","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 };"],"mappings":";AAAA,OAAO,QAAQ;AACf,OAAO,UAAU;AAEjB,OAAO,YAAY;;;ACHnB,SAAS,aAAc,MAAY,QAAwB;AACvD,SAAO,OAAO,QAAQ,0BAA0B,CAAC,UAAU;AACvD,YAAQ,OAAO;AAAA,MACX,KAAK;AACD,eAAO,KAAK,YAAY,EAAE,SAAS;AAAA,MACvC,KAAK;AACD,gBAAQ,KAAK,SAAS,IAAI,GAAG,SAAS,EAAE,SAAS,GAAG,GAAG;AAAA,MAC3D,KAAK;AACD,eAAO,KAAK,QAAQ,EAAE,SAAS,EAAE,SAAS,GAAG,GAAG;AAAA,MACpD,KAAK;AACD,eAAO,KAAK,SAAS,EAAE,SAAS,EAAE,SAAS,GAAG,GAAG;AAAA,MACrD,KAAK;AACD,eAAO,KAAK,WAAW,EAAE,SAAS,EAAE,SAAS,GAAG,GAAG;AAAA,MACvD,KAAK;AACD,eAAO,KAAK,WAAW,EAAE,SAAS,EAAE,SAAS,GAAG,GAAG;AAAA,MACvD;AACI,eAAO;AAAA,IACf;AAAA,EACJ,CAAC;AACL;;;AD4BA,IAAM,gBAAwB;AAAA,EAC1B,MAAM;AAAA,IACF,aAAa;AAAA,IACb,eAAe;AAAA,IACf,iBAAiB;AAAA,EACrB;AAAA,EACA,OAAO;AAAA,IACH,UAAU;AAAA,IACV,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,OACA,OACA,SACG,SACL;AACE,QAAM,OAAO,aAAa,OAAO,GAAG,OAAO;AAE3C,aAAW,MAAM,IAAI;AAErB,MAAI,OAAO;AACP,UAAM,UAAU,OAAO,KAAK,MAAM,CAAC,MAAc;AACjD,YAAQ,IAAI,QAAQ,IAAI,CAAC;AAAA,EAC7B,OAAO;AACH,YAAQ,IAAI,IAAI;AAAA,EACpB;AACJ;AAEA,SAAS,aAAa,UAAkB,MAAyB;AAC7D,MAAI,UAAU;AACd,MAAI,OAAO,OAAO,iBAAiB;AAC/B,UAAM,YAAY,aAAa,oBAAI,KAAK,GAAG,OAAO,OAAO,eAAe;AACxE,eAAW,GAAG,SAAS;AAAA,EAC3B;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;AAEA,aAAW,QAAQ,SAAS,GAAG,IAAI,EAAE,KAAK,GAAG;AAC7C,SAAO;AACX;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;AAEO,IAAM,SAAS;AAAA;AAAA,EAElB,UAAU,WAAgC;AACtC,aAAS;AAAA,MACL,GAAG;AAAA,MACH,MAAM;AAAA,QACF,GAAG,OAAO;AAAA,QACV,GAAG,UAAU;AAAA,MACjB;AAAA,MACA,OAAO;AAAA,QACH,GAAG,OAAO;AAAA,QACV,GAAG,UAAU;AAAA,MACjB;AAAA,MACA,QAAQ;AAAA,QACJ,GAAG,OAAO;AAAA,QACV,GAAG,UAAU;AAAA,MACjB;AAAA,IACJ;AAAA,EACJ;AAAA;AAAA,EAGA,SAA2B;AACvB,WAAO,OAAO,OAAO,gBAAgB,MAAM,CAAC;AAAA,EAChD;AAAA,EAEA,OAAO,SAAoB;AACvB;AAAA,MACI;AAAA,MACA,OAAO,MAAM;AAAA,MACb,OAAO,KAAK;AAAA,MACZ,GAAG;AAAA,IACP;AAAA,EACJ;AAAA,EAEA,SAAS,SAAoB;AACzB;AAAA,MACI;AAAA,MACA,OAAO,MAAM;AAAA,MACb,OAAO,KAAK;AAAA,MACZ,GAAG;AAAA,IACP;AAAA,EACJ;AAAA,EAEA,WAAW,SAAoB;AAC3B;AAAA,MACI;AAAA,MACA,OAAO,MAAM;AAAA,MACb,OAAO,KAAK;AAAA,MACZ,GAAG;AAAA,IACP;AAAA,EACJ;AAAA,EAEA,SAAS,SAAoB;AACzB;AAAA,MACI;AAAA,MACA,OAAO,MAAM;AAAA,MACb;AAAA,MACA,GAAG;AAAA,IACP;AAAA,EACJ;AAAA,EAEA,OACI,OACA,OACA,SACG,SACL;AACE,UAAM,OAAO,OAAO,MAAM,GAAG,OAAO;AAAA,EACxC;AAGJ;","names":[]}
|
|
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"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@desaubv/quik",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.3",
|
|
4
4
|
"description": "Quik",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.cjs",
|
|
@@ -30,12 +30,12 @@
|
|
|
30
30
|
"author": "desaubv",
|
|
31
31
|
"license": "ISC",
|
|
32
32
|
"devDependencies": {
|
|
33
|
+
"@types/express": "^5.0.6",
|
|
33
34
|
"@types/node": "^26.1.2",
|
|
34
35
|
"tsup": "^8.5.1",
|
|
35
|
-
"tsx": "^4.23.6",
|
|
36
36
|
"typescript": "~5.9.3"
|
|
37
37
|
},
|
|
38
38
|
"dependencies": {
|
|
39
|
-
"
|
|
39
|
+
"express": "^5.2.1"
|
|
40
40
|
}
|
|
41
41
|
}
|