@reportforge/playwright-pdf 0.22.0 → 0.23.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 +68 -21
- package/SECURITY.md +13 -2
- package/dist/cli/index.js +228 -118
- package/dist/index.d.mts +31 -10
- package/dist/index.d.ts +31 -10
- package/dist/index.js +296 -117
- package/dist/index.mjs +290 -111
- package/package.json +2 -2
- package/CHANGELOG.md +0 -602
package/README.md
CHANGED
|
@@ -57,14 +57,16 @@ Three templates, one reporter. Every PDF is fully offline: fonts, charts, and sc
|
|
|
57
57
|
- **Shard merging**: combine N Playwright JSON shard reports into one PDF via `shardResults`; accepts glob patterns or explicit paths
|
|
58
58
|
- **Notifications**: post pass/fail summaries to Slack, Teams, Discord, or email after each run; configurable trigger (`always` / `failure` / `success`) per channel; email and Discord support optional PDF attachment via `attachPdf`
|
|
59
59
|
- **Flakiness trend**: top-N flakiest tests table with per-test dot sparkline across stored history runs in the `detailed` template; `flakinessTopN` option (default 5, `0` disables)
|
|
60
|
-
- **
|
|
61
|
-
- **
|
|
60
|
+
- **Pass-rate trend**: cross-run trend chart from stored history; opt-in `remoteHistory` keeps the trend alive on ephemeral CI runners by storing aggregate numbers only (pass rate, counts, duration, verdict; no test titles or error text, and the branch name never travels in plaintext), with no extra network calls
|
|
61
|
+
- **Offline failure analysis**: sorts each failure into one of 7 root-cause buckets and renders a root-cause chip under each failed test in the `detailed` PDF (dominant-cause one-liner in `executive`). No network, no AI service: a small embedded classifier with automatic updates; pin it any time. Full details at [reportforge.org/docs/advanced/failure-analysis](https://reportforge.org/docs/advanced/failure-analysis).
|
|
62
|
+
- **On-device training**: teach the classifier your team's failures without any data leaving your machine. Label locally-collected samples (`npx @reportforge/playwright-pdf label-feedback`), then `train-model` trains and cross-validates a personal layer on-device; it activates only when it measurably beats the base model on your own labeled set (`evaluate-model` shows the comparison any time). Commit the model file to your repo via `failureAnalysis.localModelPath` to share it with CI. Training data, the trained model, and evaluation are all local files; the analysis code cannot even name a network primitive (enforced by an automated source audit).
|
|
62
63
|
- `npx @reportforge/playwright-pdf export-feedback`: merges your locally-collected feedback (tokenized + redacted) into one CSV for review or moving between machines. Local file only; there is no upload.
|
|
63
64
|
- **Rich execution capture**: opt-in "Steps to Reproduce" outline (a nested, copy-pasteable Markdown list of your `test.step`s and assertions; add `apiSteps` for the full click/fill/check trail), Node console tail, and trace/video links under each failed test in the defect log. Read straight from the Playwright step tree: no fixtures, no test-code changes. Enable via `capture` (`steps` / `apiSteps` / `console` / `evidence`); off by default.
|
|
64
65
|
- **Configurable sections**: add or remove any report section per template via `sections`.
|
|
65
66
|
- **Executive report brief band**: leads with a plain-language brief (trend + root causes) and one hero pass-rate number instead of a flat KPI grid
|
|
66
|
-
- **
|
|
67
|
-
- **
|
|
67
|
+
- **Data protection**: AES-256 password-protected PDFs (no external tools) and opt-in redaction of credentials/PII in report content and live streams
|
|
68
|
+
- **Hybrid licensing**: one short key unlocks it; reports keep rendering offline via a locally cached license between refreshes
|
|
69
|
+
- **Update notice**: when a newer reporter version is published, each run ends with one info line naming it and the update command; no extra network calls
|
|
68
70
|
|
|
69
71
|
---
|
|
70
72
|
|
|
@@ -107,14 +109,14 @@ npx playwright test
|
|
|
107
109
|
|
|
108
110
|
### Requirements
|
|
109
111
|
|
|
110
|
-
- Node.js ≥
|
|
112
|
+
- Node.js ≥ 20
|
|
111
113
|
- `@playwright/test` ≥ 1.40 (peer dependency)
|
|
112
|
-
- `puppeteer-core` ≥ 21 (peer dependency)
|
|
114
|
+
- `puppeteer-core` ≥ 21 < 26 (peer dependency)
|
|
113
115
|
- Chrome or Chromium installed on the machine
|
|
114
116
|
|
|
115
117
|
### Chrome setup
|
|
116
118
|
|
|
117
|
-
The reporter
|
|
119
|
+
The reporter locates Chrome via the `puppeteerExecutablePath` option first, then the `PUPPETEER_EXECUTABLE_PATH` environment variable, then `chrome-finder` (system Chrome), then puppeteer-core's bundled Chromium if present. Full per-OS instructions: [reportforge.org/docs/running-tests#chrome-setup](https://reportforge.org/docs/running-tests#chrome-setup).
|
|
118
120
|
|
|
119
121
|
**Windows**
|
|
120
122
|
|
|
@@ -186,7 +188,7 @@ All options are the second element of the reporter tuple.
|
|
|
186
188
|
| `primaryColor` | `string` | `'#CC785C'` | Primary brand colour (3-, 6-, or 8-digit hex). Used for headers and accent bars. |
|
|
187
189
|
| `accentColor` | `string` | `'#3F7D58'` | Accent brand colour (hex). Used for highlights and badges. |
|
|
188
190
|
| `watermark` | `string` | n/a | Text to render as a diagonal watermark overlay from the Suite Breakdown page onward (summary/chart pages stay clean), e.g. `'CONFIDENTIAL'` or `'DRAFT'`. |
|
|
189
|
-
| `pdfPassword` | `string` | n/a | Password-protect the generated PDF.
|
|
191
|
+
| `pdfPassword` | `string` | n/a | Password-protect the generated PDF with AES-256, applied in-process with no external tools required. Also encrypts the failure-overflow sidecar (`*-failures.json.enc`; decrypt with `npx @reportforge/playwright-pdf decrypt-failures`). Recommended: `process.env.RF_PDF_PASSWORD`. |
|
|
190
192
|
| `reportTitle` | `string` | `'Playwright Test Report'` | Custom title for the report cover page and running header. |
|
|
191
193
|
| `projectName` | `string` | from `package.json` | Project or application name. Inferred from the `package.json` `name` field if absent. |
|
|
192
194
|
| `open` | `boolean` | `false` | Open the generated PDF automatically after generation. For local use only; ignored in CI. |
|
|
@@ -199,13 +201,14 @@ All options are the second element of the reporter tuple.
|
|
|
199
201
|
| `maxFileSizeMb` | `number` | `8` | Soft cap on the final PDF size in MB. If exceeded, the report is re-rendered once with the `'max'` compression preset. |
|
|
200
202
|
| `shardResults` | `string \| string[]` | n/a | Glob or path array of Playwright JSON shard report files to merge into one PDF. See the Shard Merging docs. |
|
|
201
203
|
| `notify` | `object` | n/a | Notification channels: `slack`, `teams` (each `{ url, enabled, on }`), `discord` (`{ url, enabled, on, attachPdf }`), `email` (`{ to, enabled, on, attachPdf }`). See the Notifications docs. |
|
|
202
|
-
| `failureAnalysis` | `object` | `{ enabled: true }` | Offline failure root-cause analysis (embedded
|
|
204
|
+
| `failureAnalysis` | `object` | `{ enabled: true }` | Offline failure root-cause analysis (embedded classifier; no runtime network) with on-device personalization: label collected failures, then the `train-model` CLI trains + evaluates a local layer entirely on your machine; it activates only when it beats the base model, and nothing leaves the machine. Fields: `enabled` (default `true`), `maxClusters` (default `10`), `minStrength` (`weak`\|`moderate`\|`strong`, default `weak`), `maxFailuresToAnalyse` (default `500`), `collectUnclassified` (default `true`), `collectScope` (`blind-spots`\|`all`, default `blind-spots`), `autoUpdateModel` (default `true`), `localModel` (use the gate-passed on-device model, default `true`), `localModelPath` (share a team-trained model via a repo-committed file). See the Failure Analysis docs. |
|
|
203
205
|
| `capture` | `object` | `{}` (off) | Opt-in rich execution capture for the defect log (reporter-side; no fixtures, no test-code changes). Fields: `steps` (a copy-pasteable "Steps to Reproduce" outline built from the Playwright step tree; each row is a Markdown list line indented under its parent `test.step`, default `false`), `apiSteps` (include every top-level `pw:api` action (click/fill/check/goto) in the outline for a full action trail; without it the outline shows only `test.step` intent + `expect` assertions, default `false`), `console` (Node stdout/stderr tail, default `false`), `evidence` (trace/video file links, default `false`), `maxSteps` (default `50`), `maxConsoleLines` (default `50`). Renders in the Defect Log section of the `detailed` template. |
|
|
206
|
+
| `redact` | `object` | `{ enabled: false }` | Opt-in masking of likely credentials/PII (passwords, tokens, API keys, Bearer/JWT values, emails, high-entropy strings) in report text and the live stream. `builtins` (default `true`) toggles the built-in patterns; `patterns` adds custom regexes (fully masked); `mask` sets the replacement text (default `'[REDACTED]'`). Screenshots cannot be redacted; use `includeScreenshots: false` for strict environments. |
|
|
204
207
|
| `live` | `object` | `{}` (off) | Opt-in live test-execution streaming. When `enabled`, the reporter prints an unguessable watch link to the CI logs at run start and streams per-test progress to the hosted dashboard while tests run; all shards of one CI run converge on a single live view. Fields: `enabled` (default `false`), `runId` (override the auto-derived run id), `serverUrl` (override the streaming server), `steps` (`none`\|`failed`\|`intent`\|`all`, default `failed`; `intent` shows only your `test.step` names plus any failing step), `console` (stream stdout/stderr tails, default `false`), `flushMs` (batch debounce 500-10000, default `2000`). The PDF at the end of the run is unaffected. Requires an active subscription with the `live` entitlement. See the Live Runs docs. |
|
|
205
208
|
| `historyFile` | `string` | `~/.reportforge/{key}/history.json` | Path to the history JSON file. Relative paths resolve from `cwd`. Enables pass-rate trending charts in the `detailed` template. |
|
|
206
209
|
| `historySize` | `number` | `10` | Maximum number of test runs to keep in the history file (integer ≥ 2). Older runs are pruned on append. |
|
|
207
210
|
| `showTrend` | `boolean` | `true` | Show the pass-rate sparkline and delta badge in the `detailed` template. Set to `false` to disable history tracking entirely. |
|
|
208
|
-
| `remoteHistory` | `boolean` | `false` | Opt-in server-side trend store so the pass-rate trend survives ephemeral CI runners (the local history file is wiped with the workspace, leaving the chart stuck at one data point). One request per run
|
|
211
|
+
| `remoteHistory` | `boolean` | `false` | Opt-in server-side trend store so the pass-rate trend survives ephemeral CI runners (the local history file is wiped with the workspace, leaving the chart stuck at one data point). One small authenticated request per run carrying aggregate numbers only — no test titles, no error text, and the branch name never travels in plaintext. Falls back to the local history file on any failure. See the History docs. |
|
|
209
212
|
| `flakinessTopN` | `number` | `5` | Maximum flaky tests to show in the flakiness table (`detailed` template). Set to `0` to disable the table entirely. |
|
|
210
213
|
| `slowTestThreshold` | `number` | `10` | Minimum timed-test count before `SLOW` badges appear in the suite breakdown: below this, every test is trivially the "slowest" so badges stay hidden. On larger runs only genuine outliers (at least 2× the median test duration) are badged, so the badge stays rare. Set to `0` to drop the run-size gate (outliers still required). |
|
|
211
214
|
| `requirementTagPattern` | `string` | `'^@?[A-Z][A-Z0-9]*-\\d+$'` | Regex deciding which tags count as requirement IDs in the Requirements Traceability section (`detailed` template). Matching tags (ticket shapes like `@ODP-5328`, `REQ-001`) get the traceability matrix; everything else (`@regression`, `@sanity`) collapses into a compact tag summary instead of repeating identical rows. Set to `''` to disable the split and list every tag in the matrix. |
|
|
@@ -238,7 +241,7 @@ reporter: [
|
|
|
238
241
|
|
|
239
242
|
`steps: 'intent'` shows only your `test.step` names (plus any failing step): the cleanest, most readable trail. `'all'` adds every action and assertion beneath its parent step; `'failed'` (default) keeps intent + assertions + failures.
|
|
240
243
|
|
|
241
|
-
Sharded runs need no extra config:
|
|
244
|
+
Sharded runs need no extra config: every shard of one CI run converges on the same live view automatically. Set `RF_LIVE_RUN_ID` to override when your CI is not auto-detected.
|
|
242
245
|
|
|
243
246
|
Live streaming is best-effort and entitlement-gated: if the server is unreachable the run is unaffected, and an active subscription with the `live` feature is required. If you've configured Slack/Teams/Discord notifications, the watch link is also posted to those channels when the run starts.
|
|
244
247
|
|
|
@@ -315,6 +318,48 @@ The `on` trigger controls when the message fires:
|
|
|
315
318
|
|
|
316
319
|
The summary includes pass rate, test counts, duration, and the report filename. Notifications require a valid license and fire after PDF generation (or after a PDF failure; you still get the ping).
|
|
317
320
|
|
|
321
|
+
### Data Protection
|
|
322
|
+
|
|
323
|
+
Two independent, opt-in controls: encrypt the PDF itself, and mask likely secrets before they ever reach report content.
|
|
324
|
+
|
|
325
|
+
```typescript
|
|
326
|
+
// playwright.config.ts
|
|
327
|
+
reporter: [
|
|
328
|
+
['@reportforge/playwright-pdf', {
|
|
329
|
+
pdfPassword: process.env.RF_PDF_PASSWORD,
|
|
330
|
+
redact: {
|
|
331
|
+
enabled: true,
|
|
332
|
+
patterns: ['MYCO_[A-Z0-9]+'], // custom regexes, fully masked
|
|
333
|
+
},
|
|
334
|
+
}],
|
|
335
|
+
],
|
|
336
|
+
```
|
|
337
|
+
|
|
338
|
+
**`pdfPassword`** encrypts the PDF with AES-256, applied in-process with no external tools required. When a failure-overflow sidecar is written (`maxInlineFailures` exceeded), it's encrypted too, as `{basename}-failures.json.enc`:
|
|
339
|
+
|
|
340
|
+
```bash
|
|
341
|
+
npx @reportforge/playwright-pdf decrypt-failures reports/2026-04-28-report-failures.json.enc --password=$RF_PDF_PASSWORD
|
|
342
|
+
# or set RF_PDF_PASSWORD and drop --password
|
|
343
|
+
```
|
|
344
|
+
|
|
345
|
+
**`redact`** masks likely credentials and PII in error messages, stack traces, step titles, captured console output, test/suite titles, annotations, failure-analysis text, chart labels, and in the live watch stream. It runs after failure analysis, so classifier accuracy is unaffected. Built-in patterns (`builtins: true`, the default) catch:
|
|
346
|
+
|
|
347
|
+
| Catches | Kept as-is | Example |
|
|
348
|
+
|---|---|---|
|
|
349
|
+
| `key=value` / `"key": "value"` credentials (`password`, `secret`, `token`, `apiKey`, `auth`, `credential`, `privateKey`, `accessKey`, `clientSecret`, …) | the key name | `password: "hunter2"` → `password: "[REDACTED]"` |
|
|
350
|
+
| `Authorization: Bearer …` / `Basic …` | the scheme word | `Bearer eyJhbGc...` → `Bearer [REDACTED]` |
|
|
351
|
+
| JWTs | n/a | `eyJhbGciOi...` |
|
|
352
|
+
| Provider key prefixes | n/a | AWS `AKIA…`, GitHub `ghp_`/`gho_`/`github_pat_`, Slack `xox*`, OpenAI-style `sk-`, Razorpay `rzp_live_`/`rzp_test_`, Google `AIza…` |
|
|
353
|
+
| URLs with embedded credentials | the username | `https://alice:hunter2@host` → `https://alice:[REDACTED]@host` |
|
|
354
|
+
| Emails | first character + domain | `jsmith@example.com` → `j***@example.com` |
|
|
355
|
+
| High-entropy strings (20+ mixed letters/digits) | n/a | tokens and keys with no recognizable prefix |
|
|
356
|
+
|
|
357
|
+
Add your own with `patterns` (strings compiled as case-sensitive regexes with the `g` flag); custom matches are always fully masked. `mask` overrides the default replacement text (`'[REDACTED]'`).
|
|
358
|
+
|
|
359
|
+
> **Screenshots cannot be redacted:** pixel content is opaque to text-based masking. Set `includeScreenshots: false` in strict environments.
|
|
360
|
+
|
|
361
|
+
Full details at [reportforge.org/docs/advanced/security](https://reportforge.org/docs/advanced/security).
|
|
362
|
+
|
|
318
363
|
### Test History Trending
|
|
319
364
|
|
|
320
365
|
After each run the reporter appends a summary entry to a local JSON file and renders a pass-rate sparkline + verdict row in the `detailed` template.
|
|
@@ -330,7 +375,7 @@ reporter: [['@reportforge/playwright-pdf', {
|
|
|
330
375
|
}]]
|
|
331
376
|
```
|
|
332
377
|
|
|
333
|
-
One request per run
|
|
378
|
+
One small authenticated request per run, carrying aggregate numbers only (pass rate, counts, duration, verdict; no test titles, no error text, and the branch name never travels in plaintext). The server keeps roughly the last 100 runs per project + branch, expiring after 180 days, and returns them for the chart; any failure falls back to the local file. The flakiness table stays local-only by design (it needs test titles, which never leave your machine). Bitbucket Pipelines users especially: Bitbucket caches are immutable once written, so `remoteHistory` is the practical path there.
|
|
334
379
|
|
|
335
380
|
**CI caching alternative** (keeps even aggregate numbers off the server): set `historyFile` to a project-relative path and cache it between runs:
|
|
336
381
|
|
|
@@ -439,7 +484,7 @@ reporter: [['@reportforge/playwright-pdf', {
|
|
|
439
484
|
|---|---|
|
|
440
485
|
| `coverPage` | Full-page cover: title, verdict badge, KPI stats strip, branch + commit |
|
|
441
486
|
| `analysisOneliner` | One-line failure-analysis summary banner |
|
|
442
|
-
| `releaseGate` | Ship/hold recommendation banner (APPROVED TO SHIP / HOLD) |
|
|
487
|
+
| `releaseGate` | Ship/hold recommendation banner (APPROVED TO SHIP / HOLD, or a neutral NO TESTS RAN when the run executed zero tests) |
|
|
443
488
|
| `summary` | KPI strip (total · passed · failed · timed-out · skipped · flaky), verdict, duration, pass rate, flaky callout |
|
|
444
489
|
| `charts` | Pass-rate doughnut + stacked suite-results bar |
|
|
445
490
|
| `trend` | Pass-rate trend line, run-history table, and flakiness table (rendered inside `charts`) |
|
|
@@ -450,6 +495,7 @@ reporter: [['@reportforge/playwright-pdf', {
|
|
|
450
495
|
| `failureAnalysis` | Inline per-test root-cause chip under each failed test (category + representative error + match strength, from the offline classifier) |
|
|
451
496
|
| `slowTests` | `SLOW` badge on the duration-ranked slowest tests, shown inline in the breakdown |
|
|
452
497
|
| `defectLog` | `DEF-####` numbered failure table (severity, duration) + opt-in repro detail (`capture`) |
|
|
498
|
+
| `briefBand` | Executive brief band: one plain-language sentence (trend delta + root causes) and a hero pass-rate stat |
|
|
453
499
|
|
|
454
500
|
#### Display modifiers: tune a section that's on
|
|
455
501
|
|
|
@@ -468,7 +514,7 @@ Omit `sections` entirely and each template renders exactly this (✓ = on):
|
|
|
468
514
|
| Section | minimal | detailed | executive |
|
|
469
515
|
|---|:-:|:-:|:-:|
|
|
470
516
|
| `coverPage` | – | – | ✓ |
|
|
471
|
-
| `analysisOneliner` | – | – |
|
|
517
|
+
| `analysisOneliner` | – | – | – |
|
|
472
518
|
| `releaseGate` | ✓ | ✓ | ✓ |
|
|
473
519
|
| `summary` | ✓ | ✓ | ✓ |
|
|
474
520
|
| `charts` | – | ✓ | ✓ |
|
|
@@ -480,6 +526,7 @@ Omit `sections` entirely and each template renders exactly this (✓ = on):
|
|
|
480
526
|
| `failureAnalysis` | – | ✓ | – |
|
|
481
527
|
| `slowTests` | – | ✓ | ✓ |
|
|
482
528
|
| `defectLog` | – | ✓ | – |
|
|
529
|
+
| `briefBand` | – | – | ✓ |
|
|
483
530
|
| `passRate` | ✓ | ✓ | ✓ |
|
|
484
531
|
| `fullEnvironment` | – | ✓ | – |
|
|
485
532
|
| `retries` | ✓ | ✓ | – |
|
|
@@ -622,10 +669,10 @@ stage('Playwright Tests') {
|
|
|
622
669
|
ReportForge ships a **hybrid offline-first** model:
|
|
623
670
|
|
|
624
671
|
1. Paste your `RFSU-…` key into the config once (or set `RF_LICENSE_KEY`).
|
|
625
|
-
2. On first run the reporter activates against the license server
|
|
626
|
-
3. Every subsequent run is **fully offline**: the cached
|
|
627
|
-
4.
|
|
628
|
-
5. Each subscription allows up to **25 active machines
|
|
672
|
+
2. On first run the reporter activates against the license server and caches a signed license at `~/.reportforge/license.json`.
|
|
673
|
+
3. Every subsequent run is **fully offline**: the cached license is validated on-device. No network call.
|
|
674
|
+
4. The reporter refreshes the cache automatically in the background before it expires.
|
|
675
|
+
5. Each subscription allows up to **25 active machines**. Machines that haven't run in 30 days free up automatically.
|
|
629
676
|
|
|
630
677
|
Cancel the subscription and the reporter keeps working until the end of the current billing period, then stops generating PDFs until you restart. **A license issue never aborts your test run**: the reporter logs a warning and skips PDF generation; your Playwright tests still pass.
|
|
631
678
|
|
|
@@ -675,8 +722,7 @@ Common issues:
|
|
|
675
722
|
|
|
676
723
|
- **`Chrome/Chromium not found`** → install Google Chrome Stable; don't use the Ubuntu `chromium-browser` snap.
|
|
677
724
|
- **Charts blank** → ensure `npm run bundle-chartjs` ran at build; the reporter waits up to 30s for `window.__chartsReady`.
|
|
678
|
-
-
|
|
679
|
-
- **No PDF generated** → verify `RF_LICENSE_KEY` is set and your subscription is active. `RF_DEBUG=1` will show the activation result; missing key, expired subscription, network failure, or no JWT cache all skip PDF generation.
|
|
725
|
+
- **No PDF generated** → verify `RF_LICENSE_KEY` is set and your subscription is active. `RF_DEBUG=1` will show the activation result; missing key, expired subscription, network failure, or no license cache all skip PDF generation.
|
|
680
726
|
|
|
681
727
|
Full guide: [reportforge.org/docs/troubleshooting](https://reportforge.org/docs/troubleshooting).
|
|
682
728
|
|
|
@@ -694,7 +740,8 @@ Full documentation at [reportforge.org/docs](https://reportforge.org/docs):
|
|
|
694
740
|
- [Templates](https://reportforge.org/docs/templates): minimal, detailed, executive
|
|
695
741
|
- [Live runs](https://reportforge.org/docs/advanced/live): stream per-test progress to a shared watch link
|
|
696
742
|
- [Report Sections](https://reportforge.org/docs/configuration#report-sections): add or remove sections per template
|
|
697
|
-
- [
|
|
743
|
+
- [Data protection](https://reportforge.org/docs/advanced/security): password-encrypt PDFs and redact credentials/PII from report content
|
|
744
|
+
- [License & offline behaviour](https://reportforge.org/docs/licensing): license cache, machine cap, cancellation
|
|
698
745
|
- [Troubleshooting](https://reportforge.org/docs/troubleshooting): common issues and debug flags
|
|
699
746
|
- [Changelog](https://reportforge.org/changelog): version history and release notes
|
|
700
747
|
|
package/SECURITY.md
CHANGED
|
@@ -40,8 +40,19 @@ Out of scope:
|
|
|
40
40
|
|
|
41
41
|
- Denial of service / volumetric attacks.
|
|
42
42
|
- Reports about the 25-machine licensing cap working as documented.
|
|
43
|
-
- Vulnerabilities exclusively in third-party services we integrate
|
|
44
|
-
|
|
43
|
+
- Vulnerabilities exclusively in third-party services we integrate (for
|
|
44
|
+
example our payment provider, Razorpay) — report those upstream.
|
|
45
|
+
|
|
46
|
+
## Report data protection
|
|
47
|
+
|
|
48
|
+
A generated PDF can contain whatever your tests captured: error text, console
|
|
49
|
+
output, screenshots. Two opt-in reporter options limit what a report exposes
|
|
50
|
+
if it ends up somewhere it shouldn't. `pdfPassword` encrypts the PDF, and the
|
|
51
|
+
failure-overflow sidecar when one is written, with AES-256, applied
|
|
52
|
+
in-process with no external tools required. `redact` masks likely credentials
|
|
53
|
+
and PII (tokens, API keys, emails, and more) out of report content and the
|
|
54
|
+
live watch stream before they're written or streamed. Neither is on by
|
|
55
|
+
default. Details: [reportforge.org/docs/advanced/security](https://reportforge.org/docs/advanced/security).
|
|
45
56
|
|
|
46
57
|
## Supported versions
|
|
47
58
|
|