monocart-reporter 2.9.17 → 2.9.19
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/lib/default/options.js +4 -1
- package/lib/generate-data.js +13 -10
- package/lib/generate-report.js +1 -1
- package/lib/index.d.ts +3 -0
- package/lib/index.js +7 -4
- package/lib/merge-data.js +2 -2
- package/lib/packages/monocart-reporter-assets.js +2 -2
- package/lib/packages/monocart-reporter-vendor.js +9 -9
- package/lib/platform/share.js +53 -0
- package/lib/utils/pie.js +21 -7
- package/lib/utils/system.js +3 -3
- package/lib/utils/util.js +5 -0
- package/lib/visitor.js +29 -7
- package/package.json +15 -15
package/lib/platform/share.js
CHANGED
|
@@ -87,6 +87,22 @@ const Util = {
|
|
|
87
87
|
return s.padStart(l, '0');
|
|
88
88
|
},
|
|
89
89
|
|
|
90
|
+
isNum(num) {
|
|
91
|
+
if (typeof num !== 'number' || isNaN(num)) {
|
|
92
|
+
return false;
|
|
93
|
+
}
|
|
94
|
+
const isInvalid = function(n) {
|
|
95
|
+
if (n === Number.MAX_VALUE || n === Number.MIN_VALUE || n === Number.NEGATIVE_INFINITY || n === Number.POSITIVE_INFINITY) {
|
|
96
|
+
return true;
|
|
97
|
+
}
|
|
98
|
+
return false;
|
|
99
|
+
};
|
|
100
|
+
if (isInvalid(num)) {
|
|
101
|
+
return false;
|
|
102
|
+
}
|
|
103
|
+
return true;
|
|
104
|
+
},
|
|
105
|
+
|
|
90
106
|
toNum: function(num, toInt) {
|
|
91
107
|
if (typeof (num) !== 'number') {
|
|
92
108
|
num = parseFloat(num);
|
|
@@ -374,6 +390,43 @@ const Util = {
|
|
|
374
390
|
|
|
375
391
|
TSF: function(v) {
|
|
376
392
|
return Util.TF(v, ' ');
|
|
393
|
+
},
|
|
394
|
+
|
|
395
|
+
dateFormat: (date, locale, format) => {
|
|
396
|
+
if (locale) {
|
|
397
|
+
if (format === 'date') {
|
|
398
|
+
return new Intl.DateTimeFormat(locale, {
|
|
399
|
+
year: 'numeric',
|
|
400
|
+
month: 'numeric',
|
|
401
|
+
day: 'numeric'
|
|
402
|
+
}).format(date);
|
|
403
|
+
}
|
|
404
|
+
if (format === 'time') {
|
|
405
|
+
return new Intl.DateTimeFormat(locale, {
|
|
406
|
+
hour: 'numeric',
|
|
407
|
+
minute: 'numeric',
|
|
408
|
+
second: 'numeric'
|
|
409
|
+
}).format(date);
|
|
410
|
+
}
|
|
411
|
+
return new Intl.DateTimeFormat(locale, {
|
|
412
|
+
year: 'numeric',
|
|
413
|
+
month: 'numeric',
|
|
414
|
+
day: 'numeric',
|
|
415
|
+
hour: 'numeric',
|
|
416
|
+
minute: 'numeric',
|
|
417
|
+
second: 'numeric'
|
|
418
|
+
}).format(date);
|
|
419
|
+
}
|
|
420
|
+
|
|
421
|
+
if (format === 'date') {
|
|
422
|
+
return new Date(date).toLocaleDateString();
|
|
423
|
+
}
|
|
424
|
+
|
|
425
|
+
if (format === 'time') {
|
|
426
|
+
return new Date(date).toLocaleTimeString();
|
|
427
|
+
}
|
|
428
|
+
|
|
429
|
+
return new Date(date).toLocaleString();
|
|
377
430
|
}
|
|
378
431
|
};
|
|
379
432
|
|
package/lib/utils/pie.js
CHANGED
|
@@ -71,6 +71,7 @@ const generatePieChart = (pieDataList) => {
|
|
|
71
71
|
const y = pieHeight / 2;
|
|
72
72
|
const r = pieHeight / 2 - margin;
|
|
73
73
|
|
|
74
|
+
let tests = 0;
|
|
74
75
|
const list = [];
|
|
75
76
|
// start from 12 clock
|
|
76
77
|
let start = 0.75;
|
|
@@ -97,6 +98,8 @@ const generatePieChart = (pieDataList) => {
|
|
|
97
98
|
d
|
|
98
99
|
});
|
|
99
100
|
|
|
101
|
+
tests += item.value;
|
|
102
|
+
|
|
100
103
|
});
|
|
101
104
|
|
|
102
105
|
const pies = [];
|
|
@@ -116,15 +119,26 @@ const generatePieChart = (pieDataList) => {
|
|
|
116
119
|
|
|
117
120
|
// legends
|
|
118
121
|
const legendWidth = 200;
|
|
119
|
-
const legendHeight = Math.floor((o.height - margin * 3) / list.length);
|
|
120
|
-
const legends = [`<g transform="translate(${pieWidth + margin} ${margin *
|
|
121
|
-
|
|
122
|
+
const legendHeight = Math.floor((o.height - margin * 3) / (list.length + 1));
|
|
123
|
+
const legends = [`<g font-family="Helvetica, Arial, sans-serif" transform="translate(${pieWidth + margin} ${margin * 2})">`];
|
|
124
|
+
|
|
125
|
+
const legendList = list.concat([{
|
|
126
|
+
id: 'tests',
|
|
127
|
+
name: 'Total',
|
|
128
|
+
value: tests
|
|
129
|
+
}]);
|
|
130
|
+
|
|
131
|
+
legendList.forEach((item, i) => {
|
|
122
132
|
const midY = legendHeight * 0.5;
|
|
123
133
|
legends.push(`<g class="${o.ns}-legend-${item.id}" transform="translate(0 ${legendHeight * i})">`);
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
legends.push(`<text x="
|
|
134
|
+
if (item.id !== 'tests') {
|
|
135
|
+
legends.push(`<circle cx="10" cy="${midY}" r="8" fill="${item.color}" opacity="0.8" />`);
|
|
136
|
+
}
|
|
137
|
+
legends.push(`<text x="25" y="${midY}" alignment-baseline="middle">${item.name}</text>`);
|
|
138
|
+
legends.push(`<text x="125" y="${midY}" alignment-baseline="middle" text-anchor="end">${Util.NF(item.value)}</text>`);
|
|
139
|
+
if (item.id !== 'tests') {
|
|
140
|
+
legends.push(`<text x="${legendWidth - margin}" y="${midY}" alignment-baseline="middle" text-anchor="end">${item.percent}</text>`);
|
|
141
|
+
}
|
|
128
142
|
legends.push('</g>');
|
|
129
143
|
});
|
|
130
144
|
legends.push('</g>');
|
package/lib/utils/system.js
CHANGED
|
@@ -54,13 +54,13 @@ const getMemUsage = () => {
|
|
|
54
54
|
};
|
|
55
55
|
|
|
56
56
|
|
|
57
|
-
const getTickInfo = async () => {
|
|
57
|
+
const getTickInfo = async (timestamp) => {
|
|
58
58
|
const cpu = await getCpuUsage();
|
|
59
59
|
const mem = getMemUsage();
|
|
60
60
|
return {
|
|
61
61
|
cpu,
|
|
62
62
|
mem,
|
|
63
|
-
timestamp
|
|
63
|
+
timestamp
|
|
64
64
|
};
|
|
65
65
|
};
|
|
66
66
|
|
|
@@ -129,7 +129,7 @@ module.exports = {
|
|
|
129
129
|
// setInterval(async () => {
|
|
130
130
|
// const info = await getSystemInfo();
|
|
131
131
|
// console.log(info);
|
|
132
|
-
// const tick = await getTickInfo();
|
|
132
|
+
// const tick = await getTickInfo(timestamp);
|
|
133
133
|
// console.log(tick);
|
|
134
134
|
// }, 1000);
|
|
135
135
|
|
package/lib/utils/util.js
CHANGED
|
@@ -393,6 +393,11 @@ const Util = {
|
|
|
393
393
|
return duration;
|
|
394
394
|
},
|
|
395
395
|
|
|
396
|
+
addTimezoneOffset: (timestamp, offset = 0) => {
|
|
397
|
+
// in minutes
|
|
398
|
+
return timestamp + offset * 60 * 1000;
|
|
399
|
+
},
|
|
400
|
+
|
|
396
401
|
mergeOption: function(... args) {
|
|
397
402
|
const option = {};
|
|
398
403
|
args.forEach((item) => {
|
package/lib/visitor.js
CHANGED
|
@@ -500,17 +500,22 @@ class Visitor {
|
|
|
500
500
|
return;
|
|
501
501
|
}
|
|
502
502
|
|
|
503
|
+
const attachmentList = attachments.map((item) => {
|
|
504
|
+
// do not change original attachment item for after reporters
|
|
505
|
+
return {
|
|
506
|
+
... item
|
|
507
|
+
};
|
|
508
|
+
});
|
|
509
|
+
|
|
510
|
+
if (!Util.isList(attachmentList)) {
|
|
511
|
+
return;
|
|
512
|
+
}
|
|
513
|
+
|
|
503
514
|
const title = caseItem.title;
|
|
504
515
|
|
|
505
516
|
const list = [];
|
|
506
517
|
|
|
507
|
-
|
|
508
|
-
// remove _prompt
|
|
509
|
-
if (item.name && item.name.startsWith('_prompt-')) {
|
|
510
|
-
return false;
|
|
511
|
-
}
|
|
512
|
-
return true;
|
|
513
|
-
}).forEach((item, i) => {
|
|
518
|
+
attachmentList.forEach((item, i) => {
|
|
514
519
|
|
|
515
520
|
// metadata with body
|
|
516
521
|
if (this.testMetadataHandler(item, caseItem)) {
|
|
@@ -588,6 +593,12 @@ class Visitor {
|
|
|
588
593
|
const oldPath = item.path;
|
|
589
594
|
const filename = Util.calculateSha1(oldPath);
|
|
590
595
|
const ext = path.extname(oldPath);
|
|
596
|
+
|
|
597
|
+
const extname = path.extname(item.name);
|
|
598
|
+
if (!extname) {
|
|
599
|
+
item.fileName = `${item.name}-${filename}${ext}`;
|
|
600
|
+
}
|
|
601
|
+
|
|
591
602
|
const newPath = path.resolve(attachmentsDir, `${filename}${ext}`);
|
|
592
603
|
fs.cpSync(oldPath, newPath, {
|
|
593
604
|
force: true,
|
|
@@ -712,6 +723,17 @@ class Visitor {
|
|
|
712
723
|
if (item.content) {
|
|
713
724
|
return;
|
|
714
725
|
}
|
|
726
|
+
|
|
727
|
+
const excludes = ['_prompt-', '_error-context-'];
|
|
728
|
+
if (item.name) {
|
|
729
|
+
const prefix = excludes.find((it) => item.name.startsWith(it));
|
|
730
|
+
if (prefix) {
|
|
731
|
+
item.link = true;
|
|
732
|
+
// console.log(item);
|
|
733
|
+
return;
|
|
734
|
+
}
|
|
735
|
+
}
|
|
736
|
+
|
|
715
737
|
if (Util.isTextType(item.contentType)) {
|
|
716
738
|
item.content = Util.readFileSync(item.path);
|
|
717
739
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "monocart-reporter",
|
|
3
|
-
"version": "2.9.
|
|
3
|
+
"version": "2.9.19",
|
|
4
4
|
"description": "A playwright test reporter. Shows suites/cases/steps with tree style, markdown annotations, custom columns/formatters/data collection visitors, console logs, style tags, send email.",
|
|
5
5
|
"main": "lib/index.js",
|
|
6
6
|
"bin": {
|
|
@@ -44,31 +44,31 @@
|
|
|
44
44
|
"dependencies": {
|
|
45
45
|
"console-grid": "^2.2.3",
|
|
46
46
|
"eight-colors": "^1.3.1",
|
|
47
|
-
"koa": "^
|
|
47
|
+
"koa": "^3.0.0",
|
|
48
48
|
"koa-static-resolver": "^1.0.6",
|
|
49
49
|
"lz-utils": "^2.1.0",
|
|
50
|
-
"monocart-coverage-reports": "^2.12.
|
|
50
|
+
"monocart-coverage-reports": "^2.12.6",
|
|
51
51
|
"monocart-locator": "^1.0.2",
|
|
52
|
-
"nodemailer": "^
|
|
52
|
+
"nodemailer": "^7.0.3"
|
|
53
53
|
},
|
|
54
54
|
"devDependencies": {
|
|
55
|
-
"@babel/code-frame": "^7.
|
|
56
|
-
"@playwright/test": "^1.
|
|
55
|
+
"@babel/code-frame": "^7.27.1",
|
|
56
|
+
"@playwright/test": "^1.52.0",
|
|
57
57
|
"ansi-to-html": "^0.7.2",
|
|
58
58
|
"async-tick": "^1.0.0",
|
|
59
|
-
"autolinker": "^4.1.
|
|
60
|
-
"axios": "^1.
|
|
59
|
+
"autolinker": "^4.1.5",
|
|
60
|
+
"axios": "^1.9.0",
|
|
61
61
|
"commander": "^13.1.0",
|
|
62
|
-
"dotenv": "^16.
|
|
63
|
-
"eslint": "^9.
|
|
62
|
+
"dotenv": "^16.5.0",
|
|
63
|
+
"eslint": "^9.27.0",
|
|
64
64
|
"eslint-config-plus": "^2.0.2",
|
|
65
65
|
"eslint-plugin-html": "^8.1.2",
|
|
66
|
-
"eslint-plugin-vue": "^10.
|
|
66
|
+
"eslint-plugin-vue": "^10.1.0",
|
|
67
67
|
"file-saver": "^2.0.5",
|
|
68
68
|
"find-up": "^7.0.0",
|
|
69
69
|
"github-markdown-css": "^5.8.1",
|
|
70
|
-
"glob": "^11.0.
|
|
71
|
-
"marked": "^15.0.
|
|
70
|
+
"glob": "^11.0.2",
|
|
71
|
+
"marked": "^15.0.11",
|
|
72
72
|
"mermaid": "^11.6.0",
|
|
73
73
|
"mitt": "^3.0.1",
|
|
74
74
|
"monocart-code-viewer": "^1.1.5",
|
|
@@ -78,12 +78,12 @@
|
|
|
78
78
|
"open": "8.4.2",
|
|
79
79
|
"sanitize-filename": "^1.6.3",
|
|
80
80
|
"stack-utils": "^2.0.6",
|
|
81
|
-
"stylelint": "^16.
|
|
81
|
+
"stylelint": "^16.19.1",
|
|
82
82
|
"stylelint-config-plus": "^1.1.3",
|
|
83
83
|
"supports-color": "^10.0.0",
|
|
84
84
|
"turbogrid": "^3.2.0",
|
|
85
85
|
"vine-ui": "^3.1.16",
|
|
86
|
-
"ws": "^8.18.
|
|
86
|
+
"ws": "^8.18.2",
|
|
87
87
|
"yazl": "^3.3.1"
|
|
88
88
|
}
|
|
89
89
|
}
|