mm_logger 0.0.0-stage → 1.0.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/.gitattributes ADDED
@@ -0,0 +1,5 @@
1
+ # Auto detect text files and perform LF normalization
2
+ * text=auto
3
+ *.js linguist-language=JavaScript
4
+ *.css linguist-language=JavaScript
5
+ *.html linguist-language=JavaScript
package/LICENSE ADDED
@@ -0,0 +1,15 @@
1
+ ISC License
2
+
3
+ Copyright (c) 2024, 邱文武
4
+
5
+ Permission to use, copy, modify, and/or distribute this software for any
6
+ purpose with or without fee is hereby granted, provided that the above
7
+ copyright notice and this permission notice appear in all copies.
8
+
9
+ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
10
+ WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
11
+ MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
12
+ ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
13
+ WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
14
+ ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
15
+ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
package/README.md CHANGED
@@ -1,3 +1,326 @@
1
- # Temporary Holding Version
1
+ # mm_logger
2
+
3
+ 高性能 Node.js 日志模块,支持多级别日志、文件轮转、事件钩子和灵活配置。
4
+
5
+ ## 特性
6
+
7
+ - 📝 **多级别日志**: debug, info, success, warn, error, fatal
8
+ - 💾 **文件轮转**: 按大小自动分割日志文件
9
+ - 🎨 **双格式输出**: 支持 JSON 和文本格式
10
+ - 🖥️ **双路输出**: 同时输出到控制台和文件
11
+ - 🌐 **HTTP 日志**: 单独记录 HTTP 请求日志
12
+ - 🔍 **日志查询**: 支持按日期、时间、关键词查询
13
+ - 🎯 **事件钩子**: 支持日志记录前后的事件监听
14
+ - ⚡ **异步处理**: 非阻塞日志写入,提高应用性能
15
+ - 🧹 **自动清理**: 自动管理日志文件数量
16
+ - 🌈 **ANSI 着色工具**: 内置 `colors`,按终端能力自动启用 / 禁用颜色
17
+ - 🧩 **轻量日志器**: `ConsoleLogger` 提供零依赖的彩色控制台输出
18
+
19
+ ## 安装
20
+
21
+ ```bash
22
+ npm install mm_logger
23
+ ```
24
+
25
+ ## 快速开始
26
+
27
+ ```javascript
28
+ const { Logger } = require('mm_logger');
29
+
30
+ // 创建日志实例
31
+ const logger = new Logger({
32
+ level: 'debug',
33
+ dir: './logs',
34
+ console: true,
35
+ file: true
36
+ });
37
+
38
+ // 记录日志
39
+ logger.debug('调试信息');
40
+ logger.info('普通信息');
41
+ logger.success('成功信息');
42
+ logger.warn('警告信息');
43
+ logger.error('错误信息');
44
+ logger.fatal('致命错误');
45
+
46
+ // 记录带参数的日志
47
+ logger.info('用户登录', { username: 'admin', ip: '127.0.0.1' });
48
+
49
+ // 记录 HTTP 日志
50
+ logger.http('info', 'API 请求', { method: 'GET', url: '/api/users' });
51
+ ```
52
+
53
+ ## 示例代码
54
+
55
+ 仓库提供可直接运行的示例,位于 `examples/` 目录:
56
+
57
+ - `examples/basic.js`:基础用法,演示各级别日志、带参数日志和动态更新配置
58
+ - `examples/http.js`:HTTP 请求日志的记录与查询
59
+ - `examples/query.js`:日志查询、读取、清空与删除
60
+
61
+ ```bash
62
+ node examples/basic.js
63
+ node examples/http.js
64
+ node examples/query.js
65
+ ```
66
+
67
+ ## 配置选项
68
+
69
+ | 配置项 | 类型 | 默认值 | 描述 |
70
+ |-------|------|-------|------|
71
+ | `level` | string | `'debug'` | 日志级别 |
72
+ | `dir` | string | `'./log'` | 日志文件目录 |
73
+ | `console` | boolean | `true` | 是否输出到控制台 |
74
+ | `file` | boolean | `true` | 是否输出到文件 |
75
+ | `max_size` | number | `3145728` (3MB) | 单个日志文件最大大小(字节) |
76
+ | `max_files` | number | `7` | 保留的日志文件最大数量 |
77
+ | `date_pattern` | string | `'_yyyy-MM-dd'` | 日期格式 |
78
+ | `content_pattern` | string | `'%d{hh:mm:ss.SSS} [%p] - %m'` | 日志内容格式 |
79
+ | `file_name_pattern` | string | `'{type}_{date}_{index}'` | 文件名格式 |
80
+ | `is_json` | boolean | `false` | 是否使用 JSON 格式输出 |
81
+
82
+ ## 日志级别
83
+
84
+ 日志级别从低到高排序:
85
+
86
+ - `debug`: 调试信息,开发环境使用
87
+ - `info`: 普通信息,记录程序运行状态
88
+ - `success`: 成功信息,记录操作成功
89
+ - `warn`: 警告信息,需要关注但不影响运行
90
+ - `error`: 错误信息,功能异常但程序仍可运行
91
+ - `fatal`: 致命错误,程序无法继续运行
92
+
93
+ ## 高级用法
94
+
95
+ ### 批量记录日志
96
+
97
+ ```javascript
98
+ logger.batch([
99
+ { level: 'info', message: '用户登录', args: [{ username: 'admin' }] },
100
+ { level: 'warn', message: '密码错误', args: [{ username: 'user123' }] }
101
+ ]);
102
+ ```
103
+
104
+ ### 重新配置
105
+
106
+ ```javascript
107
+ // 动态更新配置
108
+ logger.reconfig({
109
+ level: 'info',
110
+ is_json: true,
111
+ max_size: 5 * 1024 * 1024 // 5MB
112
+ });
113
+ ```
114
+
115
+ ### 日志查询
116
+
117
+ ```javascript
118
+ const result = logger.find({
119
+ date: '2023-12-01', // 查询日期
120
+ start_time: '09:00:00', // 起始时间
121
+ end_time: '18:00:00', // 结束时间
122
+ keyword: 'error', // 关键词
123
+ page: 1, // 页码
124
+ size: 50 // 每页大小
125
+ });
126
+
127
+ console.log(result.logs); // 日志列表
128
+ console.log(result.pagination); // 分页信息
129
+ ```
130
+
131
+ ### 事件监听
132
+
133
+ ```javascript
134
+ // 日志记录前
135
+ logger.on('before_log', (data) => {
136
+ // 可以在这里处理敏感信息脱敏
137
+ console.log('准备记录日志:', data);
138
+ });
139
+
140
+ // 日志记录后
141
+ logger.on('record:after', (result) => {
142
+ // 可以在这里进行性能监控
143
+ console.log('日志记录完成:', result);
144
+ });
145
+
146
+ // 日志记录错误
147
+ logger.on('record:error', (error) => {
148
+ console.error('日志记录出错:', error);
149
+ });
150
+
151
+ // 查询错误
152
+ logger.on('find:error', (error) => {
153
+ console.error('日志查询出错:', error);
154
+ });
155
+ ```
156
+
157
+ ### 刷新与销毁
158
+
159
+ ```javascript
160
+ // 刷新日志缓存到磁盘
161
+ logger.flush().then(() => {
162
+ console.log('日志已刷新');
163
+ });
164
+
165
+ // 销毁日志实例
166
+ logger.destroy().then(() => {
167
+ console.log('日志实例已销毁');
168
+ });
169
+ ```
170
+
171
+ ## 日志文件
172
+
173
+ 模块自动创建三种类型的日志文件:
174
+
175
+ - `debug_{date}_{index}.log`: 记录 debug、info、success 级别
176
+ - `error_{date}_{index}.log`: 记录 warn、error、fatal 级别
177
+ - `http_{date}_{index}.log`: 记录 HTTP 相关日志
178
+
179
+ 当文件大小超过 `max_size` 时,自动创建新文件(索引递增)。
180
+
181
+ ## 最佳实践
182
+
183
+ ### 1. 全局日志实例
184
+
185
+ ```javascript
186
+ // logger.js
187
+ const { Log } = require('mm_logger');
188
+
189
+ const logger = new Log({
190
+ level: process.env.NODE_ENV === 'production' ? 'info' : 'debug',
191
+ dir: './logs',
192
+ console: true,
193
+ file: true,
194
+ is_json: process.env.NODE_ENV === 'production'
195
+ });
196
+
197
+ module.exports = logger;
198
+ ```
199
+
200
+ ### 2. Express 集成
201
+
202
+ ```javascript
203
+ const express = require('express');
204
+ const logger = require('./logger');
205
+ const app = express();
206
+
207
+ // HTTP 请求日志中间件
208
+ app.use((req, res, next) => {
209
+ const startTime = Date.now();
210
+ const originalSend = res.send;
211
+
212
+ res.send = function(body) {
213
+ const duration = Date.now() - startTime;
214
+ const logData = {
215
+ method: req.method,
216
+ url: req.url,
217
+ status: res.statusCode,
218
+ duration: duration,
219
+ ip: req.ip
220
+ };
221
+
222
+ // 根据状态码记录不同级别
223
+ if (res.statusCode >= 500) {
224
+ logger.http('error', 'HTTP 错误', logData);
225
+ } else if (res.statusCode >= 400) {
226
+ logger.http('warn', 'HTTP 警告', logData);
227
+ } else {
228
+ logger.http('info', 'HTTP 请求', logData);
229
+ }
230
+
231
+ return originalSend.call(this, body);
232
+ };
233
+
234
+ next();
235
+ });
236
+
237
+ app.get('/', (req, res) => {
238
+ logger.debug('处理请求', { path: req.path });
239
+ res.send('Hello World');
240
+ });
241
+
242
+ app.listen(3000);
243
+ ```
244
+
245
+ ### 3. 错误处理
246
+
247
+ ```javascript
248
+ // error-handler.js
249
+ const logger = require('./logger');
250
+
251
+ function handleError(err, req, res, next) {
252
+ logger.error('应用错误', {
253
+ message: err.message,
254
+ stack: process.env.NODE_ENV === 'production' ? '' : err.stack,
255
+ path: req.path,
256
+ method: req.method
257
+ });
258
+
259
+ res.status(500).json({
260
+ error: process.env.NODE_ENV === 'production' ? 'Internal Server Error' : err.message
261
+ });
262
+ }
263
+
264
+ module.exports = handleError;
265
+ ```
266
+
267
+ ## 颜色工具与轻量日志器
2
268
 
3
- This version is a temporary placeholder for this package. An operational version to replace this has been submitted for review and is awaiting a staged release.
269
+ `colors` 与轻量日志器 `ConsoleLogger` 已自 `mm_corejs` 迁移至此模块,`mm_logger` 不再依赖 `mm_corejs`。
270
+
271
+ ### colors
272
+
273
+ ```javascript
274
+ const { colors: lib } = require('mm_logger');
275
+ const c = lib.colors;
276
+
277
+ console.log(c.red('错误'));
278
+ console.log(c.style('bold underline cyan')('组合样式'));
279
+ console.log(c.rgb(255, 128, 0)('真彩色'));
280
+ ```
281
+
282
+ | 导出 | 说明 |
283
+ | --- | --- |
284
+ | `colors` | 已按 `process.stdout` 检测好可用性的着色器实例 |
285
+ | `createColors(enabled)` | 按指定开关创建着色器 |
286
+ | `forStream(stream)` | 针对指定流检测并创建着色器 |
287
+ | `supportsColor(stream)` | 判断流是否应启用颜色 |
288
+ | `windowsSupportsVT()` | 判断 Windows 终端是否支持 ANSI/VT |
289
+ | `STYLES` | ANSI 样式表(名称 -> `[开启码, 关闭码]`) |
290
+
291
+ 颜色开关遵循 `NO_COLOR`(禁用)、`FORCE_COLOR`(强制,`0` / `false` 表示禁用)、`TERM=dumb`、非 TTY 以及 CI 环境等常见约定。
292
+
293
+ ### ConsoleLogger
294
+
295
+ 轻量控制台日志器,按级别着色后输出到原生 `console`;`error` / `warn` 走 stderr,其余走 stdout,各自按对应流的 TTY 能力检测颜色。
296
+
297
+ ```javascript
298
+ const { ConsoleLogger } = require('mm_logger');
299
+ const logger = new ConsoleLogger();
300
+
301
+ logger.info('普通信息');
302
+ logger.success('成功信息');
303
+ logger.warn('警告信息');
304
+ logger.error('错误信息');
305
+ ```
306
+
307
+ ## 测试
308
+
309
+ ```bash
310
+ npm run test:unit # Jest 单元测试(含覆盖率阈值)
311
+ ```
312
+
313
+ ## 兼容性
314
+
315
+ 支持 Node.js 12.x 及以上版本。
316
+
317
+ ## 性能
318
+
319
+ - 使用流式写入,避免阻塞主线程
320
+ - 异步日志处理,提高应用响应速度
321
+ - 自动轮转和清理,保持文件系统整洁
322
+ - 优化的文件 I/O,减少磁盘操作开销
323
+
324
+ ## 许可证
325
+
326
+ MIT License
@@ -0,0 +1,68 @@
1
+ const jsdoc = require('eslint-plugin-jsdoc');
2
+
3
+ module.exports = [
4
+ {
5
+ files: ['index.js','lib/**/*.js'],
6
+ languageOptions: {
7
+ ecmaVersion: 2020,
8
+ sourceType: 'script'
9
+ },
10
+ plugins: {
11
+ jsdoc: jsdoc
12
+ },
13
+ rules: {
14
+ // JSDoc相关规则 - 设置为error级别强制要求
15
+ 'jsdoc/require-jsdoc': ['error', {
16
+ require: {
17
+ FunctionDeclaration: true,
18
+ MethodDefinition: true,
19
+ ClassDeclaration: true,
20
+ ArrowFunctionExpression: true
21
+ }
22
+ }],
23
+ 'jsdoc/check-param-names': 'off',
24
+ 'jsdoc/check-tag-names': 'off',
25
+ 'jsdoc/check-types': 'off',
26
+ 'jsdoc/require-param': 'off',
27
+ 'jsdoc/require-param-description': 'off',
28
+ 'jsdoc/require-returns': 'off',
29
+ 'jsdoc/require-returns-description': 'off',
30
+
31
+ // 基础语法规则
32
+ 'no-unused-vars': ['error', { args: 'none', vars: 'all' }],
33
+ 'no-console': 'warn',
34
+
35
+ // 代码风格规则
36
+ 'indent': ['error', 2],
37
+ 'quotes': ['error', 'single'],
38
+ 'semi': ['error', 'always'],
39
+ 'comma-dangle': ['error', 'never'],
40
+ 'no-trailing-spaces': 'error',
41
+ 'eol-last': 'error',
42
+ 'max-len': ['error', { code: 100 }],
43
+ 'max-lines-per-function': ['error', { max: 40 }],
44
+ 'complexity': ['error', 12],
45
+ 'max-depth': ['error', 4],
46
+ 'max-params': ['error', 4],
47
+
48
+ // 命名规则
49
+ 'id-length': ['error', {
50
+ min: 1,
51
+ max: 20,
52
+ properties: 'always'
53
+ }]
54
+ }
55
+ },
56
+ {
57
+ files: ['test/**/*.js'],
58
+ languageOptions: {
59
+ ecmaVersion: 2020,
60
+ sourceType: 'script'
61
+ },
62
+ rules: {
63
+ // 测试文件中允许使用console
64
+ 'no-console': 'off',
65
+ 'no-unused-vars': 'off'
66
+ }
67
+ }
68
+ ];
@@ -0,0 +1,70 @@
1
+ /**
2
+ * @description 基础用法示例:创建日志实例、记录各级别日志、动态更新配置
3
+ * @example 运行方式:node examples/basic.js
4
+ */
5
+
6
+ const { Logger, getLogger, LEVEL } = require('../index');
7
+
8
+ /**
9
+ * 创建日志实例
10
+ * @returns {Logger} - 日志实例
11
+ */
12
+ function createLogger() {
13
+ return new Logger({
14
+ level: 'debug',
15
+ dir: './logs',
16
+ console: true,
17
+ file: true
18
+ });
19
+ }
20
+
21
+ /**
22
+ * 记录各级别日志
23
+ * @param {Logger} logger - 日志实例
24
+ */
25
+ function logAllLevels(logger) {
26
+ logger.debug('调试信息');
27
+ logger.info('普通信息');
28
+ logger.success('成功信息');
29
+ logger.warn('警告信息');
30
+ logger.error('错误信息');
31
+ logger.fatal('致命错误');
32
+ }
33
+
34
+ /**
35
+ * 记录带附加参数的日志
36
+ * @param {Logger} logger - 日志实例
37
+ */
38
+ function logWithArgs(logger) {
39
+ logger.info('用户登录成功', { username: 'admin', ip: '127.0.0.1' });
40
+ logger.log('warn', '自定义级别日志', { code: 1001, retry: 3 });
41
+ }
42
+
43
+ /**
44
+ * 动态更新配置
45
+ * @param {Logger} logger - 日志实例
46
+ */
47
+ function updateConfig(logger) {
48
+ logger.setConfig({
49
+ level: 'info',
50
+ console_format: '{time} [{level}] {msg}'
51
+ });
52
+ logger.info('配置已更新为 info 级别');
53
+ }
54
+
55
+ // 直接创建 Logger 实例
56
+ const logger = createLogger();
57
+
58
+ // 记录日志
59
+ logAllLevels(logger);
60
+ logWithArgs(logger);
61
+
62
+ // 动态更新配置
63
+ updateConfig(logger);
64
+
65
+ // 查看日志级别枚举
66
+ console.log('日志级别枚举:', LEVEL);
67
+
68
+ // 使用 getLogger 获取全局单例(file: false,避免与上面的实例产生文件冲突)
69
+ const global_logger = getLogger({ level: 'info', dir: './logs', file: false });
70
+ global_logger.info('全局单例日志');
@@ -0,0 +1,71 @@
1
+ /**
2
+ * @description HTTP 日志示例:模拟 HTTP 请求日志的记录与查询
3
+ * @example 运行方式:node examples/http.js
4
+ */
5
+
6
+ const { Logger } = require('../index');
7
+
8
+ /**
9
+ * 创建日志实例
10
+ * @returns {Logger} - 日志实例
11
+ */
12
+ function createLogger() {
13
+ return new Logger({
14
+ level: 'debug',
15
+ dir: './logs',
16
+ console: true,
17
+ file: true
18
+ });
19
+ }
20
+
21
+ /**
22
+ * 模拟处理一次 HTTP 请求
23
+ * @param {Logger} logger - 日志实例
24
+ * @param {string} method - 请求方法
25
+ * @param {string} url - 请求路径
26
+ * @param {number} status - 响应状态码
27
+ * @param {number} duration - 请求耗时(毫秒)
28
+ */
29
+ function handleRequest(logger, method, url, status, duration) {
30
+ const log_data = {
31
+ method,
32
+ url,
33
+ status,
34
+ duration,
35
+ ip: '127.0.0.1'
36
+ };
37
+
38
+ if (status >= 500) {
39
+ logger.http('error', 'HTTP 服务器错误', log_data);
40
+ } else if (status >= 400) {
41
+ logger.http('warn', 'HTTP 客户端错误', log_data);
42
+ } else {
43
+ logger.http('info', 'HTTP 请求', log_data);
44
+ }
45
+ }
46
+
47
+ /**
48
+ * 查询 HTTP 日志
49
+ * @param {Logger} logger - 日志实例
50
+ */
51
+ function findHttpLogs(logger) {
52
+ const result = logger.find({
53
+ keyword: 'HTTP',
54
+ level: 'info',
55
+ page_now: 1,
56
+ page_size: 10
57
+ });
58
+ console.log('HTTP 日志查询结果:', result);
59
+ }
60
+
61
+ const logger = createLogger();
62
+
63
+ // 模拟若干 HTTP 请求
64
+ handleRequest(logger, 'GET', '/api/users', 200, 12);
65
+ handleRequest(logger, 'POST', '/api/users', 400, 5);
66
+ handleRequest(logger, 'GET', '/api/orders', 500, 100);
67
+
68
+ // 等待日志写入完成后查询
69
+ setTimeout(() => {
70
+ findHttpLogs(logger);
71
+ }, 500);
@@ -0,0 +1,84 @@
1
+ /**
2
+ * @description 日志查询与管理示例:find、read、clear、remove
3
+ * @example 运行方式:node examples/query.js
4
+ */
5
+
6
+ const { Logger } = require('../index');
7
+
8
+ /**
9
+ * 创建日志实例
10
+ * @returns {Logger} - 日志实例
11
+ */
12
+ function createLogger() {
13
+ return new Logger({
14
+ level: 'debug',
15
+ dir: './logs',
16
+ console: true,
17
+ file: true
18
+ });
19
+ }
20
+
21
+ /**
22
+ * 写入示例日志
23
+ * @param {Logger} logger - 日志实例
24
+ */
25
+ function writeLogs(logger) {
26
+ logger.info('用户创建成功', { user_id: 1 });
27
+ logger.info('用户更新成功', { user_id: 2 });
28
+ logger.warn('密码重试次数过多', { user_id: 1 });
29
+ logger.error('数据库连接失败', { host: '127.0.0.1' });
30
+ }
31
+
32
+ /**
33
+ * 按条件查询日志
34
+ * @param {Logger} logger - 日志实例
35
+ */
36
+ function findLogs(logger) {
37
+ const result = logger.find({
38
+ keyword: '用户',
39
+ level: 'info',
40
+ page_now: 1,
41
+ page_size: 10
42
+ });
43
+ console.log('find 查询结果:', result);
44
+ }
45
+
46
+ /**
47
+ * 读取日志内容
48
+ * @param {Logger} logger - 日志实例
49
+ */
50
+ function readLogs(logger) {
51
+ const logs = logger.read('debug', '用户');
52
+ console.log('read 读取结果:', logs);
53
+ }
54
+
55
+ /**
56
+ * 按关键词清空日志
57
+ * @param {Logger} logger - 日志实例
58
+ */
59
+ function clearLogs(logger) {
60
+ const result = logger.clear('debug', '数据库');
61
+ console.log('clear 清空结果:', result);
62
+ }
63
+
64
+ /**
65
+ * 删除指定类型日志文件
66
+ * @param {Logger} logger - 日志实例
67
+ */
68
+ function removeLogs(logger) {
69
+ const result = logger.remove('debug');
70
+ console.log('remove 删除结果:', result);
71
+ }
72
+
73
+ const logger = createLogger();
74
+
75
+ // 写入示例日志
76
+ writeLogs(logger);
77
+
78
+ // 等待日志写入完成后执行查询与管理操作
79
+ setTimeout(() => {
80
+ findLogs(logger);
81
+ readLogs(logger);
82
+ clearLogs(logger);
83
+ removeLogs(logger);
84
+ }, 500);
package/index.js ADDED
@@ -0,0 +1,27 @@
1
+ const Logger = require('./lib/logger');
2
+ const ConsoleLogger = require('./lib/console_logger');
3
+ const Admin = require('mm_corejs').Admin;
4
+
5
+ let admin = new Admin();
6
+ admin.setClass(Logger);
7
+
8
+ module.exports = {
9
+ LEVEL: require('./lib/level'),
10
+ Logger,
11
+ // 轻量控制台日志器(自 mm_corejs 迁移,类名避免与 Logger 冲突)
12
+ ConsoleLogger,
13
+ // 颜色工具(自 mm_corejs 迁移),结构与 mm_corejs.colors 保持一致
14
+ colors: require('./lib/colors'),
15
+ admin,
16
+ // 获取日志记录器实例(<模块>Admin 范式)
17
+ loggerAdmin(scope, config) {
18
+ if (!scope) {
19
+ scope = 'os';
20
+ }
21
+ return admin.get(scope, config);
22
+ },
23
+ // 兼容旧调用名
24
+ getLogger() {
25
+ return admin.get('os');
26
+ }
27
+ };
package/jest.config.js ADDED
@@ -0,0 +1,18 @@
1
+ 'use strict';
2
+
3
+ /**
4
+ * Jest 测试配置
5
+ */
6
+ module.exports = {
7
+ testEnvironment: 'node',
8
+ testMatch: ['<rootDir>/test/**/*.test.js'],
9
+ collectCoverageFrom: ['lib/colors.js', 'lib/console_logger.js'],
10
+ coverageThreshold: {
11
+ global: {
12
+ branches: 100,
13
+ functions: 100,
14
+ lines: 100,
15
+ statements: 100
16
+ }
17
+ }
18
+ };