@wiajs/core 1.2.2 → 2.1.0

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/package.json CHANGED
@@ -1,52 +1,52 @@
1
1
  {
2
2
  "name": "@wiajs/core",
3
- "version": "1.2.2",
3
+ "version": "2.1.0",
4
4
  "description": "wia app core package",
5
+ "keywords": [
6
+ "core",
7
+ "wia"
8
+ ],
9
+ "homepage": "https://www.wia.pub/core",
10
+ "bugs": {
11
+ "url": "https://github.com/wiajs/core/issues"
12
+ },
13
+ "license": "ELv2",
14
+ "author": {
15
+ "name": "Sibyl Yu",
16
+ "email": "sibyl@wia.pub"
17
+ },
18
+ "repository": {
19
+ "type": "git",
20
+ "url": "git+https://github.com/wiajs/wia.git"
21
+ },
5
22
  "main": "./dist/core.cjs",
6
23
  "module": "./dist/core.mjs",
7
24
  "types": "./types/core.d.ts",
8
- "exports": {
9
- ".": {
25
+ "exports": {
26
+ ".": {
10
27
  "types": "./types/core.d.ts",
11
28
  "require": "./dist/core.cjs",
12
29
  "import": "./dist/core.mjs",
13
30
  "default": "./dist/core.mjs"
14
31
  },
15
- "./jsx-runtime": "./dist/jsx-runtime.js",
16
- "./jsx-dev-runtime": "./dist/jsx-runtime.js",
32
+ "./jsx-runtime": "./dist/jsx-runtime.js",
33
+ "./jsx-dev-runtime": "./dist/jsx-runtime.js",
17
34
  "./util/*": [
18
35
  "./util/*.js",
19
36
  "./util/*.d.ts"
20
- ]
37
+ ]
38
+ },
39
+ "publishConfig": {
40
+ "access": "public"
21
41
  },
22
42
  "scripts": {
23
43
  "build": "cross-env NODE_ENV=production gulp build",
24
44
  "build-dev": "cross-env NODE_ENV=development gulp build",
25
45
  "dev": "cross-env NODE_ENV=development gulp cjs",
26
- "dev:umd": "cross-env NODE_ENV=development gulp umd",
27
46
  "dev:esm": "cross-env NODE_ENV=development gulp esm",
47
+ "dev:umd": "cross-env NODE_ENV=development gulp umd",
28
48
  "release": "bash release.sh"
29
49
  },
30
- "repository": {
31
- "type": "git",
32
- "url": "git+https://github.com/wiajs/wia.git"
33
- },
34
- "keywords": [
35
- "wia",
36
- "core"
37
- ],
38
- "author": {
39
- "name": "Sibyl Yu",
40
- "email": "sibyl@wia.pub"
41
- },
42
- "license": "ELv2",
43
- "bugs": {
44
- "url": "https://github.com/wiajs/core/issues"
45
- },
46
- "homepage": "https://www.wia.pub/core",
47
- "publishConfig": {
48
- "access": "public"
49
- },
50
50
  "devDependencies": {
51
51
  "@rollup/plugin-babel": "^6.0.3",
52
52
  "@rollup/plugin-commonjs": "^25.0.1",
package/util/log.d.ts ADDED
@@ -0,0 +1,113 @@
1
+ /**
2
+ * 模块日志选项
3
+ */
4
+ export interface LogOptions {
5
+ /** 模块名称 */
6
+ m: string
7
+ }
8
+
9
+ /**
10
+ * 派生函数级别的日志实例(支持直接作为函数调用,或调用内部方法)
11
+ */
12
+ export interface ScopedLogger {
13
+ (...args: any[]): void
14
+ debug(...args: any[]): void
15
+ info(...args: any[]): void
16
+ warn(...args: any[]): void
17
+ error(...args: any[]): void
18
+ err(...args: any[]): void
19
+ trace(...args: any[]): void
20
+ }
21
+
22
+ /**
23
+ * 模块级别的日志实例(带有派生子函数 .fn 的能力)
24
+ */
25
+ export interface LoggerFn {
26
+ (...args: any[]): void
27
+ log(...args: any[]): void
28
+ debug(...args: any[]): void
29
+ info(...args: any[]): void
30
+ warn(...args: any[]): void
31
+ error(...args: any[]): void
32
+ err(...args: any[]): void
33
+ trace(...args: any[]): void
34
+ /**
35
+ * 派生函数级别日志实例 (完美对齐后端 log.fn)
36
+ * @param name 函数名称
37
+ */
38
+ fn(name: string): ScopedLogger
39
+ }
40
+
41
+ /**
42
+ * 前端日志输出核心类
43
+ * 自动识别并重排提示符与对象,保持前后端一致性
44
+ */
45
+ export class Log {
46
+ /** 模块名称 */
47
+ m: string
48
+ /** 函数名称 */
49
+ fnName: string
50
+
51
+ constructor(m?: string, fnName?: string)
52
+
53
+ /**
54
+ * 格式化参数:提取提示符,构建前缀,将对象后置
55
+ * 格式要求:[模块名称:函数名称]提示符: {对象}
56
+ * @param args
57
+ * @returns 返回处理后传递给 console 的参数数组
58
+ */
59
+ formatArgs(args: any[]): any[]
60
+
61
+ log(...args: any[]): void
62
+ debug(...args: any[]): void
63
+ info(...args: any[]): void
64
+ warn(...args: any[]): void
65
+ trace(...args: any[]): void
66
+
67
+ /**
68
+ * error 会在生产环境保留
69
+ */
70
+ error(...args: any[]): void
71
+
72
+ /**
73
+ * 用于 catch(e) log.err(e) 或 log.err("提示符", e) 或 log.err(e, "提示符")
74
+ * 自动对齐前缀 [模块:函数] 提示符: Error对象,并保留堆栈
75
+ */
76
+ err(...args: any[]): void
77
+
78
+ /**
79
+ * 派生函数级别日志实例
80
+ * @param name 函数名称
81
+ */
82
+ fn(name: string): ScopedLogger
83
+ }
84
+
85
+ /**
86
+ * 全局的 log 实例接口
87
+ * 实现了函数重载,支持构造日志模块对象,或是直接调用
88
+ */
89
+ export interface GlobalLogger {
90
+ /**
91
+ * 构建模块日志类实例
92
+ * @example const uploaderLog = log({ m: 'uploader' })
93
+ */
94
+ (opt: LogOptions): LoggerFn
95
+
96
+ /**
97
+ * 标准日志输出 (无模块前缀)
98
+ * @example log('普通提示', { data: 1 })
99
+ */
100
+ (...args: any[]): void
101
+
102
+ err(...args: any[]): void
103
+ error(...args: any[]): void
104
+ warn(...args: any[]): void
105
+ info(...args: any[]): void
106
+ debug(...args: any[]): void
107
+ trace(...args: any[]): void
108
+ }
109
+
110
+ /**
111
+ * 标准日志输出或构建模块日志类实例
112
+ */
113
+ export const log: GlobalLogger
package/util/log.js ADDED
@@ -0,0 +1,189 @@
1
+ /**
2
+ * @typedef {Object} LogOptions
3
+ * @property {string} m - 模块名称
4
+ */
5
+
6
+ /**
7
+ * @typedef {((...args: any[]) => void) & { debug: (...args: any[])=>void, info: (...args: any[])=>void, warn: (...args: any[])=>void, error: (...args: any[])=>void, err: (...args: any[])=>void }} ScopedLogger
8
+ */
9
+
10
+ /**
11
+ * @typedef {((...args: any[]) => void) & { log: (...args: any[])=>void, debug: (...args: any[])=>void, info: (...args: any[])=>void, warn: (...args: any[])=>void, error: (...args: any[])=>void, err: (...args: any[])=>void, fn: (name: string) => ScopedLogger }} LoggerFn
12
+ */
13
+
14
+ // 1. 安全地获取开发环境状态(兼容打包工具、浏览器和 Node.js)
15
+ // 如果 Rspack 注入了 __DEV__,就用注入的值;如果是在 Node.js 下,就回退读取 process.env.NODE_ENV
16
+ const isDev = typeof __DEV__ !== 'undefined' ? __DEV__ : process.env.NODE_ENV !== 'production'
17
+
18
+ /**
19
+ * 前端日志输出,封装 console 日志,简化代码
20
+ * 自动识别并重排提示符与对象,保持前后端一致性
21
+ */
22
+ class Log {
23
+ /** @type {string} 模块名称 */
24
+ m = ''
25
+
26
+ /** @type {string} 函数名称 */
27
+ fnName = ''
28
+
29
+ /**
30
+ * @param {string} [m=''] 模块
31
+ * @param {string} [fnName=''] 函数
32
+ */
33
+ constructor(m = '', fnName = '') {
34
+ this.m = m
35
+ this.fnName = fnName
36
+ }
37
+
38
+ /**
39
+ * 格式化参数:提取提示符,构建前缀,将对象后置
40
+ * 格式要求:[模块名称:函数名称]提示符: {对象}
41
+ * @param {any[]} args
42
+ * @returns {any[]} 返回处理后传递给 console 的参数数组
43
+ */
44
+ formatArgs(args) {
45
+ let R = ''
46
+ const _ = this
47
+ try {
48
+ const msgs = []
49
+ const objs = []
50
+
51
+ // 1. 将字符串(提示符)和非字符串(对象/数值等)分开
52
+ for (const arg of args) {
53
+ if (typeof arg === 'string') msgs.push(arg)
54
+ else objs.push(arg)
55
+ }
56
+
57
+ let prefix = ''
58
+
59
+ // 2. 添加模块与函数前缀
60
+ if (_.m) prefix = `[${_.m}${_.fnName ? ':' + _.fnName : ''}]`
61
+ else if (_.fnName) prefix = `[:${_.fnName}]`
62
+
63
+ // 3. 拼接提示符
64
+ const msg = msgs.join(' ')
65
+ if (msg) prefix += msg
66
+
67
+ R = []
68
+ if (prefix) R.push(prefix)
69
+ R.push(...objs)
70
+ } catch (e) {
71
+ console.error(`formatArgs exp:${e.message}`)
72
+ }
73
+
74
+ return R
75
+ }
76
+
77
+ /** @param {...any} args */
78
+ log(...args) {
79
+ // 生产环境安全剔除 (需 Rspack DefinePlugin 注入 __DEV__)
80
+ if (isDev) console.log(...this.formatArgs(args))
81
+ }
82
+
83
+ /** @param {...any} args */
84
+ debug(...args) {
85
+ if (isDev) console.debug(...this.formatArgs(args))
86
+ }
87
+
88
+ /** @param {...any} args */
89
+ info(...args) {
90
+ if (isDev) console.info(...this.formatArgs(args))
91
+ }
92
+
93
+ /** @param {...any} args */
94
+ warn(...args) {
95
+ if (isDev) console.warn(...this.formatArgs(args))
96
+ }
97
+
98
+ /** @param {...any} args */
99
+ trace(...args) {
100
+ if (isDev) console.trace(...this.formatArgs(args))
101
+ }
102
+
103
+ /** * error 会在生产环境保留
104
+ * @param {...any} args
105
+ */
106
+ error(...args) {
107
+ console.error(...this.formatArgs(args))
108
+ }
109
+
110
+ /**
111
+ * 用于 catch(e) log.err(e) 或 log.err("提示符", e) 或 log.err(e, "提示符")
112
+ * 自动对齐前缀 [模块:函数] 提示符: Error对象,并保留堆栈
113
+ * @param {...any} args
114
+ */
115
+ err(...args) {
116
+ // 生产环境安全输出,不会被 Tree-shaking 摇掉
117
+ // formatArgs 会自动分离字符串与 Error 对象,并补全冒号
118
+ const formattedArgs = this.formatArgs(args)
119
+
120
+ // 原生打印,保持 stack trace 可点击跳转!
121
+ console.error(...formattedArgs)
122
+ }
123
+
124
+ /**
125
+ * 派生函数级别日志实例 (完美对齐后端 log.fn)
126
+ * @param {string} name 函数名称
127
+ * @returns {ScopedLogger}
128
+ */
129
+ fn(name) {
130
+ const scopedLog = new Log(this.m, name)
131
+
132
+ /** @type {any} */
133
+ const R = (...args) => scopedLog.log(...args)
134
+
135
+ R.debug = scopedLog.debug.bind(scopedLog)
136
+ R.info = scopedLog.info.bind(scopedLog)
137
+ R.warn = scopedLog.warn.bind(scopedLog)
138
+ R.trace = scopedLog.trace.bind(scopedLog)
139
+ R.error = scopedLog.error.bind(scopedLog)
140
+ R.err = scopedLog.err.bind(scopedLog)
141
+
142
+ return /** @type {ScopedLogger} */ (R)
143
+ }
144
+ }
145
+
146
+ // 实例化唯一的全局日志单例
147
+ const _log = new Log()
148
+
149
+ /**
150
+ * 标准日志输出或构建模块日志类实例,用于模块中带[m:xxx]标记日志输出
151
+ * 传入 { m: '模块名' } 构建实例,或直接传入参数输出全局日志
152
+ * @param {...any} args - params
153
+ * returns {*}
154
+ */
155
+ function log(...args) {
156
+ const last = args.at(-1)
157
+
158
+ // 1. 如果只有一个参数且带 m 属性,说明是构造 Logger 实例 (如: const log = Log({m: 'User'}))
159
+ if (args.length === 1 && typeof last === 'object' && last !== null && 'm' in last) {
160
+ const lg = new Log(last.m)
161
+
162
+ /** @type {any} */
163
+ const R = (...args2) => lg.log(...args2)
164
+
165
+ R.log = lg.log.bind(lg)
166
+ R.debug = lg.debug.bind(lg)
167
+ R.info = lg.info.bind(lg)
168
+ R.warn = lg.warn.bind(lg)
169
+ R.trace = lg.trace.bind(lg)
170
+ R.error = lg.error.bind(lg)
171
+ R.err = lg.err.bind(lg)
172
+ R.fn = lg.fn.bind(lg) // 暴露派生函数作用域方法
173
+
174
+ return /** @type {LoggerFn} */ (R)
175
+ }
176
+
177
+ // 2. 否则作为全局普通日志直接输出
178
+ _log.log(...args)
179
+ }
180
+
181
+ // 绑定全局快捷方法,方便直接调用 log.err(e) 等
182
+ log.err = _log.err.bind(_log)
183
+ log.error = _log.error.bind(_log)
184
+ log.warn = _log.warn.bind(_log)
185
+ log.info = _log.info.bind(_log)
186
+ log.debug = _log.debug.bind(_log)
187
+ log.trace = _log.trace.bind(_log)
188
+
189
+ export {log, Log}