@desaubv/quik 0.0.1 → 0.0.2
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 +57 -33
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +8 -5
- package/dist/index.d.ts +8 -5
- package/dist/index.js +57 -33
- package/dist/index.js.map +1 -1
- package/package.json +1 -5
package/dist/index.cjs
CHANGED
|
@@ -37,19 +37,39 @@ module.exports = __toCommonJS(index_exports);
|
|
|
37
37
|
// src/core/logger.ts
|
|
38
38
|
var import_node_fs = __toESM(require("fs"), 1);
|
|
39
39
|
var import_node_path = __toESM(require("path"), 1);
|
|
40
|
-
|
|
40
|
+
|
|
41
|
+
// src/core/colors.ts
|
|
42
|
+
var color = {
|
|
43
|
+
reset: "\x1B[0m",
|
|
44
|
+
black: "\x1B[30m",
|
|
45
|
+
red: "\x1B[31m",
|
|
46
|
+
green: "\x1B[32m",
|
|
47
|
+
yellow: "\x1B[33m",
|
|
48
|
+
blue: "\x1B[34m",
|
|
49
|
+
magenta: "\x1B[35m",
|
|
50
|
+
cyan: "\x1B[36m",
|
|
51
|
+
white: "\x1B[37m",
|
|
52
|
+
bold: "\x1B[1m",
|
|
53
|
+
underline: "\x1B[4m"
|
|
54
|
+
};
|
|
55
|
+
var colors = Object.fromEntries(
|
|
56
|
+
Object.entries(color).filter(([key]) => key !== "reset").map(([key, value]) => [
|
|
57
|
+
key,
|
|
58
|
+
(text) => `${value}${text}${color.reset}`
|
|
59
|
+
])
|
|
60
|
+
);
|
|
41
61
|
|
|
42
62
|
// src/core/time.ts
|
|
43
63
|
function dateToString(date, format) {
|
|
44
|
-
return format.replace(/(
|
|
64
|
+
return format.replace(/(YYYY|MM|DD|hh|mm|ss)/g, (match) => {
|
|
45
65
|
switch (match) {
|
|
46
|
-
case "
|
|
66
|
+
case "YYYY":
|
|
47
67
|
return date.getFullYear().toString();
|
|
48
68
|
case "MM":
|
|
49
69
|
return (date.getMonth() + 1).toString().padStart(2, "0");
|
|
50
|
-
case "
|
|
70
|
+
case "DD":
|
|
51
71
|
return date.getDate().toString().padStart(2, "0");
|
|
52
|
-
case "
|
|
72
|
+
case "hh":
|
|
53
73
|
return date.getHours().toString().padStart(2, "0");
|
|
54
74
|
case "mm":
|
|
55
75
|
return date.getMinutes().toString().padStart(2, "0");
|
|
@@ -99,21 +119,23 @@ function tokenize(...args) {
|
|
|
99
119
|
return String(arg);
|
|
100
120
|
});
|
|
101
121
|
}
|
|
102
|
-
function write(level,
|
|
103
|
-
const body = parseContent(level, ...content);
|
|
104
|
-
saveToFile(file, body);
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
122
|
+
function write(level, color2, file, ...content) {
|
|
123
|
+
const [header, body] = parseContent(level, ...content);
|
|
124
|
+
saveToFile(file, header + body);
|
|
125
|
+
const prefix = config.format.prefix ?? "";
|
|
126
|
+
const suffix = config.format.suffix ?? "";
|
|
127
|
+
if (color2) {
|
|
128
|
+
const colorFn = colors[color2] ?? ((s) => s);
|
|
129
|
+
console.log(`${prefix}${header}${colorFn(body)}${suffix}`);
|
|
108
130
|
} else {
|
|
109
|
-
console.log(body);
|
|
131
|
+
console.log(`${prefix}${header}${body}${suffix}`);
|
|
110
132
|
}
|
|
111
133
|
}
|
|
112
134
|
function parseContent(level, ...body) {
|
|
113
|
-
let
|
|
135
|
+
let header = "";
|
|
114
136
|
if (config.format.timestampFormat) {
|
|
115
137
|
const timestamp = dateToString(/* @__PURE__ */ new Date(), config.format.timestampFormat);
|
|
116
|
-
|
|
138
|
+
header += `${timestamp} `;
|
|
117
139
|
}
|
|
118
140
|
switch (config.format.titleCase) {
|
|
119
141
|
case "uppercase":
|
|
@@ -132,8 +154,8 @@ function parseContent(level, ...body) {
|
|
|
132
154
|
level = "";
|
|
133
155
|
break;
|
|
134
156
|
}
|
|
135
|
-
|
|
136
|
-
return
|
|
157
|
+
let content = level + tokenize(...body).join(" ");
|
|
158
|
+
return [header, content];
|
|
137
159
|
}
|
|
138
160
|
function saveToFile(filePath, content) {
|
|
139
161
|
if (!filePath || !content.length) return;
|
|
@@ -142,24 +164,26 @@ function saveToFile(filePath, content) {
|
|
|
142
164
|
import_node_fs.default.mkdirSync(dir, { recursive: true });
|
|
143
165
|
import_node_fs.default.appendFileSync(filePath, logMessage);
|
|
144
166
|
}
|
|
167
|
+
function mergeConfig(current, update) {
|
|
168
|
+
return {
|
|
169
|
+
save: {
|
|
170
|
+
...current.save,
|
|
171
|
+
...update.save
|
|
172
|
+
},
|
|
173
|
+
color: {
|
|
174
|
+
...current.color,
|
|
175
|
+
...update.color
|
|
176
|
+
},
|
|
177
|
+
format: {
|
|
178
|
+
...current.format,
|
|
179
|
+
...update.format
|
|
180
|
+
}
|
|
181
|
+
};
|
|
182
|
+
}
|
|
145
183
|
var logger = {
|
|
146
184
|
// Setter config
|
|
147
185
|
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
|
-
};
|
|
186
|
+
config = mergeConfig(config, newConfig);
|
|
163
187
|
},
|
|
164
188
|
// Getter config
|
|
165
189
|
config() {
|
|
@@ -197,8 +221,8 @@ var logger = {
|
|
|
197
221
|
...content
|
|
198
222
|
);
|
|
199
223
|
},
|
|
200
|
-
custom(level,
|
|
201
|
-
write(level,
|
|
224
|
+
custom(level, color2, file, ...content) {
|
|
225
|
+
write(level, color2, file, ...content);
|
|
202
226
|
}
|
|
203
227
|
};
|
|
204
228
|
// Annotate the CommonJS export names for ESM import in node:
|
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"],"sourcesContent":["export { logger } from \"./core/logger.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: \"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 };"],"mappings":"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","names":["color","path","fs"]}
|
package/dist/index.d.cts
CHANGED
|
@@ -1,20 +1,23 @@
|
|
|
1
1
|
type ConfigValue = string | null | false;
|
|
2
2
|
type Cases = "uppercase" | "lowercase" | "capitalize" | "none" | null;
|
|
3
|
-
type ColorName = "red" | "green" | "yellow" | "blue" | "magenta" | "cyan" | "white"
|
|
3
|
+
type ColorName = "black" | "red" | "green" | "yellow" | "blue" | "magenta" | "cyan" | "white";
|
|
4
|
+
type ColorValue = ColorName | null;
|
|
4
5
|
type SaveConfig = {
|
|
5
6
|
logFilePath: ConfigValue;
|
|
6
7
|
errorFilePath: ConfigValue;
|
|
7
8
|
warningFilePath: ConfigValue;
|
|
8
9
|
};
|
|
9
10
|
type ColorConfig = {
|
|
10
|
-
logColor:
|
|
11
|
-
errorColor:
|
|
12
|
-
warningColor:
|
|
13
|
-
debugColor:
|
|
11
|
+
logColor: ColorValue;
|
|
12
|
+
errorColor: ColorValue;
|
|
13
|
+
warningColor: ColorValue;
|
|
14
|
+
debugColor: ColorValue;
|
|
14
15
|
};
|
|
15
16
|
type Formatconfig = {
|
|
16
17
|
timestampFormat: ConfigValue;
|
|
17
18
|
titleCase: Cases;
|
|
19
|
+
prefix?: string;
|
|
20
|
+
suffix?: string;
|
|
18
21
|
};
|
|
19
22
|
type Config = {
|
|
20
23
|
save: SaveConfig;
|
package/dist/index.d.ts
CHANGED
|
@@ -1,20 +1,23 @@
|
|
|
1
1
|
type ConfigValue = string | null | false;
|
|
2
2
|
type Cases = "uppercase" | "lowercase" | "capitalize" | "none" | null;
|
|
3
|
-
type ColorName = "red" | "green" | "yellow" | "blue" | "magenta" | "cyan" | "white"
|
|
3
|
+
type ColorName = "black" | "red" | "green" | "yellow" | "blue" | "magenta" | "cyan" | "white";
|
|
4
|
+
type ColorValue = ColorName | null;
|
|
4
5
|
type SaveConfig = {
|
|
5
6
|
logFilePath: ConfigValue;
|
|
6
7
|
errorFilePath: ConfigValue;
|
|
7
8
|
warningFilePath: ConfigValue;
|
|
8
9
|
};
|
|
9
10
|
type ColorConfig = {
|
|
10
|
-
logColor:
|
|
11
|
-
errorColor:
|
|
12
|
-
warningColor:
|
|
13
|
-
debugColor:
|
|
11
|
+
logColor: ColorValue;
|
|
12
|
+
errorColor: ColorValue;
|
|
13
|
+
warningColor: ColorValue;
|
|
14
|
+
debugColor: ColorValue;
|
|
14
15
|
};
|
|
15
16
|
type Formatconfig = {
|
|
16
17
|
timestampFormat: ConfigValue;
|
|
17
18
|
titleCase: Cases;
|
|
19
|
+
prefix?: string;
|
|
20
|
+
suffix?: string;
|
|
18
21
|
};
|
|
19
22
|
type Config = {
|
|
20
23
|
save: SaveConfig;
|
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");
|
|
@@ -63,21 +83,23 @@ function tokenize(...args) {
|
|
|
63
83
|
return String(arg);
|
|
64
84
|
});
|
|
65
85
|
}
|
|
66
|
-
function write(level,
|
|
67
|
-
const body = parseContent(level, ...content);
|
|
68
|
-
saveToFile(file, body);
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
86
|
+
function write(level, color2, file, ...content) {
|
|
87
|
+
const [header, body] = parseContent(level, ...content);
|
|
88
|
+
saveToFile(file, header + body);
|
|
89
|
+
const prefix = config.format.prefix ?? "";
|
|
90
|
+
const suffix = config.format.suffix ?? "";
|
|
91
|
+
if (color2) {
|
|
92
|
+
const colorFn = colors[color2] ?? ((s) => s);
|
|
93
|
+
console.log(`${prefix}${header}${colorFn(body)}${suffix}`);
|
|
72
94
|
} else {
|
|
73
|
-
console.log(body);
|
|
95
|
+
console.log(`${prefix}${header}${body}${suffix}`);
|
|
74
96
|
}
|
|
75
97
|
}
|
|
76
98
|
function parseContent(level, ...body) {
|
|
77
|
-
let
|
|
99
|
+
let header = "";
|
|
78
100
|
if (config.format.timestampFormat) {
|
|
79
101
|
const timestamp = dateToString(/* @__PURE__ */ new Date(), config.format.timestampFormat);
|
|
80
|
-
|
|
102
|
+
header += `${timestamp} `;
|
|
81
103
|
}
|
|
82
104
|
switch (config.format.titleCase) {
|
|
83
105
|
case "uppercase":
|
|
@@ -96,8 +118,8 @@ function parseContent(level, ...body) {
|
|
|
96
118
|
level = "";
|
|
97
119
|
break;
|
|
98
120
|
}
|
|
99
|
-
|
|
100
|
-
return
|
|
121
|
+
let content = level + tokenize(...body).join(" ");
|
|
122
|
+
return [header, content];
|
|
101
123
|
}
|
|
102
124
|
function saveToFile(filePath, content) {
|
|
103
125
|
if (!filePath || !content.length) return;
|
|
@@ -106,24 +128,26 @@ function saveToFile(filePath, content) {
|
|
|
106
128
|
fs.mkdirSync(dir, { recursive: true });
|
|
107
129
|
fs.appendFileSync(filePath, logMessage);
|
|
108
130
|
}
|
|
131
|
+
function mergeConfig(current, update) {
|
|
132
|
+
return {
|
|
133
|
+
save: {
|
|
134
|
+
...current.save,
|
|
135
|
+
...update.save
|
|
136
|
+
},
|
|
137
|
+
color: {
|
|
138
|
+
...current.color,
|
|
139
|
+
...update.color
|
|
140
|
+
},
|
|
141
|
+
format: {
|
|
142
|
+
...current.format,
|
|
143
|
+
...update.format
|
|
144
|
+
}
|
|
145
|
+
};
|
|
146
|
+
}
|
|
109
147
|
var logger = {
|
|
110
148
|
// Setter config
|
|
111
149
|
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
|
-
};
|
|
150
|
+
config = mergeConfig(config, newConfig);
|
|
127
151
|
},
|
|
128
152
|
// Getter config
|
|
129
153
|
config() {
|
|
@@ -161,8 +185,8 @@ var logger = {
|
|
|
161
185
|
...content
|
|
162
186
|
);
|
|
163
187
|
},
|
|
164
|
-
custom(level,
|
|
165
|
-
write(level,
|
|
188
|
+
custom(level, color2, file, ...content) {
|
|
189
|
+
write(level, color2, file, ...content);
|
|
166
190
|
}
|
|
167
191
|
};
|
|
168
192
|
export {
|
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":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/core/logger.ts","../src/core/colors.ts","../src/core/time.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: \"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 };"],"mappings":"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","names":["color"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@desaubv/quik",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.2",
|
|
4
4
|
"description": "Quik",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.cjs",
|
|
@@ -32,10 +32,6 @@
|
|
|
32
32
|
"devDependencies": {
|
|
33
33
|
"@types/node": "^26.1.2",
|
|
34
34
|
"tsup": "^8.5.1",
|
|
35
|
-
"tsx": "^4.23.6",
|
|
36
35
|
"typescript": "~5.9.3"
|
|
37
|
-
},
|
|
38
|
-
"dependencies": {
|
|
39
|
-
"colors": "^1.4.0"
|
|
40
36
|
}
|
|
41
37
|
}
|