uview-pro 0.3.0 → 0.3.1
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/changelog.md +584 -574
- package/components/common/props.ts +22 -22
- package/components/u-action-sheet/types.ts +37 -37
- package/components/u-action-sheet/u-action-sheet.vue +178 -178
- package/components/u-alert-tips/types.ts +41 -41
- package/components/u-alert-tips/u-alert-tips.vue +238 -238
- package/components/u-avatar/types.ts +36 -36
- package/components/u-avatar/u-avatar.vue +217 -217
- package/components/u-avatar-cropper/types.ts +23 -23
- package/components/u-avatar-cropper/u-avatar-cropper.vue +297 -297
- package/components/u-avatar-cropper/weCropper.d.ts +62 -62
- package/components/u-avatar-cropper/weCropper.js +1281 -1281
- package/components/u-avatar-cropper/weCropper.ts +1276 -1276
- package/components/u-back-top/types.ts +36 -36
- package/components/u-back-top/u-back-top.vue +140 -140
- package/components/u-badge/types.ts +38 -38
- package/components/u-badge/u-badge.vue +183 -183
- package/components/u-button/types.ts +66 -66
- package/components/u-button/u-button.vue +579 -579
- package/components/u-calendar/types.ts +75 -75
- package/components/u-calendar/u-calendar.vue +793 -793
- package/components/u-car-keyboard/types.ts +14 -14
- package/components/u-car-keyboard/u-car-keyboard.vue +262 -262
- package/components/u-card/types.ts +61 -61
- package/components/u-card/u-card.vue +209 -209
- package/components/u-cell-group/types.ts +19 -19
- package/components/u-cell-group/u-cell-group.vue +60 -60
- package/components/u-cell-item/types.ts +56 -56
- package/components/u-cell-item/u-cell-item.vue +226 -226
- package/components/u-checkbox/types.ts +33 -33
- package/components/u-checkbox/u-checkbox.vue +282 -282
- package/components/u-checkbox-group/types.ts +34 -34
- package/components/u-checkbox-group/u-checkbox-group.vue +130 -130
- package/components/u-circle-progress/types.ts +54 -54
- package/components/u-circle-progress/u-circle-progress.vue +206 -206
- package/components/u-city-select/types.ts +22 -22
- package/components/u-city-select/u-city-select.vue +276 -276
- package/components/u-col/types.ts +32 -32
- package/components/u-col/u-col.vue +142 -142
- package/components/u-collapse/types.ts +33 -33
- package/components/u-collapse/u-collapse.vue +190 -190
- package/components/u-collapse-item/types.ts +27 -27
- package/components/u-collapse-item/u-collapse-item.vue +290 -290
- package/components/u-column-notice/types.ts +50 -50
- package/components/u-column-notice/u-column-notice.vue +222 -222
- package/components/u-count-down/types.ts +44 -44
- package/components/u-count-down/u-count-down.vue +286 -286
- package/components/u-count-to/types.ts +34 -34
- package/components/u-count-to/u-count-to.vue +266 -266
- package/components/u-divider/types.ts +33 -33
- package/components/u-divider/u-divider.vue +145 -145
- package/components/u-dropdown/types.ts +34 -34
- package/components/u-dropdown/u-dropdown.vue +330 -330
- package/components/u-dropdown-item/types.ts +29 -29
- package/components/u-dropdown-item/u-dropdown-item.vue +120 -120
- package/components/u-empty/types.ts +38 -38
- package/components/u-empty/u-empty.vue +103 -103
- package/components/u-field/types.ts +71 -71
- package/components/u-field/u-field.vue +388 -388
- package/components/u-form/types.ts +29 -29
- package/components/u-form/u-form.vue +130 -130
- package/components/u-form-item/types.ts +72 -72
- package/components/u-form-item/u-form-item.vue +447 -447
- package/components/u-full-screen/types.ts +16 -16
- package/components/u-full-screen/u-full-screen.vue +103 -103
- package/components/u-gap/types.ts +20 -20
- package/components/u-gap/u-gap.vue +50 -50
- package/components/u-grid/types.ts +21 -21
- package/components/u-grid/u-grid.vue +91 -91
- package/components/u-grid-item/types.ts +16 -16
- package/components/u-grid-item/u-grid-item.vue +130 -130
- package/components/u-icon/types.ts +61 -61
- package/components/u-icon/u-icon.vue +296 -296
- package/components/u-image/types.ts +51 -51
- package/components/u-image/u-image.vue +239 -239
- package/components/u-index-anchor/types.ts +16 -16
- package/components/u-index-anchor/u-index-anchor.vue +94 -94
- package/components/u-index-list/types.ts +43 -43
- package/components/u-index-list/u-index-list.vue +352 -352
- package/components/u-input/types.ts +137 -137
- package/components/u-input/u-input.vue +288 -288
- package/components/u-keyboard/types.ts +40 -40
- package/components/u-keyboard/u-keyboard.vue +178 -178
- package/components/u-lazy-load/types.ts +37 -37
- package/components/u-lazy-load/u-lazy-load.vue +246 -246
- package/components/u-line/types.ts +44 -44
- package/components/u-line/u-line.vue +68 -68
- package/components/u-line-progress/types.ts +58 -58
- package/components/u-line-progress/u-line-progress.vue +126 -126
- package/components/u-link/types.ts +43 -43
- package/components/u-link/u-link.vue +84 -84
- package/components/u-loading/types.ts +35 -35
- package/components/u-loading/u-loading.vue +105 -105
- package/components/u-loading-popup/types.ts +26 -26
- package/components/u-loading-popup/u-loading-popup.vue +253 -253
- package/components/u-loadmore/types.ts +79 -79
- package/components/u-loadmore/u-loadmore.vue +156 -156
- package/components/u-mask/types.ts +40 -40
- package/components/u-mask/u-mask.vue +113 -113
- package/components/u-message-input/types.ts +74 -74
- package/components/u-message-input/u-message-input.vue +281 -281
- package/components/u-modal/types.ts +118 -118
- package/components/u-modal/u-modal.vue +220 -220
- package/components/u-navbar/types.ts +103 -103
- package/components/u-navbar/u-navbar.vue +251 -251
- package/components/u-no-network/image.ts +2 -2
- package/components/u-no-network/types.ts +28 -28
- package/components/u-no-network/u-no-network.vue +303 -303
- package/components/u-notice-bar/types.ts +111 -111
- package/components/u-notice-bar/u-notice-bar.vue +189 -189
- package/components/u-number-box/types.ts +42 -42
- package/components/u-number-box/u-number-box.vue +321 -321
- package/components/u-number-keyboard/types.ts +26 -26
- package/components/u-number-keyboard/u-number-keyboard.vue +188 -188
- package/components/u-picker/types.ts +123 -123
- package/components/u-picker/u-picker.vue +685 -685
- package/components/u-popup/types.ts +59 -59
- package/components/u-popup/u-popup.vue +385 -385
- package/components/u-radio/types.ts +27 -27
- package/components/u-radio/u-radio.vue +279 -279
- package/components/u-radio-group/types.ts +31 -31
- package/components/u-radio-group/u-radio-group.vue +96 -96
- package/components/u-rate/types.ts +42 -42
- package/components/u-rate/u-rate.vue +249 -249
- package/components/u-read-more/types.ts +37 -37
- package/components/u-read-more/u-read-more.vue +172 -172
- package/components/u-root-portal/u-root-portal.vue +56 -56
- package/components/u-row/types.ts +22 -22
- package/components/u-row/u-row.vue +105 -105
- package/components/u-row-notice/types.ts +41 -41
- package/components/u-row-notice/u-row-notice.vue +256 -256
- package/components/u-safe-bottom/u-safe-bottom.vue +57 -57
- package/components/u-search/types.ts +55 -55
- package/components/u-search/u-search.vue +279 -279
- package/components/u-section/types.ts +34 -34
- package/components/u-section/u-section.vue +150 -150
- package/components/u-select/types.ts +45 -45
- package/components/u-select/u-select.vue +388 -388
- package/components/u-skeleton/types.ts +22 -22
- package/components/u-skeleton/u-skeleton.vue +231 -231
- package/components/u-slider/types.ts +34 -34
- package/components/u-slider/u-slider.vue +255 -255
- package/components/u-status-bar/u-status-bar.vue +74 -74
- package/components/u-steps/types.ts +30 -30
- package/components/u-steps/u-steps.vue +181 -181
- package/components/u-sticky/types.ts +24 -24
- package/components/u-sticky/u-sticky.vue +178 -178
- package/components/u-subsection/types.ts +38 -38
- package/components/u-subsection/u-subsection.vue +339 -339
- package/components/u-swipe-action/types.ts +52 -52
- package/components/u-swipe-action/u-swipe-action.vue +276 -276
- package/components/u-swiper/types.ts +49 -49
- package/components/u-swiper/u-swiper.vue +308 -308
- package/components/u-switch/types.ts +30 -30
- package/components/u-switch/u-switch.vue +150 -150
- package/components/u-tabbar/types.ts +38 -38
- package/components/u-tabbar/u-tabbar.vue +315 -315
- package/components/u-table/types.ts +27 -27
- package/components/u-table/u-table.vue +67 -67
- package/components/u-tabs/types.ts +53 -53
- package/components/u-tabs/u-tabs.vue +302 -302
- package/components/u-tabs-swiper/types.ts +55 -55
- package/components/u-tabs-swiper/u-tabs-swiper.vue +409 -409
- package/components/u-tag/types.ts +39 -39
- package/components/u-tag/u-tag.vue +268 -268
- package/components/u-td/types.ts +14 -14
- package/components/u-td/u-td.vue +98 -98
- package/components/u-text/types.ts +72 -72
- package/components/u-text/u-text.vue +343 -343
- package/components/u-th/types.ts +14 -14
- package/components/u-th/u-th.vue +92 -92
- package/components/u-time-line/u-time-line.vue +53 -53
- package/components/u-time-line-item/types.ts +16 -16
- package/components/u-time-line-item/u-time-line-item.vue +90 -90
- package/components/u-toast/types.ts +38 -38
- package/components/u-toast/u-toast.vue +240 -240
- package/components/u-top-tips/types.ts +16 -16
- package/components/u-top-tips/u-top-tips.vue +130 -130
- package/components/u-tr/types.ts +11 -11
- package/components/u-tr/u-tr.vue +39 -39
- package/components/u-upload/types.ts +82 -82
- package/components/u-upload/u-upload.vue +568 -568
- package/components/u-verification-code/types.ts +24 -24
- package/components/u-verification-code/u-verification-code.vue +176 -176
- package/components/u-waterfall/types.ts +18 -18
- package/components/u-waterfall/u-waterfall.vue +187 -187
- package/iconfont.css +913 -913
- package/index.scss +25 -25
- package/index.ts +38 -38
- package/libs/config/config.ts +26 -26
- package/libs/config/zIndex.ts +37 -37
- package/libs/css/color.scss +155 -155
- package/libs/css/common.scss +178 -178
- package/libs/css/style.components.scss +16 -16
- package/libs/css/style.h5.scss +8 -8
- package/libs/css/style.mp.scss +72 -72
- package/libs/css/style.nvue.scss +15 -15
- package/libs/css/style.vue.scss +188 -188
- package/libs/function/$parent.ts +24 -24
- package/libs/function/addUnit.ts +13 -13
- package/libs/function/color.ts +37 -37
- package/libs/function/colorGradient.ts +139 -139
- package/libs/function/debounce.ts +28 -28
- package/libs/function/deepClone.ts +39 -39
- package/libs/function/deepMerge.ts +35 -35
- package/libs/function/getParent.ts +63 -63
- package/libs/function/getRect.ts +26 -26
- package/libs/function/guid.ts +42 -42
- package/libs/function/md5.ts +403 -403
- package/libs/function/parent.ts +21 -21
- package/libs/function/queryParams.ts +64 -64
- package/libs/function/random.ts +16 -16
- package/libs/function/randomArray.ts +11 -11
- package/libs/function/route.ts +118 -118
- package/libs/function/styleUtils.ts +83 -83
- package/libs/function/sys.ts +15 -15
- package/libs/function/test.ts +289 -289
- package/libs/function/throttle.ts +31 -31
- package/libs/function/timeFormat.ts +55 -55
- package/libs/function/timeFrom.ts +48 -48
- package/libs/function/toast.ts +14 -14
- package/libs/function/trim.ts +21 -21
- package/libs/function/type2icon.ts +39 -39
- package/libs/hooks/index.ts +4 -4
- package/libs/hooks/useCompRelation.ts +364 -364
- package/libs/hooks/useComponent.ts +759 -759
- package/libs/hooks/useEmitter.ts +79 -79
- package/libs/hooks/useParent.ts +33 -33
- package/libs/hooks/useRect.ts +33 -33
- package/libs/index.ts +337 -337
- package/libs/request/auto-http.ts +76 -76
- package/libs/request/index.ts +242 -242
- package/libs/store/index.ts +88 -88
- package/libs/util/async-validator.d.ts +75 -75
- package/libs/util/async-validator.js +1 -1
- package/libs/util/calendar.d.ts +57 -57
- package/libs/util/emitter.ts +112 -112
- package/libs/util/eventBus.ts +86 -86
- package/libs/util/logger.ts +364 -364
- package/libs/util/mitt.ts +118 -118
- package/libs/util/parent.ts +20 -20
- package/package.json +4 -4
- package/readme.md +241 -241
- package/theme.scss +38 -38
- package/types/components.d.ts +97 -97
- package/types/global.d.ts +331 -331
- package/types/ignore-errors.d.ts +30 -30
- package/types/index.d.ts +19 -19
- package/types/uni-app.d.ts +63 -63
package/libs/util/logger.ts
CHANGED
|
@@ -1,364 +1,364 @@
|
|
|
1
|
-
// utils/logger.ts
|
|
2
|
-
|
|
3
|
-
// 定义原始控制台方法的类型
|
|
4
|
-
interface ConsoleMethods {
|
|
5
|
-
log: typeof console.log;
|
|
6
|
-
info: typeof console.info;
|
|
7
|
-
warn: typeof console.warn;
|
|
8
|
-
error: typeof console.error;
|
|
9
|
-
debug?: typeof console.debug;
|
|
10
|
-
trace?: typeof console.trace;
|
|
11
|
-
table?: typeof console.table;
|
|
12
|
-
time?: typeof console.time;
|
|
13
|
-
timeEnd?: typeof console.timeEnd;
|
|
14
|
-
group?: typeof console.group;
|
|
15
|
-
groupEnd?: typeof console.groupEnd;
|
|
16
|
-
groupCollapsed?: typeof console.groupCollapsed;
|
|
17
|
-
assert?: typeof console.assert;
|
|
18
|
-
clear?: typeof console.clear;
|
|
19
|
-
count?: typeof console.count;
|
|
20
|
-
countReset?: typeof console.countReset;
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
// 安全地获取控制台方法
|
|
24
|
-
const originalConsole: ConsoleMethods = {
|
|
25
|
-
log: console.log,
|
|
26
|
-
info: console.info,
|
|
27
|
-
warn: console.warn,
|
|
28
|
-
error: console.error,
|
|
29
|
-
debug: console.debug,
|
|
30
|
-
trace: console.trace,
|
|
31
|
-
table: console.table,
|
|
32
|
-
time: console.time,
|
|
33
|
-
timeEnd: console.timeEnd,
|
|
34
|
-
group: console.group,
|
|
35
|
-
groupEnd: console.groupEnd,
|
|
36
|
-
groupCollapsed: console.groupCollapsed,
|
|
37
|
-
assert: console.assert,
|
|
38
|
-
clear: console.clear,
|
|
39
|
-
count: console.count,
|
|
40
|
-
countReset: console.countReset
|
|
41
|
-
};
|
|
42
|
-
|
|
43
|
-
// 检查并确保所有方法都存在,不存在的方法用空函数替代
|
|
44
|
-
Object.keys(originalConsole).forEach(key => {
|
|
45
|
-
const methodKey = key as keyof ConsoleMethods;
|
|
46
|
-
if (!originalConsole[methodKey]) {
|
|
47
|
-
(originalConsole[methodKey] as any) = () => {};
|
|
48
|
-
}
|
|
49
|
-
});
|
|
50
|
-
|
|
51
|
-
class Logger {
|
|
52
|
-
private debugMode: boolean = false;
|
|
53
|
-
private prefix: string = '[uViewPro]';
|
|
54
|
-
private showCallerInfo: boolean = true;
|
|
55
|
-
|
|
56
|
-
/**
|
|
57
|
-
* 设置调试模式
|
|
58
|
-
* @param enabled 是否启用调试模式
|
|
59
|
-
*/
|
|
60
|
-
setDebugMode(enabled: boolean) {
|
|
61
|
-
this.debugMode = !!enabled;
|
|
62
|
-
|
|
63
|
-
if (this.debugMode) {
|
|
64
|
-
console.log('[uViewPro] Debug mode enabled');
|
|
65
|
-
} else {
|
|
66
|
-
console.log('[uViewPro] Debug mode disabled');
|
|
67
|
-
}
|
|
68
|
-
return this;
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
/**
|
|
72
|
-
* 设置是否显示调用者信息(文件名和行号)
|
|
73
|
-
* @param show 是否显示调用者信息
|
|
74
|
-
*/
|
|
75
|
-
setShowCallerInfo(show: boolean) {
|
|
76
|
-
this.showCallerInfo = !!show;
|
|
77
|
-
return this;
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
/**
|
|
81
|
-
* 设置日志前缀
|
|
82
|
-
* @param prefix 日志前缀
|
|
83
|
-
*/
|
|
84
|
-
setPrefix(prefix: string) {
|
|
85
|
-
if (prefix) this.prefix = prefix;
|
|
86
|
-
return this;
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
/**
|
|
90
|
-
* 获取当前调试模式状态
|
|
91
|
-
* @returns 当前调试模式状态
|
|
92
|
-
*/
|
|
93
|
-
getDebugMode(): boolean {
|
|
94
|
-
return this.debugMode;
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
/**
|
|
98
|
-
* 从文件路径中提取纯净的文件名(去除查询参数和路径)
|
|
99
|
-
* @param filePath 文件路径
|
|
100
|
-
* @returns 纯净的文件名
|
|
101
|
-
*/
|
|
102
|
-
private extractFileName(filePath: string): string {
|
|
103
|
-
if (!filePath) return '';
|
|
104
|
-
|
|
105
|
-
// 去除查询参数(?后面的内容)
|
|
106
|
-
const withoutQuery = filePath.split('?')[0];
|
|
107
|
-
|
|
108
|
-
// 使用正斜杠和反斜杠分割路径,取最后一部分
|
|
109
|
-
const parts = withoutQuery.split(/[/\\]/);
|
|
110
|
-
const fileNameWithExt = parts.pop() || '';
|
|
111
|
-
|
|
112
|
-
return fileNameWithExt;
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
/**
|
|
116
|
-
* 获取调用者信息(文件名和行号)
|
|
117
|
-
* @returns 调用者信息字符串
|
|
118
|
-
*/
|
|
119
|
-
private getCallerInfo(): string {
|
|
120
|
-
if (!this.showCallerInfo) return '';
|
|
121
|
-
|
|
122
|
-
try {
|
|
123
|
-
// 创建一个 Error 对象来获取堆栈跟踪
|
|
124
|
-
const error = new Error();
|
|
125
|
-
const stack = error.stack;
|
|
126
|
-
|
|
127
|
-
if (!stack) return '';
|
|
128
|
-
|
|
129
|
-
// 解析堆栈跟踪,找到调用 logger 的文件和行号
|
|
130
|
-
const stackLines = stack.split('\n');
|
|
131
|
-
|
|
132
|
-
// 找到第一个不是 logger.ts 的堆栈行
|
|
133
|
-
for (let i = 3; i < stackLines.length; i++) {
|
|
134
|
-
const line = stackLines[i].trim();
|
|
135
|
-
if (line && !line.includes('logger.ts') && !line.includes('Logger.') && !line.includes('at Object.')) {
|
|
136
|
-
// 提取文件名和行号
|
|
137
|
-
const match = line.match(/\(?(.*):(\d+):(\d+)\)?/);
|
|
138
|
-
if (match) {
|
|
139
|
-
const filePath = match[1];
|
|
140
|
-
const lineNumber = match[2];
|
|
141
|
-
const fileName = this.extractFileName(filePath);
|
|
142
|
-
return `[${fileName}:${lineNumber}]`;
|
|
143
|
-
}
|
|
144
|
-
break;
|
|
145
|
-
}
|
|
146
|
-
}
|
|
147
|
-
} catch (e) {
|
|
148
|
-
// 如果获取调用者信息失败,静默处理
|
|
149
|
-
}
|
|
150
|
-
|
|
151
|
-
return '';
|
|
152
|
-
}
|
|
153
|
-
|
|
154
|
-
/**
|
|
155
|
-
* 通用日志输出方法
|
|
156
|
-
* @param level 日志级别
|
|
157
|
-
* @param args 日志参数
|
|
158
|
-
*/
|
|
159
|
-
private output(level: keyof ConsoleMethods, ...args: any[]): void {
|
|
160
|
-
if (!this.debugMode || !originalConsole[level]) return;
|
|
161
|
-
|
|
162
|
-
const method = originalConsole[level] as Function;
|
|
163
|
-
const callerInfo = this.getCallerInfo();
|
|
164
|
-
|
|
165
|
-
if (this.prefix) {
|
|
166
|
-
if (callerInfo) {
|
|
167
|
-
method(`${this.prefix}${callerInfo}`, ...args);
|
|
168
|
-
} else {
|
|
169
|
-
method(this.prefix, ...args);
|
|
170
|
-
}
|
|
171
|
-
} else {
|
|
172
|
-
if (callerInfo) {
|
|
173
|
-
method(callerInfo, ...args);
|
|
174
|
-
} else {
|
|
175
|
-
method(...args);
|
|
176
|
-
}
|
|
177
|
-
}
|
|
178
|
-
}
|
|
179
|
-
|
|
180
|
-
/**
|
|
181
|
-
* 普通日志
|
|
182
|
-
* @param args 日志参数
|
|
183
|
-
*/
|
|
184
|
-
log(...args: any[]): void {
|
|
185
|
-
this.output('log', ...args);
|
|
186
|
-
}
|
|
187
|
-
|
|
188
|
-
/**
|
|
189
|
-
* 信息日志
|
|
190
|
-
* @param args 日志参数
|
|
191
|
-
*/
|
|
192
|
-
info(...args: any[]): void {
|
|
193
|
-
this.output('info', ...args);
|
|
194
|
-
}
|
|
195
|
-
|
|
196
|
-
/**
|
|
197
|
-
* 警告日志
|
|
198
|
-
* @param args 日志参数
|
|
199
|
-
*/
|
|
200
|
-
warn(...args: any[]): void {
|
|
201
|
-
this.output('warn', ...args);
|
|
202
|
-
}
|
|
203
|
-
|
|
204
|
-
/**
|
|
205
|
-
* 错误日志
|
|
206
|
-
* @param args 日志参数
|
|
207
|
-
*/
|
|
208
|
-
error(...args: any[]): void {
|
|
209
|
-
this.output('error', ...args);
|
|
210
|
-
}
|
|
211
|
-
|
|
212
|
-
/**
|
|
213
|
-
* 调试日志
|
|
214
|
-
* @param args 日志参数
|
|
215
|
-
*/
|
|
216
|
-
debug(...args: any[]): void {
|
|
217
|
-
if (!originalConsole.debug) return;
|
|
218
|
-
this.output('debug', ...args);
|
|
219
|
-
}
|
|
220
|
-
|
|
221
|
-
/**
|
|
222
|
-
* 堆栈跟踪
|
|
223
|
-
* @param args 日志参数
|
|
224
|
-
*/
|
|
225
|
-
trace(...args: any[]): void {
|
|
226
|
-
if (!originalConsole.trace) return;
|
|
227
|
-
this.output('trace', ...args);
|
|
228
|
-
}
|
|
229
|
-
|
|
230
|
-
/**
|
|
231
|
-
* 表格输出
|
|
232
|
-
* @param data 表格数据
|
|
233
|
-
* @param columns 列名(可选)
|
|
234
|
-
*/
|
|
235
|
-
table(data: any, columns?: string[]): void {
|
|
236
|
-
if (!this.debugMode || !originalConsole.table) return;
|
|
237
|
-
|
|
238
|
-
if (this.prefix) {
|
|
239
|
-
originalConsole.log!(this.prefix);
|
|
240
|
-
}
|
|
241
|
-
originalConsole.table!(data, columns);
|
|
242
|
-
}
|
|
243
|
-
|
|
244
|
-
/**
|
|
245
|
-
* 开始计时
|
|
246
|
-
* @param label 计时器标签
|
|
247
|
-
*/
|
|
248
|
-
time(label: string): void {
|
|
249
|
-
if (!this.debugMode || !originalConsole.time) return;
|
|
250
|
-
|
|
251
|
-
const fullLabel = this.prefix ? `${this.prefix} ${label}` : label;
|
|
252
|
-
originalConsole.time!(fullLabel);
|
|
253
|
-
}
|
|
254
|
-
|
|
255
|
-
/**
|
|
256
|
-
* 结束计时
|
|
257
|
-
* @param label 计时器标签
|
|
258
|
-
*/
|
|
259
|
-
timeEnd(label: string): void {
|
|
260
|
-
if (!this.debugMode || !originalConsole.timeEnd) return;
|
|
261
|
-
|
|
262
|
-
const fullLabel = this.prefix ? `${this.prefix} ${label}` : label;
|
|
263
|
-
originalConsole.timeEnd!(fullLabel);
|
|
264
|
-
}
|
|
265
|
-
|
|
266
|
-
/**
|
|
267
|
-
* 分组日志
|
|
268
|
-
* @param label 分组标签
|
|
269
|
-
*/
|
|
270
|
-
group(label: string): void {
|
|
271
|
-
if (!this.debugMode || !originalConsole.group) return;
|
|
272
|
-
|
|
273
|
-
const fullLabel = this.prefix ? `${this.prefix} ${label}` : label;
|
|
274
|
-
originalConsole.group!(fullLabel);
|
|
275
|
-
}
|
|
276
|
-
|
|
277
|
-
/**
|
|
278
|
-
* 结束分组
|
|
279
|
-
*/
|
|
280
|
-
groupEnd(): void {
|
|
281
|
-
if (!this.debugMode || !originalConsole.groupEnd) return;
|
|
282
|
-
originalConsole.groupEnd!();
|
|
283
|
-
}
|
|
284
|
-
|
|
285
|
-
/**
|
|
286
|
-
* 分组日志(默认折叠)
|
|
287
|
-
* @param label 分组标签
|
|
288
|
-
*/
|
|
289
|
-
groupCollapsed(label: string): void {
|
|
290
|
-
if (!this.debugMode || !originalConsole.groupCollapsed) return;
|
|
291
|
-
|
|
292
|
-
const fullLabel = this.prefix ? `${this.prefix} ${label}` : label;
|
|
293
|
-
originalConsole.groupCollapsed!(fullLabel);
|
|
294
|
-
}
|
|
295
|
-
|
|
296
|
-
/**
|
|
297
|
-
* 断言
|
|
298
|
-
* @param condition 条件
|
|
299
|
-
* @param message 错误消息
|
|
300
|
-
*/
|
|
301
|
-
assert(condition: boolean, ...message: any[]): void {
|
|
302
|
-
if (!this.debugMode || !originalConsole.assert) return;
|
|
303
|
-
|
|
304
|
-
if (this.prefix) {
|
|
305
|
-
originalConsole.assert!(condition, this.prefix, ...message);
|
|
306
|
-
} else {
|
|
307
|
-
originalConsole.assert!(condition, ...message);
|
|
308
|
-
}
|
|
309
|
-
}
|
|
310
|
-
|
|
311
|
-
/**
|
|
312
|
-
* 清空控制台
|
|
313
|
-
*/
|
|
314
|
-
clear(): void {
|
|
315
|
-
if (!this.debugMode || !originalConsole.clear) return;
|
|
316
|
-
originalConsole.clear!();
|
|
317
|
-
}
|
|
318
|
-
|
|
319
|
-
/**
|
|
320
|
-
* 计数器
|
|
321
|
-
* @param label 计数器标签
|
|
322
|
-
*/
|
|
323
|
-
count(label?: string): void {
|
|
324
|
-
if (!this.debugMode || !originalConsole.count) return;
|
|
325
|
-
|
|
326
|
-
const fullLabel = this.prefix && label ? `${this.prefix} ${label}` : label || this.prefix;
|
|
327
|
-
originalConsole.count!(fullLabel);
|
|
328
|
-
}
|
|
329
|
-
|
|
330
|
-
/**
|
|
331
|
-
* 重置计数器
|
|
332
|
-
* @param label 计数器标签
|
|
333
|
-
*/
|
|
334
|
-
countReset(label?: string): void {
|
|
335
|
-
if (!this.debugMode || !originalConsole.countReset) return;
|
|
336
|
-
|
|
337
|
-
const fullLabel = this.prefix && label ? `${this.prefix} ${label}` : label || this.prefix;
|
|
338
|
-
originalConsole.countReset!(fullLabel);
|
|
339
|
-
}
|
|
340
|
-
|
|
341
|
-
/**
|
|
342
|
-
* 带样式的日志
|
|
343
|
-
* @param style CSS样式
|
|
344
|
-
* @param message 消息内容
|
|
345
|
-
*/
|
|
346
|
-
styled(style: string, message: string): void {
|
|
347
|
-
if (!this.debugMode) return;
|
|
348
|
-
|
|
349
|
-
const callerInfo = this.getCallerInfo();
|
|
350
|
-
const fullMessage = callerInfo ? `${message} ${callerInfo}` : message;
|
|
351
|
-
|
|
352
|
-
if (this.prefix) {
|
|
353
|
-
console.log(`%c${this.prefix} ${fullMessage}`, style);
|
|
354
|
-
} else {
|
|
355
|
-
console.log(`%c${fullMessage}`, style);
|
|
356
|
-
}
|
|
357
|
-
}
|
|
358
|
-
}
|
|
359
|
-
|
|
360
|
-
// 创建全局单例
|
|
361
|
-
const logger = new Logger();
|
|
362
|
-
|
|
363
|
-
// 导出单例和类
|
|
364
|
-
export { logger, Logger };
|
|
1
|
+
// utils/logger.ts
|
|
2
|
+
|
|
3
|
+
// 定义原始控制台方法的类型
|
|
4
|
+
interface ConsoleMethods {
|
|
5
|
+
log: typeof console.log;
|
|
6
|
+
info: typeof console.info;
|
|
7
|
+
warn: typeof console.warn;
|
|
8
|
+
error: typeof console.error;
|
|
9
|
+
debug?: typeof console.debug;
|
|
10
|
+
trace?: typeof console.trace;
|
|
11
|
+
table?: typeof console.table;
|
|
12
|
+
time?: typeof console.time;
|
|
13
|
+
timeEnd?: typeof console.timeEnd;
|
|
14
|
+
group?: typeof console.group;
|
|
15
|
+
groupEnd?: typeof console.groupEnd;
|
|
16
|
+
groupCollapsed?: typeof console.groupCollapsed;
|
|
17
|
+
assert?: typeof console.assert;
|
|
18
|
+
clear?: typeof console.clear;
|
|
19
|
+
count?: typeof console.count;
|
|
20
|
+
countReset?: typeof console.countReset;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
// 安全地获取控制台方法
|
|
24
|
+
const originalConsole: ConsoleMethods = {
|
|
25
|
+
log: console.log,
|
|
26
|
+
info: console.info,
|
|
27
|
+
warn: console.warn,
|
|
28
|
+
error: console.error,
|
|
29
|
+
debug: console.debug,
|
|
30
|
+
trace: console.trace,
|
|
31
|
+
table: console.table,
|
|
32
|
+
time: console.time,
|
|
33
|
+
timeEnd: console.timeEnd,
|
|
34
|
+
group: console.group,
|
|
35
|
+
groupEnd: console.groupEnd,
|
|
36
|
+
groupCollapsed: console.groupCollapsed,
|
|
37
|
+
assert: console.assert,
|
|
38
|
+
clear: console.clear,
|
|
39
|
+
count: console.count,
|
|
40
|
+
countReset: console.countReset
|
|
41
|
+
};
|
|
42
|
+
|
|
43
|
+
// 检查并确保所有方法都存在,不存在的方法用空函数替代
|
|
44
|
+
Object.keys(originalConsole).forEach(key => {
|
|
45
|
+
const methodKey = key as keyof ConsoleMethods;
|
|
46
|
+
if (!originalConsole[methodKey]) {
|
|
47
|
+
(originalConsole[methodKey] as any) = () => {};
|
|
48
|
+
}
|
|
49
|
+
});
|
|
50
|
+
|
|
51
|
+
class Logger {
|
|
52
|
+
private debugMode: boolean = false;
|
|
53
|
+
private prefix: string = '[uViewPro]';
|
|
54
|
+
private showCallerInfo: boolean = true;
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* 设置调试模式
|
|
58
|
+
* @param enabled 是否启用调试模式
|
|
59
|
+
*/
|
|
60
|
+
setDebugMode(enabled: boolean) {
|
|
61
|
+
this.debugMode = !!enabled;
|
|
62
|
+
|
|
63
|
+
if (this.debugMode) {
|
|
64
|
+
console.log('[uViewPro] Debug mode enabled');
|
|
65
|
+
} else {
|
|
66
|
+
console.log('[uViewPro] Debug mode disabled');
|
|
67
|
+
}
|
|
68
|
+
return this;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
/**
|
|
72
|
+
* 设置是否显示调用者信息(文件名和行号)
|
|
73
|
+
* @param show 是否显示调用者信息
|
|
74
|
+
*/
|
|
75
|
+
setShowCallerInfo(show: boolean) {
|
|
76
|
+
this.showCallerInfo = !!show;
|
|
77
|
+
return this;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
/**
|
|
81
|
+
* 设置日志前缀
|
|
82
|
+
* @param prefix 日志前缀
|
|
83
|
+
*/
|
|
84
|
+
setPrefix(prefix: string) {
|
|
85
|
+
if (prefix) this.prefix = prefix;
|
|
86
|
+
return this;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
/**
|
|
90
|
+
* 获取当前调试模式状态
|
|
91
|
+
* @returns 当前调试模式状态
|
|
92
|
+
*/
|
|
93
|
+
getDebugMode(): boolean {
|
|
94
|
+
return this.debugMode;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
/**
|
|
98
|
+
* 从文件路径中提取纯净的文件名(去除查询参数和路径)
|
|
99
|
+
* @param filePath 文件路径
|
|
100
|
+
* @returns 纯净的文件名
|
|
101
|
+
*/
|
|
102
|
+
private extractFileName(filePath: string): string {
|
|
103
|
+
if (!filePath) return '';
|
|
104
|
+
|
|
105
|
+
// 去除查询参数(?后面的内容)
|
|
106
|
+
const withoutQuery = filePath.split('?')[0];
|
|
107
|
+
|
|
108
|
+
// 使用正斜杠和反斜杠分割路径,取最后一部分
|
|
109
|
+
const parts = withoutQuery.split(/[/\\]/);
|
|
110
|
+
const fileNameWithExt = parts.pop() || '';
|
|
111
|
+
|
|
112
|
+
return fileNameWithExt;
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
/**
|
|
116
|
+
* 获取调用者信息(文件名和行号)
|
|
117
|
+
* @returns 调用者信息字符串
|
|
118
|
+
*/
|
|
119
|
+
private getCallerInfo(): string {
|
|
120
|
+
if (!this.showCallerInfo) return '';
|
|
121
|
+
|
|
122
|
+
try {
|
|
123
|
+
// 创建一个 Error 对象来获取堆栈跟踪
|
|
124
|
+
const error = new Error();
|
|
125
|
+
const stack = error.stack;
|
|
126
|
+
|
|
127
|
+
if (!stack) return '';
|
|
128
|
+
|
|
129
|
+
// 解析堆栈跟踪,找到调用 logger 的文件和行号
|
|
130
|
+
const stackLines = stack.split('\n');
|
|
131
|
+
|
|
132
|
+
// 找到第一个不是 logger.ts 的堆栈行
|
|
133
|
+
for (let i = 3; i < stackLines.length; i++) {
|
|
134
|
+
const line = stackLines[i].trim();
|
|
135
|
+
if (line && !line.includes('logger.ts') && !line.includes('Logger.') && !line.includes('at Object.')) {
|
|
136
|
+
// 提取文件名和行号
|
|
137
|
+
const match = line.match(/\(?(.*):(\d+):(\d+)\)?/);
|
|
138
|
+
if (match) {
|
|
139
|
+
const filePath = match[1];
|
|
140
|
+
const lineNumber = match[2];
|
|
141
|
+
const fileName = this.extractFileName(filePath);
|
|
142
|
+
return `[${fileName}:${lineNumber}]`;
|
|
143
|
+
}
|
|
144
|
+
break;
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
} catch (e) {
|
|
148
|
+
// 如果获取调用者信息失败,静默处理
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
return '';
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
/**
|
|
155
|
+
* 通用日志输出方法
|
|
156
|
+
* @param level 日志级别
|
|
157
|
+
* @param args 日志参数
|
|
158
|
+
*/
|
|
159
|
+
private output(level: keyof ConsoleMethods, ...args: any[]): void {
|
|
160
|
+
if (!this.debugMode || !originalConsole[level]) return;
|
|
161
|
+
|
|
162
|
+
const method = originalConsole[level] as Function;
|
|
163
|
+
const callerInfo = this.getCallerInfo();
|
|
164
|
+
|
|
165
|
+
if (this.prefix) {
|
|
166
|
+
if (callerInfo) {
|
|
167
|
+
method(`${this.prefix}${callerInfo}`, ...args);
|
|
168
|
+
} else {
|
|
169
|
+
method(this.prefix, ...args);
|
|
170
|
+
}
|
|
171
|
+
} else {
|
|
172
|
+
if (callerInfo) {
|
|
173
|
+
method(callerInfo, ...args);
|
|
174
|
+
} else {
|
|
175
|
+
method(...args);
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
/**
|
|
181
|
+
* 普通日志
|
|
182
|
+
* @param args 日志参数
|
|
183
|
+
*/
|
|
184
|
+
log(...args: any[]): void {
|
|
185
|
+
this.output('log', ...args);
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
/**
|
|
189
|
+
* 信息日志
|
|
190
|
+
* @param args 日志参数
|
|
191
|
+
*/
|
|
192
|
+
info(...args: any[]): void {
|
|
193
|
+
this.output('info', ...args);
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
/**
|
|
197
|
+
* 警告日志
|
|
198
|
+
* @param args 日志参数
|
|
199
|
+
*/
|
|
200
|
+
warn(...args: any[]): void {
|
|
201
|
+
this.output('warn', ...args);
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
/**
|
|
205
|
+
* 错误日志
|
|
206
|
+
* @param args 日志参数
|
|
207
|
+
*/
|
|
208
|
+
error(...args: any[]): void {
|
|
209
|
+
this.output('error', ...args);
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
/**
|
|
213
|
+
* 调试日志
|
|
214
|
+
* @param args 日志参数
|
|
215
|
+
*/
|
|
216
|
+
debug(...args: any[]): void {
|
|
217
|
+
if (!originalConsole.debug) return;
|
|
218
|
+
this.output('debug', ...args);
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
/**
|
|
222
|
+
* 堆栈跟踪
|
|
223
|
+
* @param args 日志参数
|
|
224
|
+
*/
|
|
225
|
+
trace(...args: any[]): void {
|
|
226
|
+
if (!originalConsole.trace) return;
|
|
227
|
+
this.output('trace', ...args);
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
/**
|
|
231
|
+
* 表格输出
|
|
232
|
+
* @param data 表格数据
|
|
233
|
+
* @param columns 列名(可选)
|
|
234
|
+
*/
|
|
235
|
+
table(data: any, columns?: string[]): void {
|
|
236
|
+
if (!this.debugMode || !originalConsole.table) return;
|
|
237
|
+
|
|
238
|
+
if (this.prefix) {
|
|
239
|
+
originalConsole.log!(this.prefix);
|
|
240
|
+
}
|
|
241
|
+
originalConsole.table!(data, columns);
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
/**
|
|
245
|
+
* 开始计时
|
|
246
|
+
* @param label 计时器标签
|
|
247
|
+
*/
|
|
248
|
+
time(label: string): void {
|
|
249
|
+
if (!this.debugMode || !originalConsole.time) return;
|
|
250
|
+
|
|
251
|
+
const fullLabel = this.prefix ? `${this.prefix} ${label}` : label;
|
|
252
|
+
originalConsole.time!(fullLabel);
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
/**
|
|
256
|
+
* 结束计时
|
|
257
|
+
* @param label 计时器标签
|
|
258
|
+
*/
|
|
259
|
+
timeEnd(label: string): void {
|
|
260
|
+
if (!this.debugMode || !originalConsole.timeEnd) return;
|
|
261
|
+
|
|
262
|
+
const fullLabel = this.prefix ? `${this.prefix} ${label}` : label;
|
|
263
|
+
originalConsole.timeEnd!(fullLabel);
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
/**
|
|
267
|
+
* 分组日志
|
|
268
|
+
* @param label 分组标签
|
|
269
|
+
*/
|
|
270
|
+
group(label: string): void {
|
|
271
|
+
if (!this.debugMode || !originalConsole.group) return;
|
|
272
|
+
|
|
273
|
+
const fullLabel = this.prefix ? `${this.prefix} ${label}` : label;
|
|
274
|
+
originalConsole.group!(fullLabel);
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
/**
|
|
278
|
+
* 结束分组
|
|
279
|
+
*/
|
|
280
|
+
groupEnd(): void {
|
|
281
|
+
if (!this.debugMode || !originalConsole.groupEnd) return;
|
|
282
|
+
originalConsole.groupEnd!();
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
/**
|
|
286
|
+
* 分组日志(默认折叠)
|
|
287
|
+
* @param label 分组标签
|
|
288
|
+
*/
|
|
289
|
+
groupCollapsed(label: string): void {
|
|
290
|
+
if (!this.debugMode || !originalConsole.groupCollapsed) return;
|
|
291
|
+
|
|
292
|
+
const fullLabel = this.prefix ? `${this.prefix} ${label}` : label;
|
|
293
|
+
originalConsole.groupCollapsed!(fullLabel);
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
/**
|
|
297
|
+
* 断言
|
|
298
|
+
* @param condition 条件
|
|
299
|
+
* @param message 错误消息
|
|
300
|
+
*/
|
|
301
|
+
assert(condition: boolean, ...message: any[]): void {
|
|
302
|
+
if (!this.debugMode || !originalConsole.assert) return;
|
|
303
|
+
|
|
304
|
+
if (this.prefix) {
|
|
305
|
+
originalConsole.assert!(condition, this.prefix, ...message);
|
|
306
|
+
} else {
|
|
307
|
+
originalConsole.assert!(condition, ...message);
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
/**
|
|
312
|
+
* 清空控制台
|
|
313
|
+
*/
|
|
314
|
+
clear(): void {
|
|
315
|
+
if (!this.debugMode || !originalConsole.clear) return;
|
|
316
|
+
originalConsole.clear!();
|
|
317
|
+
}
|
|
318
|
+
|
|
319
|
+
/**
|
|
320
|
+
* 计数器
|
|
321
|
+
* @param label 计数器标签
|
|
322
|
+
*/
|
|
323
|
+
count(label?: string): void {
|
|
324
|
+
if (!this.debugMode || !originalConsole.count) return;
|
|
325
|
+
|
|
326
|
+
const fullLabel = this.prefix && label ? `${this.prefix} ${label}` : label || this.prefix;
|
|
327
|
+
originalConsole.count!(fullLabel);
|
|
328
|
+
}
|
|
329
|
+
|
|
330
|
+
/**
|
|
331
|
+
* 重置计数器
|
|
332
|
+
* @param label 计数器标签
|
|
333
|
+
*/
|
|
334
|
+
countReset(label?: string): void {
|
|
335
|
+
if (!this.debugMode || !originalConsole.countReset) return;
|
|
336
|
+
|
|
337
|
+
const fullLabel = this.prefix && label ? `${this.prefix} ${label}` : label || this.prefix;
|
|
338
|
+
originalConsole.countReset!(fullLabel);
|
|
339
|
+
}
|
|
340
|
+
|
|
341
|
+
/**
|
|
342
|
+
* 带样式的日志
|
|
343
|
+
* @param style CSS样式
|
|
344
|
+
* @param message 消息内容
|
|
345
|
+
*/
|
|
346
|
+
styled(style: string, message: string): void {
|
|
347
|
+
if (!this.debugMode) return;
|
|
348
|
+
|
|
349
|
+
const callerInfo = this.getCallerInfo();
|
|
350
|
+
const fullMessage = callerInfo ? `${message} ${callerInfo}` : message;
|
|
351
|
+
|
|
352
|
+
if (this.prefix) {
|
|
353
|
+
console.log(`%c${this.prefix} ${fullMessage}`, style);
|
|
354
|
+
} else {
|
|
355
|
+
console.log(`%c${fullMessage}`, style);
|
|
356
|
+
}
|
|
357
|
+
}
|
|
358
|
+
}
|
|
359
|
+
|
|
360
|
+
// 创建全局单例
|
|
361
|
+
const logger = new Logger();
|
|
362
|
+
|
|
363
|
+
// 导出单例和类
|
|
364
|
+
export { logger, Logger };
|