playwright-reborn 0.1.0 → 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md ADDED
@@ -0,0 +1,23 @@
1
+ # Changelog
2
+
3
+ ## 0.2.1
4
+
5
+ - The Timeline view no longer keeps the duration chart on screen.
6
+ - Run info lines up to the left.
7
+ - A file row names the kind once and links the file.
8
+ - Font license files are written to `assets/fonts/` even when the HTML file is self-contained.
9
+
10
+ ## 0.2.0
11
+
12
+ - `step()` returns the value of its body.
13
+ - Screenshots stay on the test that took them when tests run in parallel.
14
+ - The report is one HTML file by default. CSS, the page script, fonts, and screenshots are inside it.
15
+ - The overview lists run metadata: suite, user, environment, state, defects, base URL, branch, commit, projects, workers, shard, and Playwright version.
16
+ - Tests can be filtered by tag and by project.
17
+ - `steps: 'user'` leaves hooks and Playwright's own API calls out of the step tree.
18
+ - The company title is the name you pass. If you omit it, the title is the project folder name.
19
+ - `showLogs` and `showFiles` still default to on. Set either to `false` to leave that page out.
20
+
21
+ ## 0.1.0
22
+
23
+ - First npm release of the end-of-run HTML reporter.
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: 'Sandata',
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` | `Sandata` | Any name. This is the large title. It does not change when a run fails. |
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. `all` also keeps Playwright's own API calls. |
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,17 +84,40 @@ 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
- await expect(page.locator('#order')).toHaveText('1842');
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.
83
120
 
84
- Geist and JetBrains Mono are included under the SIL Open Font License. Those license files are copied into each report.
121
+ Geist and JetBrains Mono are included under the SIL Open Font License. With `inline: true`, the fonts are embedded in the HTML file. The license files are still written to `assets/fonts/` in the report folder.
122
+
123
+ Release notes are in `CHANGELOG.md`.
@@ -0,0 +1,4 @@
1
+ import type { Page, TestInfo } from '@playwright/test';
2
+ export declare function rememberPage(testInfo: TestInfo, page: Page): void;
3
+ export declare function forgetPage(testInfo: TestInfo): void;
4
+ export declare function pageFor(testInfo: TestInfo): Page | undefined;
@@ -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"}
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<void>): Promise<void>;
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
- let activePage;
8
- let activeInfo;
9
- async function shot(name) {
10
- if (!activePage || !activeInfo)
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 activePage.screenshot({ timeout: 5_000 });
14
- await activeInfo.attach(name, { body, contentType: 'image/png' });
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
- activePage = page;
23
- activeInfo = testInfo;
34
+ (0, context_1.rememberPage)(testInfo, page);
24
35
  try {
25
36
  await use(page);
26
- const mode = process.env.REBORN_SCREENSHOTS || 'failure';
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
- activePage = undefined;
35
- activeInfo = undefined;
45
+ (0, context_1.forgetPage)(testInfo);
36
46
  }
37
47
  },
38
48
  });
39
49
  async function step(title, body) {
40
- await exports.test.step(title, async () => {
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 (process.env.REBORN_SCREENSHOTS === 'steps')
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
@@ -1 +1 @@
1
- {"version":3,"file":"fixture.js","sourceRoot":"","sources":["../src/fixture.ts"],"names":[],"mappings":";;;AAkCA,oBAUC;AA5CD,2CAAkF;AAgCzE,uFAhCc,aAAM,OAgCd;AA9Bf,IAAI,UAA4B,CAAC;AACjC,IAAI,UAAgC,CAAC;AAErC,KAAK,UAAU,IAAI,CAAC,IAAY;IAC9B,IAAI,CAAC,UAAU,IAAI,CAAC,UAAU;QAAE,OAAO;IACvC,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,UAAU,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;QAC7D,MAAM,UAAU,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,WAAW,EAAE,CAAC,CAAC;IACpE,CAAC;IAAC,MAAM,CAAC;QACP,iDAAiD;IACnD,CAAC;AACH,CAAC;AAEY,QAAA,IAAI,GAAG,WAAI,CAAC,MAAM,CAAC;IAC9B,IAAI,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,QAAQ,EAAE,EAAE;QACtC,UAAU,GAAG,IAAI,CAAC;QAClB,UAAU,GAAG,QAAQ,CAAC;QACtB,IAAI,CAAC;YACH,MAAM,GAAG,CAAC,IAAI,CAAC,CAAC;YAChB,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,kBAAkB,IAAI,SAAS,CAAC;YACzD,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,CAAC,CAAC;YAChF,IAAI,CAAC,IAAI,KAAK,SAAS,IAAI,IAAI,KAAK,OAAO,CAAC,IAAI,MAAM;gBAAE,MAAM,IAAI,CAAC,gBAAgB,CAAC,CAAC;QACvF,CAAC;gBAAS,CAAC;YACT,UAAU,GAAG,SAAS,CAAC;YACvB,UAAU,GAAG,SAAS,CAAC;QACzB,CAAC;IACH,CAAC;CACF,CAAC,CAAC;AAII,KAAK,UAAU,IAAI,CAAC,KAAa,EAAE,IAAyB;IACjE,MAAM,YAAI,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,IAAI,EAAE;QAChC,IAAI,CAAC;YACH,MAAM,IAAI,EAAE,CAAC;QACf,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,OAAO,CAAC,GAAG,CAAC,kBAAkB,KAAK,OAAO;gBAAE,MAAM,IAAI,CAAC,eAAe,KAAK,EAAE,CAAC,CAAC;YACnF,MAAM,KAAK,CAAC;QACd,CAAC;QACD,IAAI,OAAO,CAAC,GAAG,CAAC,kBAAkB,KAAK,OAAO;YAAE,MAAM,IAAI,CAAC,eAAe,KAAK,EAAE,CAAC,CAAC;IACrF,CAAC,CAAC,CAAC;AACL,CAAC"}
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
@@ -11,6 +11,8 @@ declare class RebornReporter implements Reporter {
11
11
  printsToStdio(): boolean;
12
12
  onEnd(result: FullResult): Promise<void>;
13
13
  private outputBase;
14
+ private metadata;
15
+ private runInfo;
14
16
  private folderFor;
15
17
  private finish;
16
18
  }
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":"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"}
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
@@ -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 ?? 'Sandata';
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
- return { outputFolder, outputExplicit, open, screenshots, steps, company: company.trim(), accent, showLogs, showFiles, overview };
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)
@@ -1 +1 @@
1
- {"version":3,"file":"options.js","sourceRoot":"","sources":["../src/options.ts"],"names":[],"mappings":"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"}
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 renderHtml(json: string): string;
3
- export declare function writeReport(outputDir: string, report: Report, files: PendingFile[], uiDir: string): Promise<string>;
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 renderHtml(json) {
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
- <link rel="stylesheet" href="assets/report.css">
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
- <script src="assets/report.js"></script>
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 writeReport(outputDir, report, files, uiDir) {
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,15 @@ 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
- await promises_1.default.copyFile(stylesheet, node_path_1.default.join(assets, 'report.css'));
92
- await promises_1.default.copyFile(script, node_path_1.default.join(assets, 'report.js'));
93
- await promises_1.default.cp(node_path_1.default.join(uiDir, 'fonts'), node_path_1.default.join(assets, 'fonts'), { recursive: true });
143
+ await promises_1.default.mkdir(node_path_1.default.join(assets, 'fonts'), { recursive: true });
144
+ for (const license of ['Geist-OFL.txt', 'JetBrainsMono-OFL.txt']) {
145
+ await promises_1.default.copyFile(node_path_1.default.join(uiDir, 'fonts', license), node_path_1.default.join(assets, 'fonts', license));
146
+ }
147
+ if (!output.inline) {
148
+ await promises_1.default.copyFile(stylesheet, node_path_1.default.join(assets, 'report.css'));
149
+ await promises_1.default.copyFile(script, node_path_1.default.join(assets, 'report.js'));
150
+ await promises_1.default.cp(node_path_1.default.join(uiDir, 'fonts'), node_path_1.default.join(assets, 'fonts'), { recursive: true });
151
+ }
94
152
  for (const file of files) {
95
153
  if (await tooLarge(file)) {
96
154
  markOmitted(report, file.target);
@@ -98,6 +156,12 @@ async function writeReport(outputDir, report, files, uiDir) {
98
156
  continue;
99
157
  }
100
158
  try {
159
+ if (output.inline && isImage(file)) {
160
+ const body = await fileBody(file);
161
+ const type = file.contentType || 'image/png';
162
+ replacePath(report, file.target, `data:${type};base64,${body.toString('base64')}`);
163
+ continue;
164
+ }
101
165
  await writePending(outputDir, file);
102
166
  }
103
167
  catch {
@@ -105,8 +169,14 @@ async function writeReport(outputDir, report, files, uiDir) {
105
169
  removeAttachment(report, file.target);
106
170
  }
107
171
  }
108
- const indexPath = node_path_1.default.join(outputDir, 'index.html');
109
- await promises_1.default.writeFile(indexPath, renderHtml((0, format_1.embedJson)(report)), 'utf8');
172
+ const indexPath = node_path_1.default.join(outputDir, output.reportFileName);
173
+ const json = (0, format_1.embedJson)(report);
174
+ if (!output.inline) {
175
+ await promises_1.default.writeFile(indexPath, renderHtml(json), 'utf8');
176
+ return indexPath;
177
+ }
178
+ const documentAssets = await inlineDocument(uiDir);
179
+ await promises_1.default.writeFile(indexPath, renderHtml(json, documentAssets), 'utf8');
110
180
  return indexPath;
111
181
  }
112
182
  //# sourceMappingURL=render.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"render.js","sourceRoot":"","sources":["../src/render.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"render.js","sourceRoot":"","sources":["../src/render.ts"],"names":[],"mappings":"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"}
@@ -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
- if (hide) {
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 || 'Sandata').trim() || 'Sandata',
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,
@@ -1 +1 @@
1
- {"version":3,"file":"serialize.js","sourceRoot":"","sources":["../src/serialize.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"serialize.js","sourceRoot":"","sources":["../src/serialize.ts"],"names":[],"mappings":"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"}
@@ -87,6 +87,8 @@ body[data-accent="violet"] {
87
87
 
88
88
  * { box-sizing: border-box; }
89
89
 
90
+ [hidden] { display: none !important; }
91
+
90
92
  body {
91
93
  margin: 0;
92
94
  background: #050806;
@@ -244,6 +246,47 @@ button { cursor: pointer; }
244
246
  font-weight: 400;
245
247
  }
246
248
 
249
+ .info {
250
+ display: grid;
251
+ grid-template-columns: repeat(auto-fill, minmax(220px, 1fr));
252
+ gap: 10px 18px;
253
+ margin: 0 0 8px;
254
+ }
255
+
256
+ .info-row {
257
+ display: flex;
258
+ flex-direction: column;
259
+ align-items: flex-start;
260
+ margin: 0;
261
+ text-align: left;
262
+ }
263
+ .info dt { color: var(--subtle); font-size: 12px; }
264
+ .info dd { margin: 2px 0 0; font-size: 14px; }
265
+
266
+ .tags {
267
+ display: flex;
268
+ flex-wrap: wrap;
269
+ gap: 8px 14px;
270
+ align-items: baseline;
271
+ margin-top: 12px;
272
+ }
273
+
274
+ .tag-btn,
275
+ .project-btn {
276
+ background: none;
277
+ border: 0;
278
+ padding: 0;
279
+ color: var(--subtle);
280
+ font-size: 14px;
281
+ }
282
+
283
+ .tag-btn[aria-pressed="true"],
284
+ .project-btn[aria-pressed="true"] {
285
+ color: var(--text);
286
+ font-weight: 500;
287
+ box-shadow: inset 0 -1px 0 var(--accent);
288
+ }
289
+
247
290
  .banner {
248
291
  margin-top: 22px;
249
292
  border-left: 1px solid var(--accent);
@@ -975,7 +1018,7 @@ dialog::backdrop { background: rgba(8, 8, 8, 0.92); }
975
1018
  pointer-events: none;
976
1019
  }
977
1020
 
978
- .rail .meta { margin: 0 0 0 auto; flex-direction: row; gap: 16px; }
1021
+ .rail .meta { margin: 0 0 0 auto; flex-direction: row; gap: 16px; justify-content: flex-end; max-width: 46%; text-align: right; }
979
1022
 
980
1023
  .rail .tabbar {
981
1024
  flex-direction: row;
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 || 'Sandata';
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();
@@ -872,7 +932,7 @@
872
932
  (test.attempts || []).forEach(function (attempt, index) {
873
933
  (attempt.attachments || []).forEach(function (file) {
874
934
  if (file.kind === 'image') return;
875
- var label = file.kind === 'trace' ? 'Trace' : file.kind === 'video' ? 'Video' : (file.name || 'File');
935
+ var label = file.kind === 'trace' ? 'Trace' : file.kind === 'video' ? 'Video' : 'File';
876
936
  var line = [el('span', { class: 'file-kind' }, [label])];
877
937
  if ((test.attempts || []).length > 1) line.push(el('span', { class: 'now-file' }, ['Attempt ' + (index + 1)]));
878
938
  if (file.omitted || !safeSrc(file.path)) {
@@ -881,7 +941,8 @@
881
941
  line.push(el('video', { class: 'video', controls: 'true', preload: 'metadata', src: safeSrc(file.path) }));
882
942
  } else {
883
943
  var href = safeSrc(file.path);
884
- line.push(el('a', { class: 'file-link', href: href, download: '' }, [file.name || 'Download']));
944
+ var linkText = file.kind === 'trace' ? 'Download' : (file.name || 'Download');
945
+ line.push(el('a', { class: 'file-link', href: href, download: '' }, [linkText]));
885
946
  if (file.kind === 'trace') {
886
947
  line.push(el('span', { class: 'now-file' }, ['npx playwright show-trace ' + href]));
887
948
  }
@@ -946,6 +1007,26 @@
946
1007
  paintDetail();
947
1008
  return;
948
1009
  }
1010
+ var tag = target.closest('.tag-btn');
1011
+ if (tag) {
1012
+ state.tag = tag.dataset.value || 'all';
1013
+ state.listLimit = 200;
1014
+ keepSelectionInFilter();
1015
+ paintTags();
1016
+ paintList();
1017
+ paintDetail();
1018
+ return;
1019
+ }
1020
+ var projectButton = target.closest('.project-btn');
1021
+ if (projectButton) {
1022
+ state.projectFilter = projectButton.dataset.value || 'all';
1023
+ state.listLimit = 200;
1024
+ keepSelectionInFilter();
1025
+ paintTags();
1026
+ paintList();
1027
+ paintDetail();
1028
+ return;
1029
+ }
949
1030
  var order = target.closest('.order-btn');
950
1031
  if (order) {
951
1032
  state.order = order.dataset.order || 'grouped';
@@ -1102,6 +1183,8 @@
1102
1183
  state.filter = 'all';
1103
1184
  state.query = '';
1104
1185
  state.band = 'all';
1186
+ state.tag = 'all';
1187
+ state.projectFilter = 'all';
1105
1188
  var find = document.getElementById('find');
1106
1189
  if (find) find.value = '';
1107
1190
  }
@@ -1114,6 +1197,7 @@
1114
1197
  showTab('tests');
1115
1198
  if (built.tests) {
1116
1199
  syncPressed();
1200
+ paintTags();
1117
1201
  paintOrder();
1118
1202
  paintList();
1119
1203
  paintDetail();
@@ -1144,6 +1228,8 @@
1144
1228
  state.filter = 'all';
1145
1229
  state.query = '';
1146
1230
  state.band = 'all';
1231
+ state.tag = 'all';
1232
+ state.projectFilter = 'all';
1147
1233
  var find = document.getElementById('find');
1148
1234
  if (find) find.value = '';
1149
1235
  state.selectedId = id;
@@ -1151,6 +1237,7 @@
1151
1237
  state.testPane = 'shots';
1152
1238
  showTab('tests');
1153
1239
  if (built.tests) {
1240
+ paintTags();
1154
1241
  paintOrder();
1155
1242
  paintList();
1156
1243
  paintDetail();
@@ -1191,6 +1278,8 @@
1191
1278
  var query = state.query.trim().toLowerCase();
1192
1279
  return data.tests.filter(function (test) {
1193
1280
  if (state.filter !== 'all' && test.status !== state.filter) return false;
1281
+ if (state.tag !== 'all' && (test.tags || []).indexOf(state.tag) === -1) return false;
1282
+ if (state.projectFilter !== 'all' && test.project !== state.projectFilter) return false;
1194
1283
  if (state.band !== 'all' && (test.status === 'skipped' || durationBand(test.duration) !== state.band)) return false;
1195
1284
  if (!query) return true;
1196
1285
  var blob = [test.title, test.file, test.project].concat(test.group || [], test.tags || []).join(' ').toLowerCase();
@@ -1266,6 +1355,7 @@
1266
1355
 
1267
1356
  function safeSrc(value) {
1268
1357
  if (typeof value !== 'string' || !value) return '';
1358
+ if (value.indexOf('data:image/') === 0 && value.indexOf(' ') === -1) return value;
1269
1359
  if (!value.startsWith('assets/attachments/')) return '';
1270
1360
  if (value.indexOf('..') !== -1 || value.indexOf('\\') !== -1 || value.indexOf('://') !== -1) return '';
1271
1361
  return value;
package/package.json CHANGED
@@ -1,16 +1,20 @@
1
1
  {
2
2
  "name": "playwright-reborn",
3
- "version": "0.1.0",
3
+ "version": "0.2.1",
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",
7
7
  "exports": {
8
8
  ".": {
9
9
  "types": "./dist/index.d.ts",
10
+ "import": "./dist/index.js",
11
+ "require": "./dist/index.js",
10
12
  "default": "./dist/index.js"
11
13
  },
12
14
  "./fixture": {
13
15
  "types": "./dist/fixture.d.ts",
16
+ "import": "./dist/fixture.js",
17
+ "require": "./dist/fixture.js",
14
18
  "default": "./dist/fixture.js"
15
19
  }
16
20
  },
@@ -19,13 +23,17 @@
19
23
  "!dist/**/*.test.js",
20
24
  "!dist/**/*.test.d.ts",
21
25
  "!dist/**/*.test.js.map",
22
- "README.md"
26
+ "!dist/fixture-types.js",
27
+ "!dist/fixture-types.d.ts",
28
+ "!dist/fixture-types.js.map",
29
+ "README.md",
30
+ "CHANGELOG.md"
23
31
  ],
24
32
  "scripts": {
25
33
  "build": "tsc -p tsconfig.json && node scripts/copy-assets.mjs",
26
34
  "prepare": "npm run build",
27
35
  "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",
36
+ "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
37
  "demo": "npm run build && playwright test",
30
38
  "verify": "npm run demo; node scripts/verify-ui.mjs"
31
39
  },