@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 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
- var import_colors = __toESM(require("colors"), 1);
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(/(yyyy|MM|dd|HH|mm|ss)/g, (match) => {
64
+ return format.replace(/(YYYY|MM|DD|hh|mm|ss)/g, (match) => {
45
65
  switch (match) {
46
- case "yyyy":
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 "dd":
70
+ case "DD":
51
71
  return date.getDate().toString().padStart(2, "0");
52
- case "HH":
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, color, file, ...content) {
103
- const body = parseContent(level, ...content);
104
- saveToFile(file, body);
105
- if (color) {
106
- const colorFn = import_colors.default[color] ?? ((s) => s);
107
- console.log(colorFn(body));
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 message = "";
135
+ let header = "";
114
136
  if (config.format.timestampFormat) {
115
137
  const timestamp = dateToString(/* @__PURE__ */ new Date(), config.format.timestampFormat);
116
- message += `${timestamp} `;
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
- message += level + tokenize(...body).join(" ");
136
- return message;
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, color, file, ...content) {
201
- write(level, color, file, ...content);
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:
@@ -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" | "gray";
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: ColorName | null | false;
11
- errorColor: ColorName | null | false;
12
- warningColor: ColorName | null | false;
13
- debugColor: ColorName | null | false;
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" | "gray";
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: ColorName | null | false;
11
- errorColor: ColorName | null | false;
12
- warningColor: ColorName | null | false;
13
- debugColor: ColorName | null | false;
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
- import colors from "colors";
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(/(yyyy|MM|dd|HH|mm|ss)/g, (match) => {
28
+ return format.replace(/(YYYY|MM|DD|hh|mm|ss)/g, (match) => {
9
29
  switch (match) {
10
- case "yyyy":
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 "dd":
34
+ case "DD":
15
35
  return date.getDate().toString().padStart(2, "0");
16
- case "HH":
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, color, file, ...content) {
67
- const body = parseContent(level, ...content);
68
- saveToFile(file, body);
69
- if (color) {
70
- const colorFn = colors[color] ?? ((s) => s);
71
- console.log(colorFn(body));
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 message = "";
99
+ let header = "";
78
100
  if (config.format.timestampFormat) {
79
101
  const timestamp = dateToString(/* @__PURE__ */ new Date(), config.format.timestampFormat);
80
- message += `${timestamp} `;
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
- message += level + tokenize(...body).join(" ");
100
- return message;
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, color, file, ...content) {
165
- write(level, color, file, ...content);
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.1",
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
  }