@molecule/api-ai-tools 1.12.0 → 1.13.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/README.md +361 -9
- package/dist/command-position.d.ts +33 -0
- package/dist/command-position.d.ts.map +1 -1
- package/dist/command-position.js +66 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/playwright-report.d.ts +210 -0
- package/dist/playwright-report.d.ts.map +1 -0
- package/dist/playwright-report.js +406 -0
- package/dist/suite-overlap.d.ts +6 -4
- package/dist/suite-overlap.d.ts.map +1 -1
- package/dist/suite-overlap.js +323 -39
- package/dist/tools.d.ts.map +1 -1
- package/dist/tools.js +94 -5
- package/dist/trace-artifacts.d.ts +12 -0
- package/dist/trace-artifacts.d.ts.map +1 -1
- package/dist/trace-artifacts.js +1 -0
- package/dist/utilities.d.ts +44 -5
- package/dist/utilities.d.ts.map +1 -1
- package/dist/utilities.js +168 -27
- package/package.json +2 -2
|
@@ -0,0 +1,210 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The standard Playwright machine report, kept beside a run's log instead of inferred from it.
|
|
3
|
+
*
|
|
4
|
+
* The execution wrapper already puts a background suite on Playwright's `list` reporter and
|
|
5
|
+
* preserves a file reporter the executor named ({@link ./utilities.js} `withPlaywrightRunReport`,
|
|
6
|
+
* `streamingBackgroundCommand`). That log is text: which failure a trace, a route or a locator
|
|
7
|
+
* belongs to has to be reconstructed from printed headings, and a mis-join reads one failing
|
|
8
|
+
* test's evidence as another's (xr-molecule-flash-m411). Playwright already writes the answer down
|
|
9
|
+
* itself — its built-in `json` reporter records every test's own identity (project, file, line,
|
|
10
|
+
* column, title path, status, retries) and every attachment the runner saved for THAT test, path
|
|
11
|
+
* included.
|
|
12
|
+
*
|
|
13
|
+
* So the wrapper adds the `json` reporter to a run it already rewrites, sends its output to a
|
|
14
|
+
* per-run file with the reporter's own `PLAYWRIGHT_JSON_OUTPUT_FILE` option, and this module turns
|
|
15
|
+
* that file into a small, bounded record on the tool result ({@link PlaywrightRunReport}). The
|
|
16
|
+
* whole file stays where it was written, so full evidence has a path; the record carries only what
|
|
17
|
+
* a diagnosis needs.
|
|
18
|
+
*
|
|
19
|
+
* Honesty rules, which every reader below follows:
|
|
20
|
+
*
|
|
21
|
+
* - A missing, empty, truncated or wrongly shaped file is NOT "the run failed nothing": it is
|
|
22
|
+
* `missing` / `malformed`, and a record that parsed but is not a whole run (`errors` present, no
|
|
23
|
+
* `suites`) is `partial`. Only a record with the runner's own stats and suite tree is `complete`.
|
|
24
|
+
* - The record never carries a pass/fail verdict and must never be read as one. Suite selection,
|
|
25
|
+
* retries, budgets and the platform's own proof decisions stay exactly where they were.
|
|
26
|
+
* - Nothing here parses console output, and nothing reads a report the executor asked for itself
|
|
27
|
+
* (a `json` reporter already named on the command, or a `PLAYWRIGHT_JSON_OUTPUT_FILE` the command
|
|
28
|
+
* sets): the executor's own artifact is theirs.
|
|
29
|
+
*
|
|
30
|
+
* @module
|
|
31
|
+
*/
|
|
32
|
+
/**
|
|
33
|
+
* The environment variable Playwright's built-in `json` reporter takes its output path from
|
|
34
|
+
* (`resolveOutputFile("JSON", …)`), resolved against the runner's own working directory. An
|
|
35
|
+
* absolute path is used here, so the file lands in the run's scratch area whatever directory the
|
|
36
|
+
* suite runs from.
|
|
37
|
+
*/
|
|
38
|
+
export declare const PLAYWRIGHT_REPORT_ENV = "PLAYWRIGHT_JSON_OUTPUT_FILE";
|
|
39
|
+
/** The file name a background task's report is written to, beside its own log. */
|
|
40
|
+
export declare const PLAYWRIGHT_REPORT_SUFFIX = ".playwright.json";
|
|
41
|
+
/**
|
|
42
|
+
* How big a report may be before this module refuses to summarize it. The file stays readable at
|
|
43
|
+
* its path; the record only says so. A whole 139-test suite's report is well under a megabyte; a
|
|
44
|
+
* report past this is not one a tool result should carry.
|
|
45
|
+
*/
|
|
46
|
+
export declare const MAX_REPORT_PARSE_CHARS = 8000000;
|
|
47
|
+
/** How many failing tests a record lists before the rest are counted in `omittedFailures`. */
|
|
48
|
+
export declare const MAX_REPORTED_FAILURES = 12;
|
|
49
|
+
/** How many attachments one failing test keeps in the record (`trace` first). */
|
|
50
|
+
export declare const MAX_REPORTED_ATTACHMENTS = 4;
|
|
51
|
+
/** How much of one failure's own error text the record keeps. */
|
|
52
|
+
export declare const MAX_REPORTED_ERROR_CHARS = 400;
|
|
53
|
+
/**
|
|
54
|
+
* How much of a report this module could account for.
|
|
55
|
+
*
|
|
56
|
+
* - `complete` — the runner's stats and its suite tree both parsed: every test entry is present.
|
|
57
|
+
* - `partial` — a report was written but is not a whole run (Playwright's own `errors` are present,
|
|
58
|
+
* the suite tree is missing, or the file is past {@link MAX_REPORT_PARSE_CHARS}). What is listed
|
|
59
|
+
* is real; what is missing must be read at {@link PlaywrightRunReport.path}.
|
|
60
|
+
* - `malformed` — the file exists but is not a Playwright JSON report (truncated, wrong shape).
|
|
61
|
+
* Nothing in it may be treated as runner data.
|
|
62
|
+
* - `missing` — the run left no report (killed before `onEnd`, not a run this wrapper rewrote, or
|
|
63
|
+
* the file was removed). Nothing may be inferred from its absence.
|
|
64
|
+
*/
|
|
65
|
+
export type PlaywrightReportStatus = 'complete' | 'partial' | 'malformed' | 'missing';
|
|
66
|
+
/** One artifact the runner saved for one test, as the report records it. */
|
|
67
|
+
export interface PlaywrightReportAttachment {
|
|
68
|
+
/** The attachment's name (`trace`, `screenshot`, …). */
|
|
69
|
+
name: string;
|
|
70
|
+
/** Its media type, when the runner recorded one. */
|
|
71
|
+
contentType: string | null;
|
|
72
|
+
/** Where the runner saved it, as the report wrote the path. */
|
|
73
|
+
path: string;
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* One failing (or flaky) test's identity and evidence, as the runner recorded them.
|
|
77
|
+
*
|
|
78
|
+
* The identity fields are Playwright's own — never reconstructed from printed headings — so a
|
|
79
|
+
* reader can tell exactly which test an attachment belongs to.
|
|
80
|
+
*/
|
|
81
|
+
export interface PlaywrightReportTest {
|
|
82
|
+
/** The spec's stable id, when the report carries one. */
|
|
83
|
+
id: string | null;
|
|
84
|
+
/** The Playwright project the test ran in. */
|
|
85
|
+
project: string | null;
|
|
86
|
+
/** The spec file, relative to the config's root directory as the report writes it. */
|
|
87
|
+
file: string;
|
|
88
|
+
/** The test's declaration line. */
|
|
89
|
+
line: number;
|
|
90
|
+
/** The test's declaration column. */
|
|
91
|
+
column: number;
|
|
92
|
+
/** The full title path (`['describe', …, 'test title']`), empty when none is readable. */
|
|
93
|
+
titlePath: string[];
|
|
94
|
+
/** The test's own title (the last entry of {@link titlePath}). */
|
|
95
|
+
title: string;
|
|
96
|
+
/** Playwright's outcome for the test: `unexpected`, `flaky`, `skipped` or `expected`. */
|
|
97
|
+
status: string;
|
|
98
|
+
/** How many attempts the runner made (1 when it was not retried). */
|
|
99
|
+
attempts: number;
|
|
100
|
+
/** The retry index of the attempt whose evidence is reported (0 when not retried). */
|
|
101
|
+
retry: number;
|
|
102
|
+
/** That attempt's own duration, in milliseconds. */
|
|
103
|
+
durationMs: number;
|
|
104
|
+
/** That attempt's error message, bounded and redacted, or null. */
|
|
105
|
+
error: string | null;
|
|
106
|
+
/** The artifacts the runner saved for THAT attempt — `trace` first. */
|
|
107
|
+
attachments: PlaywrightReportAttachment[];
|
|
108
|
+
}
|
|
109
|
+
/** The runner's own tally, read straight from the report. Never a verdict this module derives. */
|
|
110
|
+
export interface PlaywrightReportStats {
|
|
111
|
+
/** Tests that ended as expected. */
|
|
112
|
+
expected: number;
|
|
113
|
+
/** Tests the runner skipped. */
|
|
114
|
+
skipped: number;
|
|
115
|
+
/** Tests that did not end as expected. */
|
|
116
|
+
unexpected: number;
|
|
117
|
+
/** Tests that failed and then passed on a retry. */
|
|
118
|
+
flaky: number;
|
|
119
|
+
/** The run's own duration, in milliseconds. */
|
|
120
|
+
durationMs: number;
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* What one run's standard machine report says, bounded for a tool result.
|
|
124
|
+
*
|
|
125
|
+
* A reader that needs evidence this record does not carry reads {@link path} in the sandbox.
|
|
126
|
+
*/
|
|
127
|
+
export interface PlaywrightRunReport {
|
|
128
|
+
/** How much of the report was read — see {@link PlaywrightReportStatus}. */
|
|
129
|
+
status: PlaywrightReportStatus;
|
|
130
|
+
/** Where the report file is, for the full evidence. Always the runner's own file. */
|
|
131
|
+
path: string;
|
|
132
|
+
/** One short phrase saying why a record is not `complete`, when it is not. */
|
|
133
|
+
reason?: string;
|
|
134
|
+
/** The runner's tally, or null when the report did not carry one. */
|
|
135
|
+
stats: PlaywrightReportStats | null;
|
|
136
|
+
/** The failing and flaky tests, in report order, bounded by {@link MAX_REPORTED_FAILURES}. */
|
|
137
|
+
failures: PlaywrightReportTest[];
|
|
138
|
+
/** How many failing tests did not fit the bound above. */
|
|
139
|
+
omittedFailures: number;
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* The report statuses for which the report's own per-test identities and attachments may be used.
|
|
143
|
+
*
|
|
144
|
+
* `partial` is included because a partial report's suite tree, where it parsed, is still the
|
|
145
|
+
* runner's own record of which test owns which attachment; `malformed` and `missing` are not,
|
|
146
|
+
* because nothing about them is runner data.
|
|
147
|
+
*
|
|
148
|
+
* @param status - One record's {@link PlaywrightReportStatus}.
|
|
149
|
+
* @returns True when the record's tests and attachments are the runner's own.
|
|
150
|
+
*/
|
|
151
|
+
export declare function reportCarriesIdentities(status: PlaywrightReportStatus): boolean;
|
|
152
|
+
/**
|
|
153
|
+
* The attachment paths a stored test record carries, `trace` first.
|
|
154
|
+
*
|
|
155
|
+
* @param test - One entry of {@link PlaywrightRunReport.failures}, as stored.
|
|
156
|
+
* @returns Every saved path the record can prove, in its own order.
|
|
157
|
+
*/
|
|
158
|
+
export declare function reportTestAttachmentPaths(test: PlaywrightReportTest): string[];
|
|
159
|
+
/**
|
|
160
|
+
* The directory a test result's own artifacts were saved in, or null when the report names none.
|
|
161
|
+
*
|
|
162
|
+
* Playwright writes one directory per test attempt under the run's `outputDir`, and every artifact
|
|
163
|
+
* of that attempt — `trace.zip` included — sits in it. The directory is therefore the exact
|
|
164
|
+
* ownership mark for a trace: two tests' traces are never in one another's directory. A damaged
|
|
165
|
+
* record whose attachment entries carry no path answers null, so nothing is claimed from it.
|
|
166
|
+
*
|
|
167
|
+
* @param test - One entry of {@link PlaywrightRunReport.failures}, as stored.
|
|
168
|
+
* @returns The posix-normalized directory, or null.
|
|
169
|
+
*/
|
|
170
|
+
export declare function reportTestArtifactDir(test: PlaywrightReportTest): string | null;
|
|
171
|
+
/**
|
|
172
|
+
* Summarize one Playwright `json` report into the bounded record a tool result carries.
|
|
173
|
+
*
|
|
174
|
+
* Pure text in, record out: the caller reads the file (and decides whether it may), so this is
|
|
175
|
+
* testable against genuine reports and against malformed controls alike.
|
|
176
|
+
*
|
|
177
|
+
* @param text - The report file's text, exactly as written.
|
|
178
|
+
* @param options - Where the file is, and the consumer's redactor for error text.
|
|
179
|
+
* @param options.path - The report file's path, carried on the record for full evidence.
|
|
180
|
+
* @param options.sanitize - Redactor applied to error text (defaults to the identity).
|
|
181
|
+
* @returns The bounded record; never a verdict.
|
|
182
|
+
*/
|
|
183
|
+
export declare function summarizePlaywrightReport(text: string, options: {
|
|
184
|
+
path: string;
|
|
185
|
+
sanitize?: (text: string) => string;
|
|
186
|
+
}): PlaywrightRunReport;
|
|
187
|
+
/**
|
|
188
|
+
* The report path a command was launched with, when it is the one this platform sets.
|
|
189
|
+
*
|
|
190
|
+
* Read back from the launched script (and from a completed task's own command) so a record written
|
|
191
|
+
* before an API restart is still found: the path is the task's own id derived by
|
|
192
|
+
* {@link playwrightReportPathFor}, never a path parsed out of the executor's command.
|
|
193
|
+
*
|
|
194
|
+
* @param command - The command as it was launched.
|
|
195
|
+
* @param expectedPath - The one path this task's report may be at.
|
|
196
|
+
* @returns True when the command sets {@link PLAYWRIGHT_REPORT_ENV} to that exact path.
|
|
197
|
+
*/
|
|
198
|
+
export declare function commandWritesReportTo(command: string, expectedPath: string): boolean;
|
|
199
|
+
/**
|
|
200
|
+
* The report file a background task's own scratch files live beside.
|
|
201
|
+
*
|
|
202
|
+
* Derived from the task id, never from the command: the id is unique per launch, so two runs can
|
|
203
|
+
* never read one another's report, and the path survives a process restart the same way the task's
|
|
204
|
+
* log and exit file do.
|
|
205
|
+
*
|
|
206
|
+
* @param taskId - The `mol-bg-…` handle the launch returned.
|
|
207
|
+
* @returns The report file's absolute path.
|
|
208
|
+
*/
|
|
209
|
+
export declare function playwrightReportPathFor(taskId: string): string;
|
|
210
|
+
//# sourceMappingURL=playwright-report.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"playwright-report.d.ts","sourceRoot":"","sources":["../src/playwright-report.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,406 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The standard Playwright machine report, kept beside a run's log instead of inferred from it.
|
|
3
|
+
*
|
|
4
|
+
* The execution wrapper already puts a background suite on Playwright's `list` reporter and
|
|
5
|
+
* preserves a file reporter the executor named ({@link ./utilities.js} `withPlaywrightRunReport`,
|
|
6
|
+
* `streamingBackgroundCommand`). That log is text: which failure a trace, a route or a locator
|
|
7
|
+
* belongs to has to be reconstructed from printed headings, and a mis-join reads one failing
|
|
8
|
+
* test's evidence as another's (xr-molecule-flash-m411). Playwright already writes the answer down
|
|
9
|
+
* itself — its built-in `json` reporter records every test's own identity (project, file, line,
|
|
10
|
+
* column, title path, status, retries) and every attachment the runner saved for THAT test, path
|
|
11
|
+
* included.
|
|
12
|
+
*
|
|
13
|
+
* So the wrapper adds the `json` reporter to a run it already rewrites, sends its output to a
|
|
14
|
+
* per-run file with the reporter's own `PLAYWRIGHT_JSON_OUTPUT_FILE` option, and this module turns
|
|
15
|
+
* that file into a small, bounded record on the tool result ({@link PlaywrightRunReport}). The
|
|
16
|
+
* whole file stays where it was written, so full evidence has a path; the record carries only what
|
|
17
|
+
* a diagnosis needs.
|
|
18
|
+
*
|
|
19
|
+
* Honesty rules, which every reader below follows:
|
|
20
|
+
*
|
|
21
|
+
* - A missing, empty, truncated or wrongly shaped file is NOT "the run failed nothing": it is
|
|
22
|
+
* `missing` / `malformed`, and a record that parsed but is not a whole run (`errors` present, no
|
|
23
|
+
* `suites`) is `partial`. Only a record with the runner's own stats and suite tree is `complete`.
|
|
24
|
+
* - The record never carries a pass/fail verdict and must never be read as one. Suite selection,
|
|
25
|
+
* retries, budgets and the platform's own proof decisions stay exactly where they were.
|
|
26
|
+
* - Nothing here parses console output, and nothing reads a report the executor asked for itself
|
|
27
|
+
* (a `json` reporter already named on the command, or a `PLAYWRIGHT_JSON_OUTPUT_FILE` the command
|
|
28
|
+
* sets): the executor's own artifact is theirs.
|
|
29
|
+
*
|
|
30
|
+
* @module
|
|
31
|
+
*/
|
|
32
|
+
import { posix } from 'path';
|
|
33
|
+
/**
|
|
34
|
+
* The environment variable Playwright's built-in `json` reporter takes its output path from
|
|
35
|
+
* (`resolveOutputFile("JSON", …)`), resolved against the runner's own working directory. An
|
|
36
|
+
* absolute path is used here, so the file lands in the run's scratch area whatever directory the
|
|
37
|
+
* suite runs from.
|
|
38
|
+
*/
|
|
39
|
+
export const PLAYWRIGHT_REPORT_ENV = 'PLAYWRIGHT_JSON_OUTPUT_FILE';
|
|
40
|
+
/** The file name a background task's report is written to, beside its own log. */
|
|
41
|
+
export const PLAYWRIGHT_REPORT_SUFFIX = '.playwright.json';
|
|
42
|
+
/**
|
|
43
|
+
* How big a report may be before this module refuses to summarize it. The file stays readable at
|
|
44
|
+
* its path; the record only says so. A whole 139-test suite's report is well under a megabyte; a
|
|
45
|
+
* report past this is not one a tool result should carry.
|
|
46
|
+
*/
|
|
47
|
+
export const MAX_REPORT_PARSE_CHARS = 8_000_000;
|
|
48
|
+
/** How many failing tests a record lists before the rest are counted in `omittedFailures`. */
|
|
49
|
+
export const MAX_REPORTED_FAILURES = 12;
|
|
50
|
+
/** How many attachments one failing test keeps in the record (`trace` first). */
|
|
51
|
+
export const MAX_REPORTED_ATTACHMENTS = 4;
|
|
52
|
+
/** How much of one failure's own error text the record keeps. */
|
|
53
|
+
export const MAX_REPORTED_ERROR_CHARS = 400;
|
|
54
|
+
/** How much of one printed path the record keeps. */
|
|
55
|
+
const MAX_REPORTED_PATH_CHARS = 300;
|
|
56
|
+
/** How much of one title the record keeps. */
|
|
57
|
+
const MAX_REPORTED_TITLE_CHARS = 300;
|
|
58
|
+
/**
|
|
59
|
+
* The terminal formatting Playwright bakes into an error message — `expect` diffs are written for a
|
|
60
|
+
* terminal, so the report's own `error.message` carries SGR sequences. Stripped here, before the
|
|
61
|
+
* consumer's redactor, so a result never carries `[2m`/`[22m` fragments as if they were text.
|
|
62
|
+
*/
|
|
63
|
+
// eslint-disable-next-line no-control-regex -- an escape sequence IS a control character
|
|
64
|
+
const ANSI_SEQUENCE = /\u001B\[[0-9;?]*[A-Za-z]/g;
|
|
65
|
+
/** One plain record out of unknown JSON, or null when the value is not an object. */
|
|
66
|
+
function asRecord(value) {
|
|
67
|
+
return typeof value === 'object' && value !== null && !Array.isArray(value)
|
|
68
|
+
? value
|
|
69
|
+
: null;
|
|
70
|
+
}
|
|
71
|
+
/** A finite number from unknown JSON, or null. */
|
|
72
|
+
function asNumber(value) {
|
|
73
|
+
return typeof value === 'number' && Number.isFinite(value) ? value : null;
|
|
74
|
+
}
|
|
75
|
+
/** A non-empty string from unknown JSON, or null. */
|
|
76
|
+
function asString(value) {
|
|
77
|
+
return typeof value === 'string' && value !== '' ? value : null;
|
|
78
|
+
}
|
|
79
|
+
/** A string cut to {@link MAX_REPORTED_PATH_CHARS}. */
|
|
80
|
+
function boundedPath(value) {
|
|
81
|
+
return value.length > MAX_REPORTED_PATH_CHARS
|
|
82
|
+
? `${value.slice(0, MAX_REPORTED_PATH_CHARS)}…`
|
|
83
|
+
: value;
|
|
84
|
+
}
|
|
85
|
+
/** A string cut to {@link MAX_REPORTED_TITLE_CHARS}. */
|
|
86
|
+
function boundedTitle(value) {
|
|
87
|
+
return value.length > MAX_REPORTED_TITLE_CHARS
|
|
88
|
+
? `${value.slice(0, MAX_REPORTED_TITLE_CHARS)}…`
|
|
89
|
+
: value;
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* The report statuses for which the report's own per-test identities and attachments may be used.
|
|
93
|
+
*
|
|
94
|
+
* `partial` is included because a partial report's suite tree, where it parsed, is still the
|
|
95
|
+
* runner's own record of which test owns which attachment; `malformed` and `missing` are not,
|
|
96
|
+
* because nothing about them is runner data.
|
|
97
|
+
*
|
|
98
|
+
* @param status - One record's {@link PlaywrightReportStatus}.
|
|
99
|
+
* @returns True when the record's tests and attachments are the runner's own.
|
|
100
|
+
*/
|
|
101
|
+
export function reportCarriesIdentities(status) {
|
|
102
|
+
return status === 'complete' || status === 'partial';
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* The attachments a stored record actually carries.
|
|
106
|
+
*
|
|
107
|
+
* A record read back from a transcript is not guaranteed to be the shape this module wrote — a
|
|
108
|
+
* damaged, truncated or hand-edited one can carry a null entry, a non-array field or an attachment
|
|
109
|
+
* without a path. Every reader goes through here so a damaged record answers "no artifact", never a
|
|
110
|
+
* thrown error and never another test's trace.
|
|
111
|
+
*
|
|
112
|
+
* @param test - One entry of {@link PlaywrightRunReport.failures}, as stored.
|
|
113
|
+
* @returns Its well-shaped attachments, in the record's own order.
|
|
114
|
+
*/
|
|
115
|
+
function storedAttachments(test) {
|
|
116
|
+
const raw = test?.attachments;
|
|
117
|
+
if (!Array.isArray(raw))
|
|
118
|
+
return [];
|
|
119
|
+
const out = [];
|
|
120
|
+
for (const entry of raw) {
|
|
121
|
+
const attachment = asRecord(entry);
|
|
122
|
+
if (attachment === null)
|
|
123
|
+
continue;
|
|
124
|
+
const path = asString(attachment.path);
|
|
125
|
+
if (path === null)
|
|
126
|
+
continue;
|
|
127
|
+
out.push({
|
|
128
|
+
name: asString(attachment.name) ?? '',
|
|
129
|
+
contentType: asString(attachment.contentType),
|
|
130
|
+
path,
|
|
131
|
+
});
|
|
132
|
+
}
|
|
133
|
+
return out;
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* The attachment paths a stored test record carries, `trace` first.
|
|
137
|
+
*
|
|
138
|
+
* @param test - One entry of {@link PlaywrightRunReport.failures}, as stored.
|
|
139
|
+
* @returns Every saved path the record can prove, in its own order.
|
|
140
|
+
*/
|
|
141
|
+
export function reportTestAttachmentPaths(test) {
|
|
142
|
+
return storedAttachments(test).map((attachment) => attachment.path);
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* The directory a test result's own artifacts were saved in, or null when the report names none.
|
|
146
|
+
*
|
|
147
|
+
* Playwright writes one directory per test attempt under the run's `outputDir`, and every artifact
|
|
148
|
+
* of that attempt — `trace.zip` included — sits in it. The directory is therefore the exact
|
|
149
|
+
* ownership mark for a trace: two tests' traces are never in one another's directory. A damaged
|
|
150
|
+
* record whose attachment entries carry no path answers null, so nothing is claimed from it.
|
|
151
|
+
*
|
|
152
|
+
* @param test - One entry of {@link PlaywrightRunReport.failures}, as stored.
|
|
153
|
+
* @returns The posix-normalized directory, or null.
|
|
154
|
+
*/
|
|
155
|
+
export function reportTestArtifactDir(test) {
|
|
156
|
+
const attachment = storedAttachments(test).find((one) => one.path !== '');
|
|
157
|
+
return attachment === undefined ? null : posix.dirname(attachment.path);
|
|
158
|
+
}
|
|
159
|
+
/** The attachments of one attempt, `trace` first and bounded. */
|
|
160
|
+
function attachmentsOf(result) {
|
|
161
|
+
const raw = Array.isArray(result.attachments) ? result.attachments : [];
|
|
162
|
+
const out = [];
|
|
163
|
+
for (const entry of raw) {
|
|
164
|
+
const attachment = asRecord(entry);
|
|
165
|
+
if (attachment === null)
|
|
166
|
+
continue;
|
|
167
|
+
const path = asString(attachment.path);
|
|
168
|
+
if (path === null)
|
|
169
|
+
continue;
|
|
170
|
+
out.push({
|
|
171
|
+
name: asString(attachment.name) ?? '',
|
|
172
|
+
contentType: asString(attachment.contentType),
|
|
173
|
+
path: boundedPath(path),
|
|
174
|
+
});
|
|
175
|
+
}
|
|
176
|
+
// `trace` first: it is the artifact a failure diagnosis reads, and the `body` Playwright may
|
|
177
|
+
// inline is deliberately dropped — it is base64 evidence the file path already carries.
|
|
178
|
+
out.sort((left, right) => Number(right.name === 'trace') - Number(left.name === 'trace'));
|
|
179
|
+
return out.slice(0, MAX_REPORTED_ATTACHMENTS);
|
|
180
|
+
}
|
|
181
|
+
/**
|
|
182
|
+
* The attempt whose evidence describes the test's failure: the LAST attempt that did not pass.
|
|
183
|
+
*
|
|
184
|
+
* A retried test reports one result per attempt. A flaky test's final attempt passed, but the
|
|
185
|
+
* failure it is reported for happened in the earlier one, and that is where the trace was kept
|
|
186
|
+
* (`retain-on-failure`).
|
|
187
|
+
*
|
|
188
|
+
* @param results - One test's `results` array, in attempt order.
|
|
189
|
+
* @returns The chosen attempt and its index, or null when there is none.
|
|
190
|
+
*/
|
|
191
|
+
function evidenceAttempt(results) {
|
|
192
|
+
let chosen = null;
|
|
193
|
+
for (let index = 0; index < results.length; index += 1) {
|
|
194
|
+
const result = asRecord(results[index]);
|
|
195
|
+
const status = result === null ? null : asString(result.status);
|
|
196
|
+
if (result === null || status === null)
|
|
197
|
+
continue;
|
|
198
|
+
if (status !== 'passed' && status !== 'skipped')
|
|
199
|
+
chosen = { result, index };
|
|
200
|
+
}
|
|
201
|
+
if (chosen !== null)
|
|
202
|
+
return chosen;
|
|
203
|
+
const last = asRecord(results[results.length - 1]);
|
|
204
|
+
return last === null ? null : { result: last, index: results.length - 1 };
|
|
205
|
+
}
|
|
206
|
+
/** One test's own error text, bounded and sanitized, or null. */
|
|
207
|
+
function errorOf(result, sanitize) {
|
|
208
|
+
const errors = Array.isArray(result.errors) ? result.errors : [];
|
|
209
|
+
const first = asRecord(errors[0]);
|
|
210
|
+
const message = (first === null ? null : asString(first.message)) ?? null;
|
|
211
|
+
const direct = asRecord(result.error);
|
|
212
|
+
const text = message ?? (direct === null ? null : asString(direct.message));
|
|
213
|
+
if (text === null)
|
|
214
|
+
return null;
|
|
215
|
+
const plain = text.replace(ANSI_SEQUENCE, '');
|
|
216
|
+
const bounded = plain.length > MAX_REPORTED_ERROR_CHARS ? `${plain.slice(0, MAX_REPORTED_ERROR_CHARS)}…` : plain;
|
|
217
|
+
return sanitize(bounded);
|
|
218
|
+
}
|
|
219
|
+
/** Whether one test entry should be listed: a failure, a retried failure, or an interruption. */
|
|
220
|
+
function isFailingTest(status, results) {
|
|
221
|
+
if (status === 'unexpected' || status === 'flaky')
|
|
222
|
+
return true;
|
|
223
|
+
return results.some((entry) => {
|
|
224
|
+
const result = asRecord(entry);
|
|
225
|
+
const resultStatus = result === null ? null : asString(result.status);
|
|
226
|
+
return (resultStatus === 'failed' || resultStatus === 'timedOut' || resultStatus === 'interrupted');
|
|
227
|
+
});
|
|
228
|
+
}
|
|
229
|
+
/**
|
|
230
|
+
* Every test entry under one suite, with the suite titles that lead to it.
|
|
231
|
+
*
|
|
232
|
+
* @param suite - One suite of the report's tree.
|
|
233
|
+
* @param prefix - The titles of the suites above it.
|
|
234
|
+
* @param out - Where the entries collect.
|
|
235
|
+
* @param fileSuite - True for a top-level entry, whose title is the file path rather than a
|
|
236
|
+
* `describe` block: it is not part of a test's title path.
|
|
237
|
+
*/
|
|
238
|
+
function specsIn(suite, prefix, out, fileSuite = false) {
|
|
239
|
+
const title = fileSuite ? null : asString(suite.title);
|
|
240
|
+
const titlePath = title === null ? [...prefix] : [...prefix, title];
|
|
241
|
+
const specs = Array.isArray(suite.specs) ? suite.specs : [];
|
|
242
|
+
for (const entry of specs) {
|
|
243
|
+
const spec = asRecord(entry);
|
|
244
|
+
if (spec !== null)
|
|
245
|
+
out.push({ spec, titlePath });
|
|
246
|
+
}
|
|
247
|
+
const children = Array.isArray(suite.suites) ? suite.suites : [];
|
|
248
|
+
for (const entry of children) {
|
|
249
|
+
const child = asRecord(entry);
|
|
250
|
+
if (child !== null)
|
|
251
|
+
specsIn(child, titlePath, out);
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
/** One record for a report this module could not parse, with the reason. */
|
|
255
|
+
function unusable(status, path, reason) {
|
|
256
|
+
return { status, path, reason, stats: null, failures: [], omittedFailures: 0 };
|
|
257
|
+
}
|
|
258
|
+
/**
|
|
259
|
+
* Summarize one Playwright `json` report into the bounded record a tool result carries.
|
|
260
|
+
*
|
|
261
|
+
* Pure text in, record out: the caller reads the file (and decides whether it may), so this is
|
|
262
|
+
* testable against genuine reports and against malformed controls alike.
|
|
263
|
+
*
|
|
264
|
+
* @param text - The report file's text, exactly as written.
|
|
265
|
+
* @param options - Where the file is, and the consumer's redactor for error text.
|
|
266
|
+
* @param options.path - The report file's path, carried on the record for full evidence.
|
|
267
|
+
* @param options.sanitize - Redactor applied to error text (defaults to the identity).
|
|
268
|
+
* @returns The bounded record; never a verdict.
|
|
269
|
+
*/
|
|
270
|
+
export function summarizePlaywrightReport(text, options) {
|
|
271
|
+
const path = options.path;
|
|
272
|
+
const sanitize = options.sanitize ?? ((value) => value);
|
|
273
|
+
if (text.trim() === '')
|
|
274
|
+
return unusable('malformed', path, 'the report file is empty');
|
|
275
|
+
if (text.length > MAX_REPORT_PARSE_CHARS)
|
|
276
|
+
return unusable('partial', path, `the report is larger than ${MAX_REPORT_PARSE_CHARS} characters and was not summarized`);
|
|
277
|
+
let root;
|
|
278
|
+
try {
|
|
279
|
+
root = JSON.parse(text);
|
|
280
|
+
}
|
|
281
|
+
catch (_error) {
|
|
282
|
+
// A truncated or non-JSON file is not runner data at all: say malformed, never zero failures.
|
|
283
|
+
return unusable('malformed', path, 'the report file is not valid JSON (it may be truncated)');
|
|
284
|
+
}
|
|
285
|
+
const report = asRecord(root);
|
|
286
|
+
if (report === null)
|
|
287
|
+
return unusable('malformed', path, 'the report is not a JSON object');
|
|
288
|
+
const rawStats = asRecord(report.stats);
|
|
289
|
+
const expected = rawStats === null ? null : asNumber(rawStats.expected);
|
|
290
|
+
const skipped = rawStats === null ? null : asNumber(rawStats.skipped);
|
|
291
|
+
const unexpected = rawStats === null ? null : asNumber(rawStats.unexpected);
|
|
292
|
+
const flaky = rawStats === null ? null : asNumber(rawStats.flaky);
|
|
293
|
+
const durationMs = rawStats === null ? null : asNumber(rawStats.duration);
|
|
294
|
+
const stats = expected === null ||
|
|
295
|
+
skipped === null ||
|
|
296
|
+
unexpected === null ||
|
|
297
|
+
flaky === null ||
|
|
298
|
+
durationMs === null
|
|
299
|
+
? null
|
|
300
|
+
: { expected, skipped, unexpected, flaky, durationMs };
|
|
301
|
+
const suites = Array.isArray(report.suites) ? report.suites : null;
|
|
302
|
+
const errors = Array.isArray(report.errors) ? report.errors.length : 0;
|
|
303
|
+
if (suites === null)
|
|
304
|
+
return unusable('partial', path, 'the report carries no suite tree (the run was cut short)');
|
|
305
|
+
// Every spec under every project, with the describe titles that lead to it. The report's
|
|
306
|
+
// top-level entries are FILE suites — their title is the file path the spec's own `file` already
|
|
307
|
+
// carries — so that level is not part of a test's title path.
|
|
308
|
+
const specs = [];
|
|
309
|
+
for (const entry of suites) {
|
|
310
|
+
const suite = asRecord(entry);
|
|
311
|
+
if (suite !== null)
|
|
312
|
+
specsIn(suite, [], specs, true);
|
|
313
|
+
}
|
|
314
|
+
const failures = [];
|
|
315
|
+
for (const { spec, titlePath } of specs) {
|
|
316
|
+
const specTitle = asString(spec.title) ?? '';
|
|
317
|
+
const file = asString(spec.file) ?? '';
|
|
318
|
+
const line = asNumber(spec.line) ?? 0;
|
|
319
|
+
const column = asNumber(spec.column) ?? 0;
|
|
320
|
+
const specId = asString(spec.id);
|
|
321
|
+
const tests = Array.isArray(spec.tests) ? spec.tests : [];
|
|
322
|
+
for (const entry of tests) {
|
|
323
|
+
const test = asRecord(entry);
|
|
324
|
+
if (test === null)
|
|
325
|
+
continue;
|
|
326
|
+
const status = asString(test.status) ?? '';
|
|
327
|
+
const results = Array.isArray(test.results) ? test.results : [];
|
|
328
|
+
if (!isFailingTest(status, results))
|
|
329
|
+
continue;
|
|
330
|
+
const evidence = evidenceAttempt(results);
|
|
331
|
+
const titles = [...titlePath, specTitle].filter((part) => part !== '');
|
|
332
|
+
failures.push({
|
|
333
|
+
id: specId,
|
|
334
|
+
project: asString(test.projectName),
|
|
335
|
+
file: boundedPath(file),
|
|
336
|
+
line,
|
|
337
|
+
column,
|
|
338
|
+
titlePath: titles.map(boundedTitle),
|
|
339
|
+
title: boundedTitle(specTitle),
|
|
340
|
+
status,
|
|
341
|
+
attempts: results.length,
|
|
342
|
+
retry: evidence === null ? 0 : (asNumber(evidence.result.retry) ?? evidence.index),
|
|
343
|
+
durationMs: evidence === null ? 0 : (asNumber(evidence.result.duration) ?? 0),
|
|
344
|
+
error: evidence === null ? null : errorOf(evidence.result, sanitize),
|
|
345
|
+
attachments: evidence === null ? [] : attachmentsOf(evidence.result),
|
|
346
|
+
});
|
|
347
|
+
}
|
|
348
|
+
}
|
|
349
|
+
const omittedFailures = Math.max(0, failures.length - MAX_REPORTED_FAILURES);
|
|
350
|
+
// The runner's tally and its own tree must agree. A record whose stats name more failures than
|
|
351
|
+
// the tree lists is not a whole record — a truncated write, a merged or hand-edited file — and
|
|
352
|
+
// must not be read as complete just because both fields parsed. The bound this module applies is
|
|
353
|
+
// counted in `omittedFailures`, so it is compared against the list BEFORE the cap.
|
|
354
|
+
const namedFailures = stats === null ? null : stats.unexpected + stats.flaky;
|
|
355
|
+
const treeShort = namedFailures !== null && failures.length < namedFailures;
|
|
356
|
+
// Playwright's own global errors mean the run did not walk everything it planned to (a config
|
|
357
|
+
// error, a worker crash): the per-test entries that did parse are still the runner's own.
|
|
358
|
+
const status = stats === null || errors > 0 || treeShort ? 'partial' : 'complete';
|
|
359
|
+
const reason = stats === null
|
|
360
|
+
? 'the report carries no run stats'
|
|
361
|
+
: errors > 0
|
|
362
|
+
? `the run reported ${errors} error(s) of its own`
|
|
363
|
+
: treeShort
|
|
364
|
+
? `the run’s stats name ${namedFailures} failing test(s) but its tree lists ${failures.length}`
|
|
365
|
+
: undefined;
|
|
366
|
+
return {
|
|
367
|
+
status,
|
|
368
|
+
path,
|
|
369
|
+
...(reason === undefined ? {} : { reason }),
|
|
370
|
+
stats,
|
|
371
|
+
failures: failures.slice(0, MAX_REPORTED_FAILURES),
|
|
372
|
+
omittedFailures,
|
|
373
|
+
};
|
|
374
|
+
}
|
|
375
|
+
/**
|
|
376
|
+
* The report path a command was launched with, when it is the one this platform sets.
|
|
377
|
+
*
|
|
378
|
+
* Read back from the launched script (and from a completed task's own command) so a record written
|
|
379
|
+
* before an API restart is still found: the path is the task's own id derived by
|
|
380
|
+
* {@link playwrightReportPathFor}, never a path parsed out of the executor's command.
|
|
381
|
+
*
|
|
382
|
+
* @param command - The command as it was launched.
|
|
383
|
+
* @param expectedPath - The one path this task's report may be at.
|
|
384
|
+
* @returns True when the command sets {@link PLAYWRIGHT_REPORT_ENV} to that exact path.
|
|
385
|
+
*/
|
|
386
|
+
export function commandWritesReportTo(command, expectedPath) {
|
|
387
|
+
const quoted = new RegExp(`(?:^|[\\s;])${PLAYWRIGHT_REPORT_ENV}=(['"]?)${escapeRegExp(expectedPath)}\\1(?:[\\s;]|$)`);
|
|
388
|
+
return quoted.test(command);
|
|
389
|
+
}
|
|
390
|
+
/**
|
|
391
|
+
* The report file a background task's own scratch files live beside.
|
|
392
|
+
*
|
|
393
|
+
* Derived from the task id, never from the command: the id is unique per launch, so two runs can
|
|
394
|
+
* never read one another's report, and the path survives a process restart the same way the task's
|
|
395
|
+
* log and exit file do.
|
|
396
|
+
*
|
|
397
|
+
* @param taskId - The `mol-bg-…` handle the launch returned.
|
|
398
|
+
* @returns The report file's absolute path.
|
|
399
|
+
*/
|
|
400
|
+
export function playwrightReportPathFor(taskId) {
|
|
401
|
+
return `/tmp/${taskId}${PLAYWRIGHT_REPORT_SUFFIX}`;
|
|
402
|
+
}
|
|
403
|
+
/** A string with every regular-expression metacharacter escaped. */
|
|
404
|
+
function escapeRegExp(value) {
|
|
405
|
+
return value.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
406
|
+
}
|
package/dist/suite-overlap.d.ts
CHANGED
|
@@ -79,13 +79,15 @@ export declare function namesSuiteConfig(command: string): boolean;
|
|
|
79
79
|
export declare function withSuiteConfig(command: string, config: string | null | undefined): string;
|
|
80
80
|
/**
|
|
81
81
|
* The whole-suite command made scoped to the tests it should re-run instead: the same
|
|
82
|
-
* invocation — same
|
|
83
|
-
*
|
|
82
|
+
* invocation — same launcher, same settings — with the named `file:line`s in place of every
|
|
83
|
+
* positional selection the run carried (a spec file, a suite directory or a regex filter),
|
|
84
|
+
* `--last-failed` dropped (it re-runs the tests that never ran too, X1 flash-m60) and
|
|
84
85
|
* `--retries=0` set (a re-run of a known failure does not need to pay for retries).
|
|
85
86
|
*
|
|
86
87
|
* The re-run keeps the run's `> <file>` redirect only in the sense of keeping its OUTPUT there:
|
|
87
|
-
* the target is rewritten to a fresh sibling ({@link
|
|
88
|
-
* overwrites the log the run itself is the evidence for (xr-molecule-flash-m173)
|
|
88
|
+
* the target is rewritten to a fresh sibling ({@link redirectRunnerOutputsToFreshFiles}), so a
|
|
89
|
+
* re-run never overwrites the log the run itself is the evidence for (xr-molecule-flash-m173) —
|
|
90
|
+
* and the setup around the run keeps its own file writes untouched (xr-molecule-flash-m429).
|
|
89
91
|
*
|
|
90
92
|
* `config` is the config the run was measured under ({@link withSuiteConfig}): the narrowed re-run
|
|
91
93
|
* carries it whenever the command itself does not, so a run that dropped `--config` cannot be
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"suite-overlap.d.ts","sourceRoot":"","sources":["../src/suite-overlap.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;
|
|
1
|
+
{"version":3,"file":"suite-overlap.d.ts","sourceRoot":"","sources":["../src/suite-overlap.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AAaH;;;;;;;;;GASG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAEvD;AAED;;;;;;;;;GASG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAoB1D;AAKD;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAEzD;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,CAS1F;AAoOD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AACH,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,SAAS,MAAM,EAAE,EAC5B,QAAQ,GAAE,SAAS,MAAM,EAAO,EAChC,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,EACtB,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,EACnB,GAAG,GAAE,SAAS,aAAa,EAAO,GACjC,MAAM,CAgDR;AAED,4DAA4D;AAC5D,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,MAAM,CAAA;CACd;AAmCD;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,GAAE,SAAS,aAAa,EAAO,GAAG,MAAM,CAe3F;AAwOD;;;;;;GAMG;AACH,MAAM,WAAW,gBAAgB;IAC/B,+FAA+F;IAC/F,SAAS,EAAE,OAAO,CAAA;IAClB,oFAAoF;IACpF,MAAM,EAAE,MAAM,CAAA;IACd;;;;OAIG;IACH,gBAAgB,CAAC,EAAE,OAAO,CAAA;CAC3B;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,SAAS,gBAAgB,EACzD,SAAS,EAAE;IAAE,MAAM,EAAE,MAAM,CAAA;CAAE,EAC7B,QAAQ,EAAE,SAAS,CAAC,EAAE,GACrB,CAAC,GAAG,IAAI,CAMV;AA2FD;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC;;;OAGG;IACH,kBAAkB,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;CACvC;AAmCD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsCG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,mBAAmB,GAAG,OAAO,CAYtF"}
|