playwright-reborn 0.1.0 → 0.2.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/README.md +46 -9
- package/dist/context.d.ts +4 -0
- package/dist/context.js +16 -0
- package/dist/context.js.map +1 -0
- package/dist/fixture-types.d.ts +1 -0
- package/dist/fixture-types.js +9 -0
- package/dist/fixture-types.js.map +1 -0
- package/dist/fixture.d.ts +1 -1
- package/dist/fixture.js +31 -19
- package/dist/fixture.js.map +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.js +33 -1
- package/dist/index.js.map +1 -1
- package/dist/info.d.ts +7 -0
- package/dist/info.js +45 -0
- package/dist/info.js.map +1 -0
- package/dist/model.d.ts +6 -0
- package/dist/options.d.ts +14 -0
- package/dist/options.js +42 -5
- package/dist/options.js.map +1 -1
- package/dist/render.d.ts +9 -2
- package/dist/render.js +75 -9
- package/dist/render.js.map +1 -1
- package/dist/serialize.d.ts +2 -1
- package/dist/serialize.js +5 -2
- package/dist/serialize.js.map +1 -1
- package/dist/ui/report.css +35 -0
- package/dist/ui/report.js +91 -2
- package/package.json +4 -2
package/README.md
CHANGED
|
@@ -37,29 +37,45 @@ Pass any of these next to the reporter. Omitted settings use the default.
|
|
|
37
37
|
|
|
38
38
|
```ts
|
|
39
39
|
['playwright-reborn', {
|
|
40
|
-
company: '
|
|
40
|
+
company: 'Your company',
|
|
41
41
|
accent: 'green',
|
|
42
|
-
open: 'on-failure',
|
|
43
|
-
outputFolder: 'reborn-report',
|
|
42
|
+
open: process.env.CI ? 'never' : 'on-failure',
|
|
43
|
+
outputFolder: 'reborn-report/qa',
|
|
44
|
+
reportFileName: 'index.html',
|
|
45
|
+
inline: true,
|
|
44
46
|
overview: 'chart',
|
|
45
47
|
screenshots: 'failure',
|
|
46
48
|
steps: 'user',
|
|
47
49
|
showLogs: true,
|
|
48
50
|
showFiles: true,
|
|
51
|
+
suite: 'Checkout',
|
|
52
|
+
environment: 'qa',
|
|
53
|
+
user: 'ada',
|
|
54
|
+
state: 'CA',
|
|
55
|
+
defects: ['PAY-14'],
|
|
49
56
|
}]
|
|
50
57
|
```
|
|
51
58
|
|
|
52
59
|
| Setting | Default | Allowed |
|
|
53
60
|
|---|---|---|
|
|
54
|
-
| `company` |
|
|
61
|
+
| `company` | Project folder name | Any name. This is the large title. It does not change when a run fails. |
|
|
55
62
|
| `accent` | `green` | `green`, `red`, `blue`, `amber`, `violet`. Colors the light field, failure marks, and links. |
|
|
56
|
-
| `open` | `on-failure` | `always`, `never`, `on-failure`. When to open the HTML file after the run. |
|
|
63
|
+
| `open` | `on-failure` | `always`, `never`, `on-failure`. When to open the HTML file after the run. Use `never` when `CI` is set. |
|
|
57
64
|
| `outputFolder` | `reborn-report` | A folder path. Each run replaces that folder. If you leave this unset, a sharded run writes `reborn-report-shard-1` and so on. |
|
|
65
|
+
| `reportFileName` | `index.html` | One `.html` file name, with no folders. Jenkins HTML Publisher can point at this file. |
|
|
66
|
+
| `inline` | `true` | `true` or `false`. `true` writes one HTML file with the CSS, script, and fonts inside it, and embeds screenshots. Traces and other files stay as relative links in the report folder. |
|
|
58
67
|
| `overview` | `chart` | `chart` or `timeline`. Which view the overview opens on. The buttons on the page can still switch it. |
|
|
59
|
-
| `screenshots` | `failure` | `off`, `failure`, `last`, or `steps`. When the fixture takes a picture. The Screenshots page stays in the report either way. |
|
|
60
|
-
| `steps` | `user` | `user` or `all`. `user` keeps the steps you wrote and the expectations
|
|
68
|
+
| `screenshots` | `failure` | `off`, `failure`, `last`, or `steps`. When the fixture takes a picture. The reporter sets `REBORN_SCREENSHOTS` in `onBegin`. Do not set that variable yourself. The Screenshots page stays in the report either way. |
|
|
69
|
+
| `steps` | `user` | `user` or `all`. `user` keeps the steps you wrote and the expectations, and leaves hooks and Playwright's own API calls out. `all` keeps those calls too. |
|
|
61
70
|
| `showLogs` | `true` | `true` or `false`. `false` leaves the Logs page out. |
|
|
62
71
|
| `showFiles` | `true` | `true` or `false`. `false` leaves the Files page out. |
|
|
72
|
+
| `suite` | empty | Suite name shown on the overview. |
|
|
73
|
+
| `user` | `USER` when set | Who ran the suite. A reporter option wins over `BUILD_USER`, `GITHUB_ACTOR`, and `USER`. |
|
|
74
|
+
| `environment` | `TEST_ENV` when set | For example `qa`. |
|
|
75
|
+
| `state` | `TEST_STATE` when set | A region or tenant, when the suite has one. |
|
|
76
|
+
| `defects` | empty | One defect id, or a list. Playwright `metadata.defects` and `metadata.jira` are added too. |
|
|
77
|
+
|
|
78
|
+
The overview also shows base URL, git branch, commit, projects, workers, shard, and the Playwright version when those values are present. Set them with the options above or with `metadata` in `playwright.config.ts`. `metadata.baseURL` wins over the project `baseURL`. Branch and commit are read from `GITHUB_REF_NAME`, `GIT_BRANCH`, `BRANCH_NAME`, `GITHUB_SHA`, `GIT_COMMIT`, and `COMMIT_SHA`.
|
|
63
79
|
|
|
64
80
|
## Screenshots
|
|
65
81
|
|
|
@@ -68,15 +84,36 @@ The reporter cannot photograph the page. Import the fixture in the tests that sh
|
|
|
68
84
|
```ts
|
|
69
85
|
import { test, expect, step } from 'playwright-reborn/fixture';
|
|
70
86
|
|
|
71
|
-
await step('read the receipt', async () => {
|
|
72
|
-
|
|
87
|
+
const order = await step('read the receipt', async () => {
|
|
88
|
+
return page.locator('#order').textContent();
|
|
73
89
|
});
|
|
90
|
+
await expect(order).toBe('1842');
|
|
74
91
|
```
|
|
75
92
|
|
|
93
|
+
`step` returns the value of its body, the same way `test.step` does. `test` is a normal Playwright test object, so a suite can `test.extend(...)` with its own fixtures.
|
|
94
|
+
|
|
95
|
+
The page fixture keeps each screenshot on the test that is running, including when tests run in parallel.
|
|
96
|
+
|
|
76
97
|
`failure` and `last` take one picture at the end of an attempt, for tests that use `page`. `steps` also takes a picture after each `step()`. A plain `test.step` is not photographed. Turn Playwright's own `screenshot` option off if you do not want a second copy of the same picture.
|
|
77
98
|
|
|
78
99
|
Files larger than 25MB are listed and not copied.
|
|
79
100
|
|
|
101
|
+
## Jenkins
|
|
102
|
+
|
|
103
|
+
Publish the report folder. The HTML Publisher index is `index.html`. The JUnit file stays separate for the JUnit plugin.
|
|
104
|
+
|
|
105
|
+
```groovy
|
|
106
|
+
publishHTML([
|
|
107
|
+
reportDir: 'reborn-report/qa',
|
|
108
|
+
reportFiles: 'index.html',
|
|
109
|
+
reportName: 'Reborn Report',
|
|
110
|
+
])
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
`inline: true` is the default, so that HTML file opens from a Jenkins artifact or from disk without a CDN and without `assets/report.css`. Keep the report folder together if the Files page should still download traces and video. Those links are relative paths inside the folder.
|
|
114
|
+
|
|
115
|
+
Set `open: 'never'` when `CI` is set so the reporter does not launch a browser on the agent.
|
|
116
|
+
|
|
80
117
|
## License
|
|
81
118
|
|
|
82
119
|
Open source by World of Z. The code is MIT.
|
package/dist/context.js
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.rememberPage = rememberPage;
|
|
4
|
+
exports.forgetPage = forgetPage;
|
|
5
|
+
exports.pageFor = pageFor;
|
|
6
|
+
const pages = new WeakMap();
|
|
7
|
+
function rememberPage(testInfo, page) {
|
|
8
|
+
pages.set(testInfo, page);
|
|
9
|
+
}
|
|
10
|
+
function forgetPage(testInfo) {
|
|
11
|
+
pages.delete(testInfo);
|
|
12
|
+
}
|
|
13
|
+
function pageFor(testInfo) {
|
|
14
|
+
return pages.get(testInfo);
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=context.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context.js","sourceRoot":"","sources":["../src/context.ts"],"names":[],"mappings":";;AAIA,oCAEC;AAED,gCAEC;AAED,0BAEC;AAZD,MAAM,KAAK,GAAG,IAAI,OAAO,EAAkB,CAAC;AAE5C,SAAgB,YAAY,CAAC,QAAkB,EAAE,IAAU;IACzD,KAAK,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;AAC5B,CAAC;AAED,SAAgB,UAAU,CAAC,QAAkB;IAC3C,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;AACzB,CAAC;AAED,SAAgB,OAAO,CAAC,QAAkB;IACxC,OAAO,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;AAC7B,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function typedStep(): Promise<number>;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.typedStep = typedStep;
|
|
4
|
+
const fixture_1 = require("./fixture");
|
|
5
|
+
async function typedStep() {
|
|
6
|
+
const value = await (0, fixture_1.step)('x', async () => 1);
|
|
7
|
+
return value;
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=fixture-types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fixture-types.js","sourceRoot":"","sources":["../src/fixture-types.ts"],"names":[],"mappings":";;AAEA,8BAGC;AALD,uCAAiC;AAE1B,KAAK,UAAU,SAAS;IAC7B,MAAM,KAAK,GAAG,MAAM,IAAA,cAAI,EAAC,GAAG,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IAC7C,OAAO,KAAK,CAAC;AACf,CAAC"}
|
package/dist/fixture.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
import { expect } from '@playwright/test';
|
|
2
2
|
export declare const test: import("playwright/test").TestType<import("playwright/test").PlaywrightTestArgs & import("playwright/test").PlaywrightTestOptions, import("playwright/test").PlaywrightWorkerArgs & import("playwright/test").PlaywrightWorkerOptions>;
|
|
3
3
|
export { expect };
|
|
4
|
-
export declare function step(title: string, body: () => Promise<
|
|
4
|
+
export declare function step<T>(title: string, body: () => Promise<T> | T): Promise<T>;
|
package/dist/fixture.js
CHANGED
|
@@ -4,50 +4,62 @@ exports.expect = exports.test = void 0;
|
|
|
4
4
|
exports.step = step;
|
|
5
5
|
const test_1 = require("@playwright/test");
|
|
6
6
|
Object.defineProperty(exports, "expect", { enumerable: true, get: function () { return test_1.expect; } });
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
if (!
|
|
7
|
+
const context_1 = require("./context");
|
|
8
|
+
async function shot(name, testInfo) {
|
|
9
|
+
let info = testInfo;
|
|
10
|
+
if (!info) {
|
|
11
|
+
try {
|
|
12
|
+
info = exports.test.info();
|
|
13
|
+
}
|
|
14
|
+
catch {
|
|
15
|
+
return;
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
const page = (0, context_1.pageFor)(info);
|
|
19
|
+
if (!page)
|
|
11
20
|
return;
|
|
12
21
|
try {
|
|
13
|
-
const body = await
|
|
14
|
-
await
|
|
22
|
+
const body = await page.screenshot({ timeout: 5_000 });
|
|
23
|
+
await info.attach(name, { body, contentType: 'image/png' });
|
|
15
24
|
}
|
|
16
25
|
catch {
|
|
17
26
|
// A closed page should not hide the test result.
|
|
18
27
|
}
|
|
19
28
|
}
|
|
29
|
+
function screenshotMode() {
|
|
30
|
+
return process.env.REBORN_SCREENSHOTS || 'failure';
|
|
31
|
+
}
|
|
20
32
|
exports.test = test_1.test.extend({
|
|
21
33
|
page: async ({ page }, use, testInfo) => {
|
|
22
|
-
|
|
23
|
-
activeInfo = testInfo;
|
|
34
|
+
(0, context_1.rememberPage)(testInfo, page);
|
|
24
35
|
try {
|
|
25
36
|
await use(page);
|
|
26
|
-
const mode =
|
|
37
|
+
const mode = screenshotMode();
|
|
27
38
|
const failed = testInfo.status === 'failed' || testInfo.status === 'timedOut';
|
|
28
39
|
if (mode === 'last' || (mode === 'steps' && !failed))
|
|
29
|
-
await shot('reborn:last');
|
|
40
|
+
await shot('reborn:last', testInfo);
|
|
30
41
|
if ((mode === 'failure' || mode === 'steps') && failed)
|
|
31
|
-
await shot('reborn:failure');
|
|
42
|
+
await shot('reborn:failure', testInfo);
|
|
32
43
|
}
|
|
33
44
|
finally {
|
|
34
|
-
|
|
35
|
-
activeInfo = undefined;
|
|
45
|
+
(0, context_1.forgetPage)(testInfo);
|
|
36
46
|
}
|
|
37
47
|
},
|
|
38
48
|
});
|
|
39
49
|
async function step(title, body) {
|
|
40
|
-
|
|
50
|
+
const testInfo = exports.test.info();
|
|
51
|
+
return exports.test.step(title, async () => {
|
|
41
52
|
try {
|
|
42
|
-
await body();
|
|
53
|
+
const value = await body();
|
|
54
|
+
if (screenshotMode() === 'steps')
|
|
55
|
+
await shot(`reborn:step:${title}`, testInfo);
|
|
56
|
+
return value;
|
|
43
57
|
}
|
|
44
58
|
catch (error) {
|
|
45
|
-
if (
|
|
46
|
-
await shot(`reborn:step:${title}
|
|
59
|
+
if (screenshotMode() === 'steps')
|
|
60
|
+
await shot(`reborn:step:${title}`, testInfo);
|
|
47
61
|
throw error;
|
|
48
62
|
}
|
|
49
|
-
if (process.env.REBORN_SCREENSHOTS === 'steps')
|
|
50
|
-
await shot(`reborn:step:${title}`);
|
|
51
63
|
});
|
|
52
64
|
}
|
|
53
65
|
//# sourceMappingURL=fixture.js.map
|
package/dist/fixture.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fixture.js","sourceRoot":"","sources":["../src/fixture.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"fixture.js","sourceRoot":"","sources":["../src/fixture.ts"],"names":[],"mappings":";;;AA2CA,oBAYC;AAvDD,2CAAuE;AAyC9D,uFAzCc,aAAM,OAyCd;AAxCf,uCAA8D;AAE9D,KAAK,UAAU,IAAI,CAAC,IAAY,EAAE,QAAmB;IACnD,IAAI,IAAI,GAAG,QAAQ,CAAC;IACpB,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,IAAI,CAAC;YACH,IAAI,GAAG,YAAI,CAAC,IAAI,EAAE,CAAC;QACrB,CAAC;QAAC,MAAM,CAAC;YACP,OAAO;QACT,CAAC;IACH,CAAC;IACD,MAAM,IAAI,GAAG,IAAA,iBAAO,EAAC,IAAI,CAAC,CAAC;IAC3B,IAAI,CAAC,IAAI;QAAE,OAAO;IAClB,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;QACvD,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,WAAW,EAAE,CAAC,CAAC;IAC9D,CAAC;IAAC,MAAM,CAAC;QACP,iDAAiD;IACnD,CAAC;AACH,CAAC;AAED,SAAS,cAAc;IACrB,OAAO,OAAO,CAAC,GAAG,CAAC,kBAAkB,IAAI,SAAS,CAAC;AACrD,CAAC;AAEY,QAAA,IAAI,GAAG,WAAI,CAAC,MAAM,CAAC;IAC9B,IAAI,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,QAAQ,EAAE,EAAE;QACtC,IAAA,sBAAY,EAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;QAC7B,IAAI,CAAC;YACH,MAAM,GAAG,CAAC,IAAI,CAAC,CAAC;YAChB,MAAM,IAAI,GAAG,cAAc,EAAE,CAAC;YAC9B,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,KAAK,QAAQ,IAAI,QAAQ,CAAC,MAAM,KAAK,UAAU,CAAC;YAC9E,IAAI,IAAI,KAAK,MAAM,IAAI,CAAC,IAAI,KAAK,OAAO,IAAI,CAAC,MAAM,CAAC;gBAAE,MAAM,IAAI,CAAC,aAAa,EAAE,QAAQ,CAAC,CAAC;YAC1F,IAAI,CAAC,IAAI,KAAK,SAAS,IAAI,IAAI,KAAK,OAAO,CAAC,IAAI,MAAM;gBAAE,MAAM,IAAI,CAAC,gBAAgB,EAAE,QAAQ,CAAC,CAAC;QACjG,CAAC;gBAAS,CAAC;YACT,IAAA,oBAAU,EAAC,QAAQ,CAAC,CAAC;QACvB,CAAC;IACH,CAAC;CACF,CAAC,CAAC;AAII,KAAK,UAAU,IAAI,CAAI,KAAa,EAAE,IAA0B;IACrE,MAAM,QAAQ,GAAG,YAAI,CAAC,IAAI,EAAE,CAAC;IAC7B,OAAO,YAAI,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,IAAI,EAAE;QACjC,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,MAAM,IAAI,EAAE,CAAC;YAC3B,IAAI,cAAc,EAAE,KAAK,OAAO;gBAAE,MAAM,IAAI,CAAC,eAAe,KAAK,EAAE,EAAE,QAAQ,CAAC,CAAC;YAC/E,OAAO,KAAK,CAAC;QACf,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,cAAc,EAAE,KAAK,OAAO;gBAAE,MAAM,IAAI,CAAC,eAAe,KAAK,EAAE,EAAE,QAAQ,CAAC,CAAC;YAC/E,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC"}
|
package/dist/index.d.ts
CHANGED
package/dist/index.js
CHANGED
|
@@ -10,6 +10,7 @@ const paths_1 = require("./paths");
|
|
|
10
10
|
const render_1 = require("./render");
|
|
11
11
|
const serialize_1 = require("./serialize");
|
|
12
12
|
const format_1 = require("./format");
|
|
13
|
+
const info_1 = require("./info");
|
|
13
14
|
class RebornReporter {
|
|
14
15
|
parsed;
|
|
15
16
|
suite;
|
|
@@ -48,6 +49,33 @@ class RebornReporter {
|
|
|
48
49
|
return node_path_1.default.dirname(this.config.configFile);
|
|
49
50
|
return process.cwd();
|
|
50
51
|
}
|
|
52
|
+
metadata(key) {
|
|
53
|
+
const metadata = this.config?.metadata;
|
|
54
|
+
return metadata ? metadata[key] : undefined;
|
|
55
|
+
}
|
|
56
|
+
runInfo() {
|
|
57
|
+
const config = this.config;
|
|
58
|
+
const baseURL = (0, info_1.textValue)(this.metadata('baseURL')) || config?.projects.map((project) => (0, info_1.textValue)(project.use.baseURL)).find(Boolean) || '';
|
|
59
|
+
const defects = [
|
|
60
|
+
...this.parsed.defects,
|
|
61
|
+
...(0, info_1.listValue)(this.metadata('defects')),
|
|
62
|
+
...(0, info_1.listValue)(this.metadata('jira')),
|
|
63
|
+
];
|
|
64
|
+
return (0, info_1.infoRows)({
|
|
65
|
+
suite: this.parsed.suite || (0, info_1.textValue)(this.metadata('suite')) || (0, info_1.textValue)(this.metadata('suiteName')),
|
|
66
|
+
user: this.parsed.user || (0, info_1.textValue)(this.metadata('user')) || process.env.BUILD_USER || process.env.GITHUB_ACTOR || process.env.USER || '',
|
|
67
|
+
environment: this.parsed.environment || (0, info_1.textValue)(this.metadata('environment')) || process.env.TEST_ENV || '',
|
|
68
|
+
state: this.parsed.state || (0, info_1.textValue)(this.metadata('state')) || process.env.TEST_STATE || '',
|
|
69
|
+
defects: [...new Set(defects)].join(', '),
|
|
70
|
+
baseURL,
|
|
71
|
+
branch: (0, info_1.textValue)(this.metadata('branch')) || process.env.GITHUB_REF_NAME || process.env.GIT_BRANCH || process.env.BRANCH_NAME || '',
|
|
72
|
+
sha: (0, info_1.textValue)(this.metadata('sha')) || process.env.GITHUB_SHA || process.env.GIT_COMMIT || process.env.COMMIT_SHA || '',
|
|
73
|
+
projects: config?.projects.map((project) => project.name).filter(Boolean).join(', ') || '',
|
|
74
|
+
workers: config ? String(config.workers) : '',
|
|
75
|
+
shard: config?.shard ? `${config.shard.current}/${config.shard.total}` : '',
|
|
76
|
+
playwright: config?.version || '',
|
|
77
|
+
});
|
|
78
|
+
}
|
|
51
79
|
folderFor(config) {
|
|
52
80
|
if (this.parsed.outputExplicit || !config.shard)
|
|
53
81
|
return this.parsed.outputFolder;
|
|
@@ -78,8 +106,12 @@ class RebornReporter {
|
|
|
78
106
|
showLogs: this.parsed.showLogs,
|
|
79
107
|
showFiles: this.parsed.showFiles,
|
|
80
108
|
overview: this.parsed.overview,
|
|
109
|
+
info: this.runInfo(),
|
|
110
|
+
});
|
|
111
|
+
const indexPath = await (0, render_1.writeReport)(outputDir, report, files, node_path_1.default.join(__dirname, 'ui'), {
|
|
112
|
+
inline: this.parsed.inline,
|
|
113
|
+
reportFileName: this.parsed.reportFileName,
|
|
81
114
|
});
|
|
82
|
-
const indexPath = await (0, render_1.writeReport)(outputDir, report, files, node_path_1.default.join(__dirname, 'ui'));
|
|
83
115
|
process.stdout.write(`\nReborn report: ${indexPath}\n`);
|
|
84
116
|
const failed = status !== 'passed';
|
|
85
117
|
if (this.parsed.open === 'always' || (this.parsed.open === 'on-failure' && failed)) {
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;AAAA,0DAA6B;AAG7B,iCAAoC;AACpC,uCAA6D;AAC7D,mCAA8C;AAC9C,qCAAuC;AACvC,2CAA0C;AAC1C,qCAA8C;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/info.d.ts
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export type InfoRow = {
|
|
2
|
+
label: string;
|
|
3
|
+
value: string;
|
|
4
|
+
};
|
|
5
|
+
export declare function infoRows(fields: Record<string, string | undefined>): InfoRow[];
|
|
6
|
+
export declare function textValue(value: unknown): string;
|
|
7
|
+
export declare function listValue(value: unknown): string[];
|
package/dist/info.js
ADDED
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.infoRows = infoRows;
|
|
4
|
+
exports.textValue = textValue;
|
|
5
|
+
exports.listValue = listValue;
|
|
6
|
+
const FIELDS = [
|
|
7
|
+
['suite', 'Suite'],
|
|
8
|
+
['user', 'User'],
|
|
9
|
+
['environment', 'Environment'],
|
|
10
|
+
['state', 'State'],
|
|
11
|
+
['defects', 'Defects'],
|
|
12
|
+
['baseURL', 'Base URL'],
|
|
13
|
+
['branch', 'Branch'],
|
|
14
|
+
['sha', 'Commit'],
|
|
15
|
+
['projects', 'Projects'],
|
|
16
|
+
['workers', 'Workers'],
|
|
17
|
+
['shard', 'Shard'],
|
|
18
|
+
['playwright', 'Playwright'],
|
|
19
|
+
];
|
|
20
|
+
function infoRows(fields) {
|
|
21
|
+
const rows = [];
|
|
22
|
+
for (const [key, label] of FIELDS) {
|
|
23
|
+
const value = fields[key]?.trim();
|
|
24
|
+
if (!value)
|
|
25
|
+
continue;
|
|
26
|
+
rows.push({ label, value });
|
|
27
|
+
}
|
|
28
|
+
return rows;
|
|
29
|
+
}
|
|
30
|
+
function textValue(value) {
|
|
31
|
+
if (typeof value === 'string')
|
|
32
|
+
return value.trim();
|
|
33
|
+
if (typeof value === 'number' && Number.isFinite(value))
|
|
34
|
+
return String(value);
|
|
35
|
+
return '';
|
|
36
|
+
}
|
|
37
|
+
function listValue(value) {
|
|
38
|
+
if (Array.isArray(value)) {
|
|
39
|
+
return value.flatMap((item) => listValue(item));
|
|
40
|
+
}
|
|
41
|
+
if (typeof value !== 'string')
|
|
42
|
+
return [];
|
|
43
|
+
return value.split(',').map((item) => item.trim()).filter(Boolean);
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=info.js.map
|
package/dist/info.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"info.js","sourceRoot":"","sources":["../src/info.ts"],"names":[],"mappings":";;AAiBA,4BAQC;AAED,8BAIC;AAED,8BAMC;AArCD,MAAM,MAAM,GAA4B;IACtC,CAAC,OAAO,EAAE,OAAO,CAAC;IAClB,CAAC,MAAM,EAAE,MAAM,CAAC;IAChB,CAAC,aAAa,EAAE,aAAa,CAAC;IAC9B,CAAC,OAAO,EAAE,OAAO,CAAC;IAClB,CAAC,SAAS,EAAE,SAAS,CAAC;IACtB,CAAC,SAAS,EAAE,UAAU,CAAC;IACvB,CAAC,QAAQ,EAAE,QAAQ,CAAC;IACpB,CAAC,KAAK,EAAE,QAAQ,CAAC;IACjB,CAAC,UAAU,EAAE,UAAU,CAAC;IACxB,CAAC,SAAS,EAAE,SAAS,CAAC;IACtB,CAAC,OAAO,EAAE,OAAO,CAAC;IAClB,CAAC,YAAY,EAAE,YAAY,CAAC;CAC7B,CAAC;AAEF,SAAgB,QAAQ,CAAC,MAA0C;IACjE,MAAM,IAAI,GAAc,EAAE,CAAC;IAC3B,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,EAAE,CAAC;QAClC,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,CAAC;QAClC,IAAI,CAAC,KAAK;YAAE,SAAS;QACrB,IAAI,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;IAC9B,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAgB,SAAS,CAAC,KAAc;IACtC,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC,IAAI,EAAE,CAAC;IACnD,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;IAC9E,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,SAAgB,SAAS,CAAC,KAAc;IACtC,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;IAClD,CAAC;IACD,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,EAAE,CAAC;IACzC,OAAO,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;AACrE,CAAC"}
|
package/dist/model.d.ts
CHANGED
|
@@ -69,6 +69,10 @@ export type ReportTest = {
|
|
|
69
69
|
order: number;
|
|
70
70
|
attempts: Attempt[];
|
|
71
71
|
};
|
|
72
|
+
export type InfoRow = {
|
|
73
|
+
label: string;
|
|
74
|
+
value: string;
|
|
75
|
+
};
|
|
72
76
|
export type Report = {
|
|
73
77
|
version: 2;
|
|
74
78
|
screenshots: ShotMode;
|
|
@@ -86,6 +90,7 @@ export type Report = {
|
|
|
86
90
|
startTime: string;
|
|
87
91
|
duration: number;
|
|
88
92
|
projectName: string;
|
|
93
|
+
info: InfoRow[];
|
|
89
94
|
projects: string[];
|
|
90
95
|
workers: number;
|
|
91
96
|
shard: string | null;
|
|
@@ -97,6 +102,7 @@ export type Report = {
|
|
|
97
102
|
export type PendingFile = {
|
|
98
103
|
name: string;
|
|
99
104
|
target: string;
|
|
105
|
+
contentType?: string;
|
|
100
106
|
sourcePath?: string;
|
|
101
107
|
body?: Buffer;
|
|
102
108
|
};
|
package/dist/options.d.ts
CHANGED
|
@@ -2,6 +2,7 @@ import type { Accent, OverviewMode, ShotMode, StepDetail } from './model';
|
|
|
2
2
|
export type RebornOpen = 'always' | 'never' | 'on-failure';
|
|
3
3
|
export type RebornOptions = {
|
|
4
4
|
outputFolder?: string;
|
|
5
|
+
reportFileName?: string;
|
|
5
6
|
open?: RebornOpen;
|
|
6
7
|
screenshots?: ShotMode;
|
|
7
8
|
steps?: StepDetail;
|
|
@@ -10,10 +11,17 @@ export type RebornOptions = {
|
|
|
10
11
|
showLogs?: boolean;
|
|
11
12
|
showFiles?: boolean;
|
|
12
13
|
overview?: OverviewMode;
|
|
14
|
+
inline?: boolean;
|
|
15
|
+
suite?: string;
|
|
16
|
+
user?: string;
|
|
17
|
+
environment?: string;
|
|
18
|
+
state?: string;
|
|
19
|
+
defects?: string | string[];
|
|
13
20
|
};
|
|
14
21
|
export type ParsedOptions = {
|
|
15
22
|
outputFolder: string;
|
|
16
23
|
outputExplicit: boolean;
|
|
24
|
+
reportFileName: string;
|
|
17
25
|
open: RebornOpen;
|
|
18
26
|
screenshots: ShotMode;
|
|
19
27
|
steps: StepDetail;
|
|
@@ -22,5 +30,11 @@ export type ParsedOptions = {
|
|
|
22
30
|
showLogs: boolean;
|
|
23
31
|
showFiles: boolean;
|
|
24
32
|
overview: OverviewMode;
|
|
33
|
+
inline: boolean;
|
|
34
|
+
suite: string;
|
|
35
|
+
user: string;
|
|
36
|
+
environment: string;
|
|
37
|
+
state: string;
|
|
38
|
+
defects: string[];
|
|
25
39
|
};
|
|
26
40
|
export declare function parseOptions(options?: RebornOptions): ParsedOptions;
|
package/dist/options.js
CHANGED
|
@@ -22,16 +22,14 @@ function parseOptions(options = {}) {
|
|
|
22
22
|
if (!STEP_DETAILS.has(steps)) {
|
|
23
23
|
throw new Error('Reborn steps must be "user" or "all".');
|
|
24
24
|
}
|
|
25
|
-
const company = options.company
|
|
26
|
-
if (typeof company !== 'string' || !company.trim()) {
|
|
27
|
-
throw new Error('Reborn company must be a non-empty name.');
|
|
28
|
-
}
|
|
25
|
+
const company = optionalText(options.company, 'company');
|
|
29
26
|
const accent = options.accent ?? 'green';
|
|
30
27
|
if (!ACCENTS.has(accent)) {
|
|
31
28
|
throw new Error('Reborn accent must be "green", "red", "blue", "amber", or "violet".');
|
|
32
29
|
}
|
|
33
30
|
const showLogs = flag(options.showLogs, 'showLogs');
|
|
34
31
|
const showFiles = flag(options.showFiles, 'showFiles');
|
|
32
|
+
const inline = flag(options.inline, 'inline');
|
|
35
33
|
const overview = options.overview ?? 'chart';
|
|
36
34
|
if (!OVERVIEWS.has(overview)) {
|
|
37
35
|
throw new Error('Reborn overview must be "chart" or "timeline".');
|
|
@@ -41,7 +39,46 @@ function parseOptions(options = {}) {
|
|
|
41
39
|
if (typeof outputFolder !== 'string' || !outputFolder.trim()) {
|
|
42
40
|
throw new Error('Reborn outputFolder must be a non-empty path.');
|
|
43
41
|
}
|
|
44
|
-
|
|
42
|
+
const reportFileName = options.reportFileName ?? 'index.html';
|
|
43
|
+
if (!/^[A-Za-z0-9._-]+\.html$/.test(reportFileName)) {
|
|
44
|
+
throw new Error('Reborn reportFileName must be a single .html file name.');
|
|
45
|
+
}
|
|
46
|
+
return {
|
|
47
|
+
outputFolder,
|
|
48
|
+
outputExplicit,
|
|
49
|
+
reportFileName,
|
|
50
|
+
open,
|
|
51
|
+
screenshots,
|
|
52
|
+
steps,
|
|
53
|
+
company,
|
|
54
|
+
accent,
|
|
55
|
+
showLogs,
|
|
56
|
+
showFiles,
|
|
57
|
+
overview,
|
|
58
|
+
inline,
|
|
59
|
+
suite: optionalText(options.suite, 'suite'),
|
|
60
|
+
user: optionalText(options.user, 'user'),
|
|
61
|
+
environment: optionalText(options.environment, 'environment'),
|
|
62
|
+
state: optionalText(options.state, 'state'),
|
|
63
|
+
defects: defectsOf(options.defects),
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
function optionalText(value, name) {
|
|
67
|
+
if (value === undefined)
|
|
68
|
+
return '';
|
|
69
|
+
if (typeof value !== 'string' || !value.trim()) {
|
|
70
|
+
throw new Error(`Reborn ${name} must be a non-empty name.`);
|
|
71
|
+
}
|
|
72
|
+
return value.trim();
|
|
73
|
+
}
|
|
74
|
+
function defectsOf(value) {
|
|
75
|
+
if (value === undefined)
|
|
76
|
+
return [];
|
|
77
|
+
const items = Array.isArray(value) ? value : [value];
|
|
78
|
+
if (items.some((item) => typeof item !== 'string' || !item.trim())) {
|
|
79
|
+
throw new Error('Reborn defects must be a name or a list of names.');
|
|
80
|
+
}
|
|
81
|
+
return items.map((item) => item.trim());
|
|
45
82
|
}
|
|
46
83
|
function flag(value, name) {
|
|
47
84
|
if (value === undefined)
|
package/dist/options.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"options.js","sourceRoot":"","sources":["../src/options.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"options.js","sourceRoot":"","sources":["../src/options.ts"],"names":[],"mappings":"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"}
|
package/dist/render.d.ts
CHANGED
|
@@ -1,3 +1,10 @@
|
|
|
1
1
|
import type { PendingFile, Report } from './model';
|
|
2
|
-
export declare function
|
|
3
|
-
export declare function
|
|
2
|
+
export declare function embedFontUrls(css: string, dataUri: (file: string) => string): string;
|
|
3
|
+
export declare function renderHtml(json: string, assets?: {
|
|
4
|
+
css: string;
|
|
5
|
+
js: string;
|
|
6
|
+
}): string;
|
|
7
|
+
export declare function writeReport(outputDir: string, report: Report, files: PendingFile[], uiDir: string, output?: {
|
|
8
|
+
inline: boolean;
|
|
9
|
+
reportFileName: string;
|
|
10
|
+
}): Promise<string>;
|
package/dist/render.js
CHANGED
|
@@ -3,13 +3,29 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
3
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.embedFontUrls = embedFontUrls;
|
|
6
7
|
exports.renderHtml = renderHtml;
|
|
7
8
|
exports.writeReport = writeReport;
|
|
8
9
|
const promises_1 = __importDefault(require("node:fs/promises"));
|
|
9
10
|
const node_path_1 = __importDefault(require("node:path"));
|
|
10
11
|
const format_1 = require("./format");
|
|
11
12
|
const paths_1 = require("./paths");
|
|
12
|
-
function
|
|
13
|
+
function embedFontUrls(css, dataUri) {
|
|
14
|
+
return css.replace(/url\("fonts\/([^"]+)"\)/g, (_match, file) => `url("${dataUri(file)}")`);
|
|
15
|
+
}
|
|
16
|
+
function escapeStyle(css) {
|
|
17
|
+
return css.replace(/<\/style/gi, '<\\/style');
|
|
18
|
+
}
|
|
19
|
+
function escapeScript(source) {
|
|
20
|
+
return source.replace(/<\/script/gi, '<\\/script');
|
|
21
|
+
}
|
|
22
|
+
function renderHtml(json, assets) {
|
|
23
|
+
const style = assets
|
|
24
|
+
? `<style>${escapeStyle(assets.css)}</style>`
|
|
25
|
+
: '<link rel="stylesheet" href="assets/report.css">';
|
|
26
|
+
const script = assets
|
|
27
|
+
? `<script>${escapeScript(assets.js)}</script>`
|
|
28
|
+
: '<script src="assets/report.js"></script>';
|
|
13
29
|
return `<!DOCTYPE html>
|
|
14
30
|
<html lang="en">
|
|
15
31
|
<head>
|
|
@@ -17,14 +33,14 @@ function renderHtml(json) {
|
|
|
17
33
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
18
34
|
<meta name="robots" content="noindex">
|
|
19
35
|
<title>Report</title>
|
|
20
|
-
|
|
36
|
+
${style}
|
|
21
37
|
</head>
|
|
22
38
|
<body style="margin:0;background:#080808;color:#f0f0f0">
|
|
23
39
|
<div class="light"></div>
|
|
24
40
|
<a class="skip" href="#tests">Skip to tests</a>
|
|
25
41
|
<main class="page" id="app"></main>
|
|
26
42
|
<script id="reborn-data" type="application/json">${json}</script>
|
|
27
|
-
|
|
43
|
+
${script}
|
|
28
44
|
</body>
|
|
29
45
|
</html>
|
|
30
46
|
`;
|
|
@@ -75,7 +91,43 @@ async function writePending(outputDir, file) {
|
|
|
75
91
|
}
|
|
76
92
|
throw new Error('Attachment had no file and no body.');
|
|
77
93
|
}
|
|
78
|
-
async function
|
|
94
|
+
async function fileBody(file) {
|
|
95
|
+
if (file.body)
|
|
96
|
+
return file.body;
|
|
97
|
+
if (file.sourcePath)
|
|
98
|
+
return promises_1.default.readFile(file.sourcePath);
|
|
99
|
+
throw new Error('Attachment had no file and no body.');
|
|
100
|
+
}
|
|
101
|
+
function replacePath(report, target, next) {
|
|
102
|
+
for (const test of report.tests) {
|
|
103
|
+
for (const attempt of test.attempts) {
|
|
104
|
+
for (const attachment of attempt.attachments) {
|
|
105
|
+
if (attachment.path === target)
|
|
106
|
+
attachment.path = next;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
function isImage(file) {
|
|
112
|
+
return (file.contentType || '').toLowerCase().startsWith('image/');
|
|
113
|
+
}
|
|
114
|
+
async function inlineDocument(uiDir) {
|
|
115
|
+
const css = await promises_1.default.readFile(node_path_1.default.join(uiDir, 'report.css'), 'utf8');
|
|
116
|
+
const js = await promises_1.default.readFile(node_path_1.default.join(uiDir, 'report.js'), 'utf8');
|
|
117
|
+
return { css: await replaceFontFiles(css, node_path_1.default.join(uiDir, 'fonts')), js };
|
|
118
|
+
}
|
|
119
|
+
async function replaceFontFiles(css, fontDir) {
|
|
120
|
+
const names = new Set();
|
|
121
|
+
for (const match of css.matchAll(/url\("fonts\/([^"]+)"\)/g))
|
|
122
|
+
names.add(match[1]);
|
|
123
|
+
const uris = new Map();
|
|
124
|
+
for (const name of names) {
|
|
125
|
+
const body = await promises_1.default.readFile(node_path_1.default.join(fontDir, name));
|
|
126
|
+
uris.set(name, `data:font/woff2;base64,${body.toString('base64')}`);
|
|
127
|
+
}
|
|
128
|
+
return embedFontUrls(css, (file) => uris.get(file) || `fonts/${file}`);
|
|
129
|
+
}
|
|
130
|
+
async function writeReport(outputDir, report, files, uiDir, output = { inline: true, reportFileName: 'index.html' }) {
|
|
79
131
|
const stylesheet = node_path_1.default.join(uiDir, 'report.css');
|
|
80
132
|
const script = node_path_1.default.join(uiDir, 'report.js');
|
|
81
133
|
try {
|
|
@@ -88,9 +140,11 @@ async function writeReport(outputDir, report, files, uiDir) {
|
|
|
88
140
|
await (0, paths_1.prepareOutput)(outputDir);
|
|
89
141
|
const assets = node_path_1.default.join(outputDir, 'assets');
|
|
90
142
|
await promises_1.default.mkdir(node_path_1.default.join(assets, 'attachments'), { recursive: true });
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
143
|
+
if (!output.inline) {
|
|
144
|
+
await promises_1.default.copyFile(stylesheet, node_path_1.default.join(assets, 'report.css'));
|
|
145
|
+
await promises_1.default.copyFile(script, node_path_1.default.join(assets, 'report.js'));
|
|
146
|
+
await promises_1.default.cp(node_path_1.default.join(uiDir, 'fonts'), node_path_1.default.join(assets, 'fonts'), { recursive: true });
|
|
147
|
+
}
|
|
94
148
|
for (const file of files) {
|
|
95
149
|
if (await tooLarge(file)) {
|
|
96
150
|
markOmitted(report, file.target);
|
|
@@ -98,6 +152,12 @@ async function writeReport(outputDir, report, files, uiDir) {
|
|
|
98
152
|
continue;
|
|
99
153
|
}
|
|
100
154
|
try {
|
|
155
|
+
if (output.inline && isImage(file)) {
|
|
156
|
+
const body = await fileBody(file);
|
|
157
|
+
const type = file.contentType || 'image/png';
|
|
158
|
+
replacePath(report, file.target, `data:${type};base64,${body.toString('base64')}`);
|
|
159
|
+
continue;
|
|
160
|
+
}
|
|
101
161
|
await writePending(outputDir, file);
|
|
102
162
|
}
|
|
103
163
|
catch {
|
|
@@ -105,8 +165,14 @@ async function writeReport(outputDir, report, files, uiDir) {
|
|
|
105
165
|
removeAttachment(report, file.target);
|
|
106
166
|
}
|
|
107
167
|
}
|
|
108
|
-
const indexPath = node_path_1.default.join(outputDir,
|
|
109
|
-
|
|
168
|
+
const indexPath = node_path_1.default.join(outputDir, output.reportFileName);
|
|
169
|
+
const json = (0, format_1.embedJson)(report);
|
|
170
|
+
if (!output.inline) {
|
|
171
|
+
await promises_1.default.writeFile(indexPath, renderHtml(json), 'utf8');
|
|
172
|
+
return indexPath;
|
|
173
|
+
}
|
|
174
|
+
const documentAssets = await inlineDocument(uiDir);
|
|
175
|
+
await promises_1.default.writeFile(indexPath, renderHtml(json, documentAssets), 'utf8');
|
|
110
176
|
return indexPath;
|
|
111
177
|
}
|
|
112
178
|
//# sourceMappingURL=render.js.map
|
package/dist/render.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"render.js","sourceRoot":"","sources":["../src/render.ts"],"names":[],"mappings":";;;;;AAMA,
|
|
1
|
+
{"version":3,"file":"render.js","sourceRoot":"","sources":["../src/render.ts"],"names":[],"mappings":";;;;;AAMA,sCAEC;AAUD,gCAyBC;AAsFD,kCAsDC;AAvLD,gEAAkC;AAClC,0DAA6B;AAC7B,qCAAqC;AAErC,mCAAwC;AAExC,SAAgB,aAAa,CAAC,GAAW,EAAE,OAAiC;IAC1E,OAAO,GAAG,CAAC,OAAO,CAAC,0BAA0B,EAAE,CAAC,MAAM,EAAE,IAAY,EAAE,EAAE,CAAC,QAAQ,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACtG,CAAC;AAED,SAAS,WAAW,CAAC,GAAW;IAC9B,OAAO,GAAG,CAAC,OAAO,CAAC,YAAY,EAAE,WAAW,CAAC,CAAC;AAChD,CAAC;AAED,SAAS,YAAY,CAAC,MAAc;IAClC,OAAO,MAAM,CAAC,OAAO,CAAC,aAAa,EAAE,YAAY,CAAC,CAAC;AACrD,CAAC;AAED,SAAgB,UAAU,CAAC,IAAY,EAAE,MAAoC;IAC3E,MAAM,KAAK,GAAG,MAAM;QAClB,CAAC,CAAC,UAAU,WAAW,CAAC,MAAM,CAAC,GAAG,CAAC,UAAU;QAC7C,CAAC,CAAC,kDAAkD,CAAC;IACvD,MAAM,MAAM,GAAG,MAAM;QACnB,CAAC,CAAC,WAAW,YAAY,CAAC,MAAM,CAAC,EAAE,CAAC,WAAW;QAC/C,CAAC,CAAC,0CAA0C,CAAC;IAC/C,OAAO;;;;;;;EAOP,KAAK;;;;;;mDAM4C,IAAI;EACrD,MAAM;;;CAGP,CAAC;AACF,CAAC;AAED,SAAS,gBAAgB,CAAC,MAAc,EAAE,MAAc;IACtD,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;QAChC,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YACpC,OAAO,CAAC,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,UAAU,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC;QAC/F,CAAC;IACH,CAAC;AACH,CAAC;AAED,MAAM,oBAAoB,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC;AAE9C,KAAK,UAAU,QAAQ,CAAC,IAAiB;IACvC,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,oBAAoB;QAAE,OAAO,IAAI,CAAC;IACtE,IAAI,CAAC,IAAI,CAAC,UAAU;QAAE,OAAO,KAAK,CAAC;IACnC,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,kBAAE,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAC5C,OAAO,IAAI,CAAC,IAAI,GAAG,oBAAoB,CAAC;IAC1C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,SAAS,WAAW,CAAC,MAAc,EAAE,MAAc;IACjD,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;QAChC,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YACpC,KAAK,MAAM,UAAU,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;gBAC7C,IAAI,UAAU,CAAC,IAAI,KAAK,MAAM;oBAAE,SAAS;gBACzC,UAAU,CAAC,OAAO,GAAG,IAAI,CAAC;gBAC1B,UAAU,CAAC,IAAI,GAAG,EAAE,CAAC;YACvB,CAAC;QACH,CAAC;IACH,CAAC;AACH,CAAC;AAED,KAAK,UAAU,YAAY,CAAC,SAAiB,EAAE,IAAiB;IAC9D,MAAM,WAAW,GAAG,mBAAI,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;IACpE,MAAM,kBAAE,CAAC,KAAK,CAAC,mBAAI,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC/D,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;QACpB,MAAM,kBAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC;QAChD,OAAO;IACT,CAAC;IACD,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;QACd,MAAM,kBAAE,CAAC,SAAS,CAAC,WAAW,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;QAC3C,OAAO;IACT,CAAC;IACD,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAC;AACzD,CAAC;AAED,KAAK,UAAU,QAAQ,CAAC,IAAiB;IACvC,IAAI,IAAI,CAAC,IAAI;QAAE,OAAO,IAAI,CAAC,IAAI,CAAC;IAChC,IAAI,IAAI,CAAC,UAAU;QAAE,OAAO,kBAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IACzD,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAC;AACzD,CAAC;AAED,SAAS,WAAW,CAAC,MAAc,EAAE,MAAc,EAAE,IAAY;IAC/D,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;QAChC,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YACpC,KAAK,MAAM,UAAU,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;gBAC7C,IAAI,UAAU,CAAC,IAAI,KAAK,MAAM;oBAAE,UAAU,CAAC,IAAI,GAAG,IAAI,CAAC;YACzD,CAAC;QACH,CAAC;IACH,CAAC;AACH,CAAC;AAED,SAAS,OAAO,CAAC,IAAiB;IAChC,OAAO,CAAC,IAAI,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;AACrE,CAAC;AAED,KAAK,UAAU,cAAc,CAAC,KAAa;IACzC,MAAM,GAAG,GAAG,MAAM,kBAAE,CAAC,QAAQ,CAAC,mBAAI,CAAC,IAAI,CAAC,KAAK,EAAE,YAAY,CAAC,EAAE,MAAM,CAAC,CAAC;IACtE,MAAM,EAAE,GAAG,MAAM,kBAAE,CAAC,QAAQ,CAAC,mBAAI,CAAC,IAAI,CAAC,KAAK,EAAE,WAAW,CAAC,EAAE,MAAM,CAAC,CAAC;IACpE,OAAO,EAAE,GAAG,EAAE,MAAM,gBAAgB,CAAC,GAAG,EAAE,mBAAI,CAAC,IAAI,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC;AAC7E,CAAC;AAED,KAAK,UAAU,gBAAgB,CAAC,GAAW,EAAE,OAAe;IAC1D,MAAM,KAAK,GAAG,IAAI,GAAG,EAAU,CAAC;IAChC,KAAK,MAAM,KAAK,IAAI,GAAG,CAAC,QAAQ,CAAC,0BAA0B,CAAC;QAAE,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAClF,MAAM,IAAI,GAAG,IAAI,GAAG,EAAkB,CAAC;IACvC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,IAAI,GAAG,MAAM,kBAAE,CAAC,QAAQ,CAAC,mBAAI,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC;QACzD,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,0BAA0B,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;IACtE,CAAC;IACD,OAAO,aAAa,CAAC,GAAG,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,SAAS,IAAI,EAAE,CAAC,CAAC;AACzE,CAAC;AAEM,KAAK,UAAU,WAAW,CAC/B,SAAiB,EACjB,MAAc,EACd,KAAoB,EACpB,KAAa,EACb,SAAsD,EAAE,MAAM,EAAE,IAAI,EAAE,cAAc,EAAE,YAAY,EAAE;IAEpG,MAAM,UAAU,GAAG,mBAAI,CAAC,IAAI,CAAC,KAAK,EAAE,YAAY,CAAC,CAAC;IAClD,MAAM,MAAM,GAAG,mBAAI,CAAC,IAAI,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC;IAC7C,IAAI,CAAC;QACH,MAAM,kBAAE,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;QAC5B,MAAM,kBAAE,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAC1B,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,KAAK,CAAC,uEAAuE,CAAC,CAAC;IAC3F,CAAC;IAED,MAAM,IAAA,qBAAa,EAAC,SAAS,CAAC,CAAC;IAC/B,MAAM,MAAM,GAAG,mBAAI,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;IAC9C,MAAM,kBAAE,CAAC,KAAK,CAAC,mBAAI,CAAC,IAAI,CAAC,MAAM,EAAE,aAAa,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACtE,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;QACnB,MAAM,kBAAE,CAAC,QAAQ,CAAC,UAAU,EAAE,mBAAI,CAAC,IAAI,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC,CAAC;QAC/D,MAAM,kBAAE,CAAC,QAAQ,CAAC,MAAM,EAAE,mBAAI,CAAC,IAAI,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC;QAC1D,MAAM,kBAAE,CAAC,EAAE,CAAC,mBAAI,CAAC,IAAI,CAAC,KAAK,EAAE,OAAO,CAAC,EAAE,mBAAI,CAAC,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC1F,CAAC;IAED,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,MAAM,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;YACzB,WAAW,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;YACjC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,gBAAgB,IAAI,CAAC,IAAI,kCAAkC,CAAC,CAAC;YAClF,SAAS;QACX,CAAC;QACD,IAAI,CAAC;YACH,IAAI,MAAM,CAAC,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;gBACnC,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,CAAC;gBAClC,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,IAAI,WAAW,CAAC;gBAC7C,WAAW,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,QAAQ,IAAI,WAAW,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;gBACnF,SAAS;YACX,CAAC;YACD,MAAM,YAAY,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;QACtC,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,6BAA6B,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC;YAChE,gBAAgB,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;QACxC,CAAC;IACH,CAAC;IAED,MAAM,SAAS,GAAG,mBAAI,CAAC,IAAI,CAAC,SAAS,EAAE,MAAM,CAAC,cAAc,CAAC,CAAC;IAC9D,MAAM,IAAI,GAAG,IAAA,kBAAS,EAAC,MAAM,CAAC,CAAC;IAC/B,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;QACnB,MAAM,kBAAE,CAAC,SAAS,CAAC,SAAS,EAAE,UAAU,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC,CAAC;QACxD,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,MAAM,cAAc,GAAG,MAAM,cAAc,CAAC,KAAK,CAAC,CAAC;IACnD,MAAM,kBAAE,CAAC,SAAS,CAAC,SAAS,EAAE,UAAU,CAAC,IAAI,EAAE,cAAc,CAAC,EAAE,MAAM,CAAC,CAAC;IACxE,OAAO,SAAS,CAAC;AACnB,CAAC"}
|
package/dist/serialize.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { TestError } from '@playwright/test/reporter';
|
|
2
|
-
import type { Accent, Attempt, PendingFile, Report, ReportError, RunStatus, ShotMode, StepDetail } from './model';
|
|
2
|
+
import type { Accent, Attempt, InfoRow, PendingFile, Report, ReportError, RunStatus, ShotMode, StepDetail } from './model';
|
|
3
3
|
export type SourceSuite = {
|
|
4
4
|
title: string;
|
|
5
5
|
type: 'root' | 'project' | 'file' | 'describe';
|
|
@@ -80,6 +80,7 @@ export type BuildInput = {
|
|
|
80
80
|
showLogs?: boolean;
|
|
81
81
|
showFiles?: boolean;
|
|
82
82
|
overview?: 'chart' | 'timeline';
|
|
83
|
+
info?: InfoRow[];
|
|
83
84
|
};
|
|
84
85
|
export declare function buildReport(input: BuildInput): {
|
|
85
86
|
report: Report;
|
package/dist/serialize.js
CHANGED
|
@@ -62,7 +62,8 @@ function mapSteps(steps, rootDir, depth, detail) {
|
|
|
62
62
|
for (const step of steps) {
|
|
63
63
|
const kids = mapSteps(step.steps, rootDir, depth + 1, detail);
|
|
64
64
|
const hide = detail === 'user' && (step.category === 'pw:api' || step.category === 'fixture');
|
|
65
|
-
|
|
65
|
+
const quietHook = detail === 'user' && step.category === 'hook' && !step.error;
|
|
66
|
+
if (hide || quietHook) {
|
|
66
67
|
mapped.push(...kids);
|
|
67
68
|
continue;
|
|
68
69
|
}
|
|
@@ -147,6 +148,7 @@ function buildReport(input) {
|
|
|
147
148
|
files.push({
|
|
148
149
|
name: parsed.name,
|
|
149
150
|
target,
|
|
151
|
+
contentType: attachment.contentType,
|
|
150
152
|
sourcePath: attachment.path,
|
|
151
153
|
body: attachment.body,
|
|
152
154
|
});
|
|
@@ -208,7 +210,7 @@ function buildReport(input) {
|
|
|
208
210
|
playwrightVersion: input.playwrightVersion,
|
|
209
211
|
status: input.status,
|
|
210
212
|
word: (0, status_1.outcomeWord)(input.status),
|
|
211
|
-
company: (input.company || '
|
|
213
|
+
company: (input.company || input.projectName || 'Report').trim() || 'Report',
|
|
212
214
|
accent: input.accent || 'green',
|
|
213
215
|
showLogs: input.showLogs !== false,
|
|
214
216
|
showFiles: input.showFiles !== false,
|
|
@@ -217,6 +219,7 @@ function buildReport(input) {
|
|
|
217
219
|
startTime: input.startTime.toISOString(),
|
|
218
220
|
duration: input.duration,
|
|
219
221
|
projectName: input.projectName,
|
|
222
|
+
info: input.info || [],
|
|
220
223
|
projects: input.projects,
|
|
221
224
|
workers: input.workers,
|
|
222
225
|
shard: input.shard,
|
package/dist/serialize.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"serialize.js","sourceRoot":"","sources":["../src/serialize.ts"],"names":[],"mappings":";;;;;
|
|
1
|
+
{"version":3,"file":"serialize.js","sourceRoot":"","sources":["../src/serialize.ts"],"names":[],"mappings":"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"}
|
package/dist/ui/report.css
CHANGED
|
@@ -244,6 +244,41 @@ button { cursor: pointer; }
|
|
|
244
244
|
font-weight: 400;
|
|
245
245
|
}
|
|
246
246
|
|
|
247
|
+
.info {
|
|
248
|
+
display: grid;
|
|
249
|
+
grid-template-columns: repeat(auto-fill, minmax(220px, 1fr));
|
|
250
|
+
gap: 10px 18px;
|
|
251
|
+
margin: 0 0 8px;
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
.info-row { margin: 0; }
|
|
255
|
+
.info dt { color: var(--subtle); font-size: 12px; }
|
|
256
|
+
.info dd { margin: 2px 0 0; font-size: 14px; }
|
|
257
|
+
|
|
258
|
+
.tags {
|
|
259
|
+
display: flex;
|
|
260
|
+
flex-wrap: wrap;
|
|
261
|
+
gap: 8px 14px;
|
|
262
|
+
align-items: baseline;
|
|
263
|
+
margin-top: 12px;
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
.tag-btn,
|
|
267
|
+
.project-btn {
|
|
268
|
+
background: none;
|
|
269
|
+
border: 0;
|
|
270
|
+
padding: 0;
|
|
271
|
+
color: var(--subtle);
|
|
272
|
+
font-size: 14px;
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
.tag-btn[aria-pressed="true"],
|
|
276
|
+
.project-btn[aria-pressed="true"] {
|
|
277
|
+
color: var(--text);
|
|
278
|
+
font-weight: 500;
|
|
279
|
+
box-shadow: inset 0 -1px 0 var(--accent);
|
|
280
|
+
}
|
|
281
|
+
|
|
247
282
|
.banner {
|
|
248
283
|
margin-top: 22px;
|
|
249
284
|
border-left: 1px solid var(--accent);
|
package/dist/ui/report.js
CHANGED
|
@@ -29,6 +29,8 @@
|
|
|
29
29
|
listLimit: 200,
|
|
30
30
|
shotFilter: 'all',
|
|
31
31
|
logQuery: '',
|
|
32
|
+
tag: 'all',
|
|
33
|
+
projectFilter: 'all',
|
|
32
34
|
overview: data.overview === 'timeline' ? 'timeline' : 'chart',
|
|
33
35
|
order: 'grouped',
|
|
34
36
|
band: 'all',
|
|
@@ -163,7 +165,7 @@
|
|
|
163
165
|
|
|
164
166
|
function companyName() {
|
|
165
167
|
var name = typeof data.company === 'string' ? data.company.trim() : '';
|
|
166
|
-
return name || '
|
|
168
|
+
return name || 'Report';
|
|
167
169
|
}
|
|
168
170
|
|
|
169
171
|
function accentName() {
|
|
@@ -250,6 +252,7 @@
|
|
|
250
252
|
'<p class="time" id="time"></p>',
|
|
251
253
|
'</header>',
|
|
252
254
|
'<div id="errors"></div>',
|
|
255
|
+
'<dl class="info" id="info"></dl>',
|
|
253
256
|
'<section class="console">',
|
|
254
257
|
'<div class="console-body">',
|
|
255
258
|
'<p class="section-label">Results</p>',
|
|
@@ -272,6 +275,7 @@
|
|
|
272
275
|
document.getElementById('summary').textContent = data.summary || '';
|
|
273
276
|
countUp(document.getElementById('time'), data.duration || 0, formatDuration);
|
|
274
277
|
paintErrors();
|
|
278
|
+
paintInfo();
|
|
275
279
|
paintCounts(document.getElementById('legend'), false);
|
|
276
280
|
paintDuration();
|
|
277
281
|
paintStrip();
|
|
@@ -279,6 +283,22 @@
|
|
|
279
283
|
showNow(state.selectedId);
|
|
280
284
|
}
|
|
281
285
|
|
|
286
|
+
function paintInfo() {
|
|
287
|
+
var host = document.getElementById('info');
|
|
288
|
+
if (!host) return;
|
|
289
|
+
var rows = Array.isArray(data.info) ? data.info : [];
|
|
290
|
+
if (!rows.length) {
|
|
291
|
+
host.hidden = true;
|
|
292
|
+
return;
|
|
293
|
+
}
|
|
294
|
+
fill(host, rows.map(function (row) {
|
|
295
|
+
return el('div', { class: 'info-row' }, [
|
|
296
|
+
el('dt', null, [row.label]),
|
|
297
|
+
el('dd', null, [row.value]),
|
|
298
|
+
]);
|
|
299
|
+
}));
|
|
300
|
+
}
|
|
301
|
+
|
|
282
302
|
function bandLabel(id) {
|
|
283
303
|
var found = BANDS.find(function (band) { return band[0] === id; });
|
|
284
304
|
return found ? found[1] : '';
|
|
@@ -505,6 +525,45 @@
|
|
|
505
525
|
});
|
|
506
526
|
}
|
|
507
527
|
|
|
528
|
+
function uniqueValues(pick) {
|
|
529
|
+
var seen = {};
|
|
530
|
+
data.tests.forEach(function (test) {
|
|
531
|
+
pick(test).forEach(function (value) {
|
|
532
|
+
if (value) seen[value] = true;
|
|
533
|
+
});
|
|
534
|
+
});
|
|
535
|
+
return Object.keys(seen).sort();
|
|
536
|
+
}
|
|
537
|
+
|
|
538
|
+
function paintTags() {
|
|
539
|
+
var host = document.getElementById('tags');
|
|
540
|
+
if (!host) return;
|
|
541
|
+
var tags = uniqueValues(function (test) { return test.tags || []; });
|
|
542
|
+
var projects = uniqueValues(function (test) { return test.project ? [test.project] : []; });
|
|
543
|
+
var nodes = [];
|
|
544
|
+
if (tags.length) {
|
|
545
|
+
nodes.push(el('span', { class: 'order-label' }, ['Tags']));
|
|
546
|
+
nodes.push(chip('tag-btn', 'all', 'All', state.tag));
|
|
547
|
+
tags.forEach(function (tag) { nodes.push(chip('tag-btn', tag, tag, state.tag)); });
|
|
548
|
+
}
|
|
549
|
+
if (projects.length > 1) {
|
|
550
|
+
nodes.push(el('span', { class: 'order-label' }, ['Project']));
|
|
551
|
+
nodes.push(chip('project-btn', 'all', 'All', state.projectFilter));
|
|
552
|
+
projects.forEach(function (project) { nodes.push(chip('project-btn', project, project, state.projectFilter)); });
|
|
553
|
+
}
|
|
554
|
+
host.hidden = nodes.length === 0;
|
|
555
|
+
fill(host, nodes);
|
|
556
|
+
}
|
|
557
|
+
|
|
558
|
+
function chip(className, value, label, current) {
|
|
559
|
+
return el('button', {
|
|
560
|
+
class: className,
|
|
561
|
+
type: 'button',
|
|
562
|
+
'data-value': value,
|
|
563
|
+
'aria-pressed': current === value ? 'true' : 'false',
|
|
564
|
+
}, [label]);
|
|
565
|
+
}
|
|
566
|
+
|
|
508
567
|
function sortTests(tests) {
|
|
509
568
|
var copy = tests.slice();
|
|
510
569
|
if (state.order === 'fastest') {
|
|
@@ -541,8 +600,9 @@
|
|
|
541
600
|
if (built.tests) return;
|
|
542
601
|
built.tests = true;
|
|
543
602
|
var host = document.getElementById('panel-tests');
|
|
544
|
-
host.innerHTML = '<div class="legend" id="test-tools"></div><div class="order" id="order"></div><div class="split"><div id="tests"></div><section class="detail" id="detail"></section></div>';
|
|
603
|
+
host.innerHTML = '<div class="legend" id="test-tools"></div><div class="tags" id="tags"></div><div class="order" id="order"></div><div class="split"><div id="tests"></div><section class="detail" id="detail"></section></div>';
|
|
545
604
|
paintCounts(document.getElementById('test-tools'), true);
|
|
605
|
+
paintTags();
|
|
546
606
|
paintOrder();
|
|
547
607
|
paintList();
|
|
548
608
|
paintDetail();
|
|
@@ -946,6 +1006,26 @@
|
|
|
946
1006
|
paintDetail();
|
|
947
1007
|
return;
|
|
948
1008
|
}
|
|
1009
|
+
var tag = target.closest('.tag-btn');
|
|
1010
|
+
if (tag) {
|
|
1011
|
+
state.tag = tag.dataset.value || 'all';
|
|
1012
|
+
state.listLimit = 200;
|
|
1013
|
+
keepSelectionInFilter();
|
|
1014
|
+
paintTags();
|
|
1015
|
+
paintList();
|
|
1016
|
+
paintDetail();
|
|
1017
|
+
return;
|
|
1018
|
+
}
|
|
1019
|
+
var projectButton = target.closest('.project-btn');
|
|
1020
|
+
if (projectButton) {
|
|
1021
|
+
state.projectFilter = projectButton.dataset.value || 'all';
|
|
1022
|
+
state.listLimit = 200;
|
|
1023
|
+
keepSelectionInFilter();
|
|
1024
|
+
paintTags();
|
|
1025
|
+
paintList();
|
|
1026
|
+
paintDetail();
|
|
1027
|
+
return;
|
|
1028
|
+
}
|
|
949
1029
|
var order = target.closest('.order-btn');
|
|
950
1030
|
if (order) {
|
|
951
1031
|
state.order = order.dataset.order || 'grouped';
|
|
@@ -1102,6 +1182,8 @@
|
|
|
1102
1182
|
state.filter = 'all';
|
|
1103
1183
|
state.query = '';
|
|
1104
1184
|
state.band = 'all';
|
|
1185
|
+
state.tag = 'all';
|
|
1186
|
+
state.projectFilter = 'all';
|
|
1105
1187
|
var find = document.getElementById('find');
|
|
1106
1188
|
if (find) find.value = '';
|
|
1107
1189
|
}
|
|
@@ -1114,6 +1196,7 @@
|
|
|
1114
1196
|
showTab('tests');
|
|
1115
1197
|
if (built.tests) {
|
|
1116
1198
|
syncPressed();
|
|
1199
|
+
paintTags();
|
|
1117
1200
|
paintOrder();
|
|
1118
1201
|
paintList();
|
|
1119
1202
|
paintDetail();
|
|
@@ -1144,6 +1227,8 @@
|
|
|
1144
1227
|
state.filter = 'all';
|
|
1145
1228
|
state.query = '';
|
|
1146
1229
|
state.band = 'all';
|
|
1230
|
+
state.tag = 'all';
|
|
1231
|
+
state.projectFilter = 'all';
|
|
1147
1232
|
var find = document.getElementById('find');
|
|
1148
1233
|
if (find) find.value = '';
|
|
1149
1234
|
state.selectedId = id;
|
|
@@ -1151,6 +1236,7 @@
|
|
|
1151
1236
|
state.testPane = 'shots';
|
|
1152
1237
|
showTab('tests');
|
|
1153
1238
|
if (built.tests) {
|
|
1239
|
+
paintTags();
|
|
1154
1240
|
paintOrder();
|
|
1155
1241
|
paintList();
|
|
1156
1242
|
paintDetail();
|
|
@@ -1191,6 +1277,8 @@
|
|
|
1191
1277
|
var query = state.query.trim().toLowerCase();
|
|
1192
1278
|
return data.tests.filter(function (test) {
|
|
1193
1279
|
if (state.filter !== 'all' && test.status !== state.filter) return false;
|
|
1280
|
+
if (state.tag !== 'all' && (test.tags || []).indexOf(state.tag) === -1) return false;
|
|
1281
|
+
if (state.projectFilter !== 'all' && test.project !== state.projectFilter) return false;
|
|
1194
1282
|
if (state.band !== 'all' && (test.status === 'skipped' || durationBand(test.duration) !== state.band)) return false;
|
|
1195
1283
|
if (!query) return true;
|
|
1196
1284
|
var blob = [test.title, test.file, test.project].concat(test.group || [], test.tags || []).join(' ').toLowerCase();
|
|
@@ -1266,6 +1354,7 @@
|
|
|
1266
1354
|
|
|
1267
1355
|
function safeSrc(value) {
|
|
1268
1356
|
if (typeof value !== 'string' || !value) return '';
|
|
1357
|
+
if (value.indexOf('data:image/') === 0 && value.indexOf(' ') === -1) return value;
|
|
1269
1358
|
if (!value.startsWith('assets/attachments/')) return '';
|
|
1270
1359
|
if (value.indexOf('..') !== -1 || value.indexOf('\\') !== -1 || value.indexOf('://') !== -1) return '';
|
|
1271
1360
|
return value;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "playwright-reborn",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.2.0",
|
|
4
4
|
"description": "A Playwright reporter that writes one self-contained HTML report when the run finishes.",
|
|
5
5
|
"main": "./dist/index.js",
|
|
6
6
|
"types": "./dist/index.d.ts",
|
|
@@ -11,6 +11,8 @@
|
|
|
11
11
|
},
|
|
12
12
|
"./fixture": {
|
|
13
13
|
"types": "./dist/fixture.d.ts",
|
|
14
|
+
"import": "./dist/fixture.js",
|
|
15
|
+
"require": "./dist/fixture.js",
|
|
14
16
|
"default": "./dist/fixture.js"
|
|
15
17
|
}
|
|
16
18
|
},
|
|
@@ -25,7 +27,7 @@
|
|
|
25
27
|
"build": "tsc -p tsconfig.json && node scripts/copy-assets.mjs",
|
|
26
28
|
"prepare": "npm run build",
|
|
27
29
|
"prepublishOnly": "npm test",
|
|
28
|
-
"test": "npm run build && node --test dist/format.test.js dist/status.test.js dist/options.test.js dist/paths.test.js dist/serialize.test.js",
|
|
30
|
+
"test": "npm run build && node --test dist/format.test.js dist/status.test.js dist/options.test.js dist/paths.test.js dist/serialize.test.js dist/info.test.js dist/context.test.js dist/render.test.js",
|
|
29
31
|
"demo": "npm run build && playwright test",
|
|
30
32
|
"verify": "npm run demo; node scripts/verify-ui.mjs"
|
|
31
33
|
},
|