@flakiness/playwright 1.3.2 → 1.4.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
@@ -1,3 +1,5 @@
1
+ [![Tests](https://img.shields.io/endpoint?url=https%3A%2F%2Fflakiness.io%2Fapi%2Fbadge%3Finput%3D%257B%2522badgeToken%2522%253A%2522badge-5VBxhivD3vj6ItXSEL9heM%2522%257D)](https://flakiness.io/flakiness/playwright)
2
+
1
3
  # Flakiness.io Playwright Reporter
2
4
 
3
5
  A custom Playwright test reporter that generates Flakiness Reports from your Playwright test runs. The reporter automatically converts Playwright test results into the standardized [Flakiness JSON format](https://github.com/flakiness/flakiness-report), capturing test outcomes, attachments, system utilization, and environment information.
@@ -20,6 +22,7 @@ A custom Playwright test reporter that generates Flakiness Reports from your Pla
20
22
  - [`outputFolder?: string`](#outputfolder-string)
21
23
  - [`open?: 'always' | 'never' | 'on-failure'`](#open-always--never--on-failure)
22
24
  - [`collectBrowserVersions?: boolean`](#collectbrowserversions-boolean)
25
+ - [`disableUpload?: boolean`](#disableupload-boolean)
23
26
  - [Environment Variables](#environment-variables)
24
27
  - [Example Configuration](#example-configuration)
25
28
 
@@ -202,6 +205,16 @@ reporter: [
202
205
  ]
203
206
  ```
204
207
 
208
+ ### `disableUpload?: boolean`
209
+
210
+ When set to `true`, the reporter will skip uploading the report to Flakiness.io. The report is still generated locally in the output folder. This is useful for local development or testing the reporter itself. Can also be enabled via the `FLAKINESS_DISABLE_UPLOAD` environment variable.
211
+
212
+ ```typescript
213
+ reporter: [
214
+ ['@flakiness/playwright', { disableUpload: true }]
215
+ ]
216
+ ```
217
+
205
218
  ## Environment Variables
206
219
 
207
220
  The reporter respects the following environment variables:
@@ -209,6 +222,7 @@ The reporter respects the following environment variables:
209
222
  - **`FLAKINESS_ACCESS_TOKEN`**: Access token for Flakiness.io uploads (equivalent to `token` option)
210
223
  - **`FLAKINESS_ENDPOINT`**: Custom Flakiness.io endpoint URL (equivalent to `endpoint` option)
211
224
  - **`FLAKINESS_OUTPUT_DIR`**: Output directory for reports (equivalent to `outputFolder` option)
225
+ - **`FLAKINESS_DISABLE_UPLOAD`**: When set, disables report upload (equivalent to `disableUpload` option)
212
226
 
213
227
 
214
228
 
@@ -228,9 +242,9 @@ export default defineConfig({
228
242
  outputFolder: './flakiness-report',
229
243
  open: 'on-failure',
230
244
  collectBrowserVersions: false,
245
+ disableUpload: false,
231
246
  }]
232
247
  ],
233
248
  // ... rest of your config
234
249
  });
235
250
  ```
236
-
@@ -3,16 +3,18 @@ import {
3
3
  GitWorktree,
4
4
  ReportUtils,
5
5
  showReport,
6
+ showReportCommand,
6
7
  CPUUtilization,
7
8
  RAMUtilization,
8
9
  uploadReport,
9
10
  writeReport
10
11
  } from "@flakiness/sdk";
11
- import chalk from "chalk";
12
- import fs from "fs";
13
- import path from "path";
14
- const warn = (txt) => console.warn(chalk.yellow(`[flakiness.io] ${txt}`));
15
- const err = (txt) => console.error(chalk.red(`[flakiness.io] ${txt}`));
12
+ import fs from "node:fs";
13
+ import path from "node:path";
14
+ import * as nodeUtil from "node:util";
15
+ const styleText = (format, text) => nodeUtil.styleText?.(format, text) ?? text;
16
+ const warn = (txt) => console.warn(styleText("yellow", `[flakiness.io] ${txt}`));
17
+ const err = (txt) => console.error(styleText("red", `[flakiness.io] ${txt}`));
16
18
  const log = (txt) => console.log(`[flakiness.io] ${txt}`);
17
19
  function parseDurationMS(value) {
18
20
  if (isNaN(value))
@@ -27,7 +29,7 @@ async function existsAsync(aPath) {
27
29
  class FlakinessReporter {
28
30
  constructor(_options = {}) {
29
31
  this._options = _options;
30
- this._outputFolder = path.join(process.cwd(), this._options.outputFolder ?? process.env.FLAKINESS_OUTPUT_DIR ?? "flakiness-report");
32
+ this._outputFolder = path.resolve(process.cwd(), this._options.outputFolder ?? process.env.FLAKINESS_OUTPUT_DIR ?? "flakiness-report");
31
33
  this._sampleSystem = this._sampleSystem.bind(this);
32
34
  this._sampleSystem();
33
35
  }
@@ -253,25 +255,30 @@ class FlakinessReporter {
253
255
  async onExit() {
254
256
  if (!this._report)
255
257
  return;
256
- await uploadReport(this._report, this._attachments, {
257
- flakinessAccessToken: this._options.token,
258
- flakinessEndpoint: this._options.endpoint
259
- });
258
+ const disableUpload = this._options.disableUpload ?? envBool("FLAKINESS_DISABLE_UPLOAD");
259
+ if (!disableUpload) {
260
+ await uploadReport(this._report, this._attachments, {
261
+ flakinessAccessToken: this._options.token,
262
+ flakinessEndpoint: this._options.endpoint
263
+ });
264
+ }
260
265
  const openMode = this._options.open ?? "on-failure";
261
266
  const shouldOpen = process.stdin.isTTY && !process.env.CI && (openMode === "always" || openMode === "on-failure" && this._result?.status === "failed");
262
267
  if (shouldOpen) {
263
268
  await showReport(this._outputFolder);
264
269
  } else {
265
- const defaultOutputFolder = path.join(process.cwd(), "flakiness-report");
266
- const folder = defaultOutputFolder === this._outputFolder ? "" : path.relative(process.cwd(), this._outputFolder);
270
+ const command = showReportCommand(this._outputFolder);
267
271
  console.log(`
268
272
  To open last Flakiness report, run:
269
273
 
270
- ${chalk.cyan(`npx flakiness show ${folder}`)}
274
+ ${styleText("cyan", command)}
271
275
  `);
272
276
  }
273
277
  }
274
278
  }
279
+ function envBool(name) {
280
+ return ["1", "true"].includes(process.env[name]?.toLowerCase() ?? "");
281
+ }
275
282
  function toSTDIOEntry(data) {
276
283
  if (Buffer.isBuffer(data))
277
284
  return { buffer: data.toString("base64") };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@flakiness/playwright",
3
- "version": "1.3.2",
3
+ "version": "1.4.0",
4
4
  "private": false,
5
5
  "repository": {
6
6
  "type": "git",
@@ -28,6 +28,7 @@
28
28
  "author": "Degu Labs, Inc",
29
29
  "license": "MIT",
30
30
  "devDependencies": {
31
+ "@flakiness/playwright": "^1.3.2",
31
32
  "@playwright/test": "^1.57.0",
32
33
  "@types/node": "^25.0.3",
33
34
  "esbuild": "^0.27.2",
@@ -36,12 +37,12 @@
36
37
  "typescript": "^5.9.3"
37
38
  },
38
39
  "dependencies": {
39
- "@flakiness/flakiness-report": "^0.27.0",
40
- "@flakiness/sdk": "2.2.1",
41
- "chalk": "^5.6.2"
40
+ "@flakiness/flakiness-report": "^0.28.0",
41
+ "@flakiness/sdk": "2.4.0"
42
42
  },
43
43
  "scripts": {
44
44
  "build": "kubik build.mts",
45
- "watch": "kubik build.mts -w"
45
+ "watch": "kubik build.mts -w",
46
+ "test": "playwright test"
46
47
  }
47
48
  }
@@ -20,6 +20,7 @@ export default class FlakinessReporter implements Reporter {
20
20
  outputFolder?: string;
21
21
  open?: OpenMode;
22
22
  collectBrowserVersions?: boolean;
23
+ disableUpload?: boolean;
23
24
  });
24
25
  private _sampleSystem;
25
26
  printsToStdio(): boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"playwright-test.d.ts","sourceRoot":"","sources":["../../src/playwright-test.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EACV,UAAU,EAEV,UAAU,EAEV,QAAQ,EACR,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,UAAU,EAEvC,MAAM,2BAA2B,CAAC;AA6BnC,KAAK,QAAQ,GAAG,QAAQ,GAAG,OAAO,GAAG,YAAY,CAAC;AAElD,MAAM,CAAC,OAAO,OAAO,iBAAkB,YAAW,QAAQ;IAgB5C,OAAO,CAAC,QAAQ;IAf5B,OAAO,CAAC,OAAO,CAAC,CAAa;IAC7B,OAAO,CAAC,UAAU,CAAC,CAAQ;IAC3B,OAAO,CAAC,QAAQ,CAAwC;IACxD,OAAO,CAAC,mBAAmB,CAAmB;IAE9C,OAAO,CAAC,eAAe,CAAyC;IAChE,OAAO,CAAC,eAAe,CAAyC;IAChE,OAAO,CAAC,OAAO,CAAC,CAAY;IAC5B,OAAO,CAAC,YAAY,CAAgC;IACpD,OAAO,CAAC,aAAa,CAAS;IAE9B,OAAO,CAAC,OAAO,CAAC,CAAa;IAE7B,OAAO,CAAC,eAAe,CAAC,CAAiB;gBAErB,QAAQ,GAAE;QAC5B,gBAAgB,CAAC,EAAE,MAAM,CAAC;QAC1B,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,IAAI,CAAC,EAAE,QAAQ,CAAC;QAChB,sBAAsB,CAAC,EAAE,OAAO,CAAC;KAC7B;IAON,OAAO,CAAC,aAAa;IAMrB,aAAa,IAAI,OAAO;IAIxB,OAAO,CAAC,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,KAAK;IAKxC,OAAO,CAAC,KAAK,EAAE,SAAS,GAAG,IAAI;IAI/B,WAAW,CAAC,IAAI,EAAE,QAAQ;IAG1B,SAAS,CAAC,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU;YAM9B,WAAW;YAsBX,SAAS;YAWT,eAAe;IAmD7B,OAAO,CAAC,aAAa;IAmBrB,OAAO,CAAC,eAAe;IAWvB,OAAO,CAAC,cAAc;IAUhB,KAAK,CAAC,MAAM,EAAE,UAAU;IAkGxB,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;CA0B9B"}
1
+ {"version":3,"file":"playwright-test.d.ts","sourceRoot":"","sources":["../../src/playwright-test.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EACV,UAAU,EAEV,UAAU,EAEV,QAAQ,EACR,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,UAAU,EAEvC,MAAM,2BAA2B,CAAC;AAgCnC,KAAK,QAAQ,GAAG,QAAQ,GAAG,OAAO,GAAG,YAAY,CAAC;AAElD,MAAM,CAAC,OAAO,OAAO,iBAAkB,YAAW,QAAQ;IAgB5C,OAAO,CAAC,QAAQ;IAf5B,OAAO,CAAC,OAAO,CAAC,CAAa;IAC7B,OAAO,CAAC,UAAU,CAAC,CAAQ;IAC3B,OAAO,CAAC,QAAQ,CAAwC;IACxD,OAAO,CAAC,mBAAmB,CAAmB;IAE9C,OAAO,CAAC,eAAe,CAAyC;IAChE,OAAO,CAAC,eAAe,CAAyC;IAChE,OAAO,CAAC,OAAO,CAAC,CAAY;IAC5B,OAAO,CAAC,YAAY,CAAgC;IACpD,OAAO,CAAC,aAAa,CAAS;IAE9B,OAAO,CAAC,OAAO,CAAC,CAAa;IAE7B,OAAO,CAAC,eAAe,CAAC,CAAiB;gBAErB,QAAQ,GAAE;QAC5B,gBAAgB,CAAC,EAAE,MAAM,CAAC;QAC1B,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,IAAI,CAAC,EAAE,QAAQ,CAAC;QAChB,sBAAsB,CAAC,EAAE,OAAO,CAAC;QACjC,aAAa,CAAC,EAAE,OAAO,CAAC;KACpB;IAON,OAAO,CAAC,aAAa;IAMrB,aAAa,IAAI,OAAO;IAIxB,OAAO,CAAC,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,KAAK;IAKxC,OAAO,CAAC,KAAK,EAAE,SAAS,GAAG,IAAI;IAI/B,WAAW,CAAC,IAAI,EAAE,QAAQ;IAG1B,SAAS,CAAC,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU;YAM9B,WAAW;YAsBX,SAAS;YAWT,eAAe;IAmD7B,OAAO,CAAC,aAAa;IAmBrB,OAAO,CAAC,eAAe;IAWvB,OAAO,CAAC,cAAc;IAUhB,KAAK,CAAC,MAAM,EAAE,UAAU;IAkGxB,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;CA4B9B"}