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 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,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
- 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.
@@ -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"}
@@ -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<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,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
- 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
+ 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, 'index.html');
109
- await promises_1.default.writeFile(indexPath, renderHtml((0, format_1.embedJson)(report)), 'utf8');
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
@@ -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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"}
@@ -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 || '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();
@@ -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.1.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
  },