@chaeco/logger 0.1.7

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.
Files changed (40) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +123 -0
  3. package/README.zh-CN.md +126 -0
  4. package/dist/core/logger.d.ts +41 -0
  5. package/dist/core/logger.d.ts.map +1 -0
  6. package/dist/core/logger.js +233 -0
  7. package/dist/core/logger.js.map +1 -0
  8. package/dist/core/types.d.ts +155 -0
  9. package/dist/core/types.d.ts.map +1 -0
  10. package/dist/core/types.js +3 -0
  11. package/dist/core/types.js.map +1 -0
  12. package/dist/file/async-queue.d.ts +24 -0
  13. package/dist/file/async-queue.d.ts.map +1 -0
  14. package/dist/file/async-queue.js +95 -0
  15. package/dist/file/async-queue.js.map +1 -0
  16. package/dist/file/file-manager.d.ts +29 -0
  17. package/dist/file/file-manager.d.ts.map +1 -0
  18. package/dist/file/file-manager.js +85 -0
  19. package/dist/file/file-manager.js.map +1 -0
  20. package/dist/file/node-writer.d.ts +30 -0
  21. package/dist/file/node-writer.d.ts.map +1 -0
  22. package/dist/file/node-writer.js +219 -0
  23. package/dist/file/node-writer.js.map +1 -0
  24. package/dist/index.d.ts +16 -0
  25. package/dist/index.d.ts.map +1 -0
  26. package/dist/index.js +22 -0
  27. package/dist/index.js.map +1 -0
  28. package/dist/utils/caller-info.d.ts +29 -0
  29. package/dist/utils/caller-info.d.ts.map +1 -0
  30. package/dist/utils/caller-info.js +120 -0
  31. package/dist/utils/caller-info.js.map +1 -0
  32. package/dist/utils/color-utils.d.ts +19 -0
  33. package/dist/utils/color-utils.d.ts.map +1 -0
  34. package/dist/utils/color-utils.js +51 -0
  35. package/dist/utils/color-utils.js.map +1 -0
  36. package/dist/utils/formatter.d.ts +51 -0
  37. package/dist/utils/formatter.d.ts.map +1 -0
  38. package/dist/utils/formatter.js +166 -0
  39. package/dist/utils/formatter.js.map +1 -0
  40. package/package.json +63 -0
@@ -0,0 +1,166 @@
1
+ "use strict";
2
+ /* eslint-disable @typescript-eslint/no-explicit-any */
3
+ var __importDefault = (this && this.__importDefault) || function (mod) {
4
+ return (mod && mod.__esModule) ? mod : { "default": mod };
5
+ };
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.LogFormatter = void 0;
8
+ const color_utils_1 = require("./color-utils");
9
+ const dayjs_1 = __importDefault(require("dayjs"));
10
+ /**
11
+ * 日志格式化器
12
+ * @internal
13
+ * 负责将 LogEntry 转换为可输出的字符串,支持普通文本、彩色控制台和 JSON 格式。
14
+ */
15
+ class LogFormatter {
16
+ constructor(settings) {
17
+ this.settings = settings;
18
+ }
19
+ /**
20
+ * 更新格式化选项(支持部分更新)
21
+ */
22
+ updateFormat(options) {
23
+ const f = this.settings.format;
24
+ if (options.enabled !== undefined)
25
+ f.enabled = options.enabled;
26
+ if (options.timestampFormat !== undefined)
27
+ f.timestampFormat = options.timestampFormat;
28
+ if (options.formatter !== undefined)
29
+ f.formatter = options.formatter;
30
+ if (options.includeStack !== undefined)
31
+ f.includeStack = options.includeStack;
32
+ if (options.includeName !== undefined)
33
+ f.includeName = options.includeName;
34
+ if (options.json !== undefined)
35
+ f.json = options.json;
36
+ if (options.jsonIndent !== undefined)
37
+ f.jsonIndent = options.jsonIndent;
38
+ }
39
+ // ─── 公开格式化方法 ───────────────────────────────────────
40
+ /**
41
+ * 格式化为文件输出字符串。
42
+ * 注意:文件日志始终包含时间戳,与控制台的 consoleTimestamp 开关无关。
43
+ */
44
+ formatMessage(entry) {
45
+ const { format } = this.settings;
46
+ // 自定义格式化函数
47
+ if (format.enabled && format.formatter) {
48
+ try {
49
+ return format.formatter(entry);
50
+ }
51
+ catch (error) {
52
+ console.error('Error in custom formatter:', error);
53
+ // 降级到默认格式
54
+ }
55
+ }
56
+ // JSON 格式输出
57
+ if (format.json) {
58
+ const jsonEntry = {
59
+ timestamp: entry.timestamp,
60
+ level: entry.level,
61
+ message: entry.message,
62
+ };
63
+ if (format.includeName && entry.name)
64
+ jsonEntry.name = entry.name;
65
+ if (format.includeStack && entry.file && entry.line) {
66
+ jsonEntry.file = entry.file;
67
+ jsonEntry.line = entry.line;
68
+ }
69
+ if (entry.data !== undefined)
70
+ jsonEntry.data = entry.data;
71
+ return this.safeStringify(jsonEntry, format.jsonIndent);
72
+ }
73
+ // 默认格式:文件日志始终包含时间戳
74
+ return this.buildPlainText(entry, true);
75
+ }
76
+ /**
77
+ * 格式化为带 ANSI 颜色的控制台字符串。
78
+ * 无色模式下使用纯文本,且遵守 consoleTimestamp 开关(与文件格式独立)。
79
+ * 自定义 formatter 函数的优先级高于颜色开关。
80
+ */
81
+ formatConsoleMessage(entry) {
82
+ const { consoleColors, consoleTimestamp, format } = this.settings;
83
+ // 自定义格式化函数优先——无论是否启用颜色,均走自定义逻辑
84
+ if (format.enabled && format.formatter) {
85
+ try {
86
+ return format.formatter(entry);
87
+ }
88
+ catch (error) {
89
+ console.error('Error in custom formatter:', error);
90
+ // 降级到默认格式
91
+ }
92
+ }
93
+ if (!consoleColors) {
94
+ // 无色模式:纯文本,遵守 consoleTimestamp 开关。
95
+ // 不能调用 formatMessage(),因为文件格式始终包含时间戳,两者策略不同。
96
+ return this.buildPlainText(entry, consoleTimestamp);
97
+ }
98
+ const parts = [];
99
+ if (consoleTimestamp) {
100
+ parts.push(color_utils_1.ColorUtils.colorizeTimestamp(entry.timestamp));
101
+ }
102
+ if (entry.name)
103
+ parts.push(color_utils_1.ColorUtils.colorizeName(entry.name));
104
+ parts.push(color_utils_1.ColorUtils.colorizeLevel(entry.level));
105
+ if (entry.file && entry.line) {
106
+ parts.push(color_utils_1.ColorUtils.colorizeFileLocation(`${entry.file}:${entry.line}`));
107
+ }
108
+ parts.push(color_utils_1.ColorUtils.colorizeMessage(entry.level, entry.message));
109
+ if (entry.data !== undefined)
110
+ parts.push(this.safeStringify(entry.data));
111
+ return parts.join(' ');
112
+ }
113
+ // ─── 私有辅助 ───────────────────────────────────────────────
114
+ /**
115
+ * 构建纯文本日志行,供文件输出和无色控制台复用。
116
+ * @param includeTimestamp 是否包含时间戳(文件格式始终传 true;控制台按 consoleTimestamp 传入)
117
+ */
118
+ buildPlainText(entry, includeTimestamp) {
119
+ const { format } = this.settings;
120
+ const parts = [];
121
+ if (includeTimestamp) {
122
+ const ts = (0, dayjs_1.default)(entry.timestamp).format(format.timestampFormat);
123
+ parts.push(`[${ts}]`);
124
+ }
125
+ if (format.includeName && entry.name)
126
+ parts.push(`[${entry.name}]`);
127
+ parts.push(entry.level.toUpperCase().padEnd(6));
128
+ if (format.includeStack && entry.file && entry.line) {
129
+ parts.push(`(${entry.file}:${entry.line})`);
130
+ }
131
+ parts.push(entry.message);
132
+ if (entry.data !== undefined)
133
+ parts.push(this.safeStringify(entry.data));
134
+ return parts.join(' ');
135
+ }
136
+ /**
137
+ * 安全的 JSON 序列化,处理循环引用
138
+ */
139
+ safeStringify(obj, indent) {
140
+ // 基础类型直接返回或使用默认序列化,提升性能
141
+ if (obj === null || typeof obj !== 'object')
142
+ return String(obj);
143
+ try {
144
+ // 只有对象才需要 WeakSet 检查循环引用
145
+ const seen = new WeakSet();
146
+ return JSON.stringify(obj, (_key, value) => {
147
+ if (typeof value === 'object' && value !== null) {
148
+ if (seen.has(value))
149
+ return '[Circular]';
150
+ seen.add(value);
151
+ }
152
+ return value;
153
+ }, indent);
154
+ }
155
+ catch {
156
+ try {
157
+ return String(obj);
158
+ }
159
+ catch {
160
+ return '[Unable to serialize]';
161
+ }
162
+ }
163
+ }
164
+ }
165
+ exports.LogFormatter = LogFormatter;
166
+ //# sourceMappingURL=formatter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"formatter.js","sourceRoot":"","sources":["../../src/utils/formatter.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,63 @@
1
+ {
2
+ "name": "@chaeco/logger",
3
+ "version": "0.1.7",
4
+ "description": "A comprehensive logging module with file rotation, colors, and multiple log levels",
5
+ "main": "dist/index.js",
6
+ "types": "dist/index.d.ts",
7
+ "scripts": {
8
+ "build": "rm -rf dist && tsc",
9
+ "build:watch": "tsc --watch",
10
+ "dev": "tsx src/index.ts",
11
+ "test": "jest",
12
+ "test:watch": "jest --watch",
13
+ "test:coverage": "jest --coverage",
14
+ "lint": "eslint src/**/*.ts",
15
+ "lint:fix": "eslint src/**/*.ts --fix",
16
+ "format": "prettier --write \"src/**/*.ts\" \"examples/**/*.ts\"",
17
+ "format:check": "prettier --check \"src/**/*.ts\" \"examples/**/*.ts\"",
18
+ "docs": "typedoc --out docs src/index.ts",
19
+ "docs:watch": "typedoc --out docs src/index.ts --watch",
20
+ "prepublishOnly": "npm run build && npm test",
21
+ "prepare": "npm run build"
22
+ },
23
+ "keywords": [
24
+ "logger",
25
+ "logging",
26
+ "file-rotation",
27
+ "colors",
28
+ "typescript"
29
+ ],
30
+ "author": "iptodays",
31
+ "license": "MIT",
32
+ "repository": {
33
+ "type": "git",
34
+ "url": "git@github.com:chaeco/logger.git"
35
+ },
36
+ "devDependencies": {
37
+ "@types/jest": "^29.5.14",
38
+ "@types/node": "^20.0.0",
39
+ "@typescript-eslint/eslint-plugin": "^6.0.0",
40
+ "@typescript-eslint/parser": "^6.0.0",
41
+ "eslint": "^8.0.0",
42
+ "jest": "^29.7.0",
43
+ "prettier": "^3.0.0",
44
+ "ts-jest": "^29.4.6",
45
+ "ts-node": "^10.9.2",
46
+ "tsx": "^4.0.0",
47
+ "typedoc": "^0.25.0",
48
+ "typescript": "^5.0.0"
49
+ },
50
+ "dependencies": {
51
+ "@chaeco/indexed-db-storage": "github:chaeco/indexed-db-storage",
52
+ "chalk": "^5.3.0",
53
+ "dayjs": "^1.11.0"
54
+ },
55
+ "files": [
56
+ "dist",
57
+ "README.md"
58
+ ],
59
+ "publishConfig": {
60
+ "access": "public",
61
+ "registry": "https://registry.npmjs.org/"
62
+ }
63
+ }