@aplaytest/runner-playwright 0.1.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/dist/.tsbuildinfo +1 -0
- package/dist/api-fixtures.d.ts +71 -0
- package/dist/api-fixtures.d.ts.map +1 -0
- package/dist/api-fixtures.js +162 -0
- package/dist/api-fixtures.js.map +1 -0
- package/dist/assemble.d.ts +86 -0
- package/dist/assemble.d.ts.map +1 -0
- package/dist/assemble.js +176 -0
- package/dist/assemble.js.map +1 -0
- package/dist/bind.d.ts +43 -0
- package/dist/bind.d.ts.map +1 -0
- package/dist/bind.js +112 -0
- package/dist/bind.js.map +1 -0
- package/dist/fixtures.d.ts +54 -0
- package/dist/fixtures.d.ts.map +1 -0
- package/dist/fixtures.js +210 -0
- package/dist/fixtures.js.map +1 -0
- package/dist/index.d.ts +31 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +24 -0
- package/dist/index.js.map +1 -0
- package/dist/reporter.d.ts +79 -0
- package/dist/reporter.d.ts.map +1 -0
- package/dist/reporter.js +277 -0
- package/dist/reporter.js.map +1 -0
- package/dist/sidecar.d.ts +134 -0
- package/dist/sidecar.d.ts.map +1 -0
- package/dist/sidecar.js +111 -0
- package/dist/sidecar.js.map +1 -0
- package/dist/spawn.d.ts +57 -0
- package/dist/spawn.d.ts.map +1 -0
- package/dist/spawn.js +170 -0
- package/dist/spawn.js.map +1 -0
- package/dist/steps.d.ts +45 -0
- package/dist/steps.d.ts.map +1 -0
- package/dist/steps.js +106 -0
- package/dist/steps.js.map +1 -0
- package/dist-cjs/.tsbuildinfo +1 -0
- package/dist-cjs/api-fixtures.js +166 -0
- package/dist-cjs/api-fixtures.js.map +1 -0
- package/dist-cjs/assemble.js +181 -0
- package/dist-cjs/assemble.js.map +1 -0
- package/dist-cjs/bind.js +117 -0
- package/dist-cjs/bind.js.map +1 -0
- package/dist-cjs/fixtures.js +215 -0
- package/dist-cjs/fixtures.js.map +1 -0
- package/dist-cjs/index.js +64 -0
- package/dist-cjs/index.js.map +1 -0
- package/dist-cjs/package.json +3 -0
- package/dist-cjs/reporter.js +282 -0
- package/dist-cjs/reporter.js.map +1 -0
- package/dist-cjs/sidecar.js +116 -0
- package/dist-cjs/sidecar.js.map +1 -0
- package/dist-cjs/spawn.js +174 -0
- package/dist-cjs/spawn.js.map +1 -0
- package/dist-cjs/steps.js +112 -0
- package/dist-cjs/steps.js.map +1 -0
- package/package.json +51 -0
package/dist-cjs/bind.js
ADDED
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Page-object binding with step instrumentation.
|
|
4
|
+
*
|
|
5
|
+
* A drop-in for the common `bindPage(module, page)` helper: it binds each
|
|
6
|
+
* exported function's first `page` argument, and additionally wraps the call
|
|
7
|
+
* in `test.step()` so the call trail reaches the reporter.
|
|
8
|
+
*
|
|
9
|
+
* That trail is the difference between a failure that says
|
|
10
|
+
*
|
|
11
|
+
* locator getByTestId('gym-card-name') did not resolve
|
|
12
|
+
*
|
|
13
|
+
* and one that says
|
|
14
|
+
*
|
|
15
|
+
* gymsPage.expectCardData({ name: 'Blackwater Valley BJJ' }) failed
|
|
16
|
+
*
|
|
17
|
+
* The first states where the test looked; the second states what it WANTED,
|
|
18
|
+
* and the domain values in it are what candidate generation matches against
|
|
19
|
+
* the page's accessibility tree.
|
|
20
|
+
*/
|
|
21
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
22
|
+
exports.previewValue = previewValue;
|
|
23
|
+
exports.previewArgs = previewArgs;
|
|
24
|
+
exports.bindPage = bindPage;
|
|
25
|
+
const test_1 = require("@playwright/test");
|
|
26
|
+
/** Values whose contents must never reach a step title. */
|
|
27
|
+
const SENSITIVE_KEYS = ['password', 'token', 'secret', 'authorization', 'apikey', 'api_key'];
|
|
28
|
+
const MAX_PREVIEW_LENGTH = 120;
|
|
29
|
+
const MAX_DEPTH = 2;
|
|
30
|
+
function isIdentifier(key) {
|
|
31
|
+
return /^[A-Za-z_$][\w$]*$/.test(key);
|
|
32
|
+
}
|
|
33
|
+
function isSensitive(key) {
|
|
34
|
+
const normalised = key.toLowerCase().replace(/[-_]/g, '');
|
|
35
|
+
return SENSITIVE_KEYS.some(k => normalised.includes(k.replace(/[-_]/g, '')));
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Render arguments the way a developer would have written them —
|
|
39
|
+
* `{ name: 'Blackwater Valley BJJ' }`, not `{"name":"Blackwater Valley BJJ"}`.
|
|
40
|
+
*
|
|
41
|
+
* The distinction is load-bearing, not cosmetic: domain-value extraction pulls
|
|
42
|
+
* quoted literals out of this string, and JSON's quoted KEYS would arrive
|
|
43
|
+
* looking exactly like values. `name` would then be matched against the ARIA
|
|
44
|
+
* tree alongside the gym it labels.
|
|
45
|
+
*/
|
|
46
|
+
function previewValue(value, depth = 0) {
|
|
47
|
+
if (value === null)
|
|
48
|
+
return 'null';
|
|
49
|
+
if (value === undefined)
|
|
50
|
+
return 'undefined';
|
|
51
|
+
switch (typeof value) {
|
|
52
|
+
case 'string':
|
|
53
|
+
return `'${value.replace(/'/g, "\\'")}'`;
|
|
54
|
+
case 'number':
|
|
55
|
+
case 'boolean':
|
|
56
|
+
case 'bigint':
|
|
57
|
+
return String(value);
|
|
58
|
+
case 'function':
|
|
59
|
+
return 'fn';
|
|
60
|
+
case 'symbol':
|
|
61
|
+
return value.toString();
|
|
62
|
+
default:
|
|
63
|
+
break;
|
|
64
|
+
}
|
|
65
|
+
if (depth >= MAX_DEPTH)
|
|
66
|
+
return Array.isArray(value) ? '[…]' : '{…}';
|
|
67
|
+
if (Array.isArray(value)) {
|
|
68
|
+
return `[${value.map(v => previewValue(v, depth + 1)).join(', ')}]`;
|
|
69
|
+
}
|
|
70
|
+
if (value instanceof RegExp)
|
|
71
|
+
return value.toString();
|
|
72
|
+
if (value instanceof Date)
|
|
73
|
+
return value.toISOString();
|
|
74
|
+
const entries = Object.entries(value).map(([key, inner]) => {
|
|
75
|
+
const renderedKey = isIdentifier(key) ? key : `'${key}'`;
|
|
76
|
+
const renderedValue = isSensitive(key) ? "'[redacted]'" : previewValue(inner, depth + 1);
|
|
77
|
+
return `${renderedKey}: ${renderedValue}`;
|
|
78
|
+
});
|
|
79
|
+
return entries.length === 0 ? '{}' : `{ ${entries.join(', ')} }`;
|
|
80
|
+
}
|
|
81
|
+
function previewArgs(args) {
|
|
82
|
+
const rendered = args.map(a => previewValue(a)).join(', ');
|
|
83
|
+
return rendered.length > MAX_PREVIEW_LENGTH
|
|
84
|
+
? `${rendered.slice(0, MAX_PREVIEW_LENGTH - 1)}…`
|
|
85
|
+
: rendered;
|
|
86
|
+
}
|
|
87
|
+
function isAsyncFunction(fn) {
|
|
88
|
+
return typeof fn === 'function' && fn.constructor.name === 'AsyncFunction';
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Bind a page-object module to a page.
|
|
92
|
+
*
|
|
93
|
+
* `name` is what appears before the method in the step title, and should match
|
|
94
|
+
* the fixture name the specs use (`gymsPage`) so a reader sees the same
|
|
95
|
+
* vocabulary in the report as in the test.
|
|
96
|
+
*/
|
|
97
|
+
function bindPage(mod, page, name) {
|
|
98
|
+
const bound = {};
|
|
99
|
+
for (const [key, value] of Object.entries(mod)) {
|
|
100
|
+
if (typeof value !== 'function') {
|
|
101
|
+
bound[key] = value;
|
|
102
|
+
continue;
|
|
103
|
+
}
|
|
104
|
+
const fn = value;
|
|
105
|
+
// Only async functions are wrapped. `test.step` always returns a promise,
|
|
106
|
+
// so wrapping a synchronous helper would silently change its contract and
|
|
107
|
+
// make the mapped return type a lie.
|
|
108
|
+
if (!isAsyncFunction(fn)) {
|
|
109
|
+
bound[key] = (...args) => fn(page, ...args);
|
|
110
|
+
continue;
|
|
111
|
+
}
|
|
112
|
+
const label = name === undefined ? key : `${name}.${key}`;
|
|
113
|
+
bound[key] = (...args) => test_1.test.step(`${label}(${previewArgs(args)})`, () => fn(page, ...args));
|
|
114
|
+
}
|
|
115
|
+
return bound;
|
|
116
|
+
}
|
|
117
|
+
//# sourceMappingURL=bind.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bind.js","sourceRoot":"","sources":["../src/bind.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,215 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Capture fixtures — the optional upgrade over the reporter alone.
|
|
4
|
+
*
|
|
5
|
+
* A Playwright reporter runs in the main process and cannot reach into the
|
|
6
|
+
* browser, so the things that best explain a failure — the ARIA tree, which
|
|
7
|
+
* test ids actually exist, what the network did, what the app logged — have to
|
|
8
|
+
* be collected in the worker and handed over as attachments.
|
|
9
|
+
*
|
|
10
|
+
* Three properties this file must hold, in priority order:
|
|
11
|
+
*
|
|
12
|
+
* 1. NEVER fail a test. Every capture is wrapped; a capture error is a
|
|
13
|
+
* warning on stderr, never an exception. Diagnostics that can break the
|
|
14
|
+
* suite are worse than no diagnostics.
|
|
15
|
+
* 2. Cost nothing on green. The expensive work (ARIA snapshot, test-id
|
|
16
|
+
* sweep) runs only when a test has actually failed.
|
|
17
|
+
* 3. Need no spec changes. Registered with `auto: true`, so adding it is a
|
|
18
|
+
* one-line change in the fixture composition and nothing else.
|
|
19
|
+
*
|
|
20
|
+
* UI PROJECTS ONLY. `auto: true` plus a `{ page }` dependency means Playwright
|
|
21
|
+
* launches a browser for every test in the project, including tests that only
|
|
22
|
+
* use `request`. API projects must compose `atestApiFixtures` from
|
|
23
|
+
* ./api-fixtures.js instead — see the note there.
|
|
24
|
+
*/
|
|
25
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
26
|
+
exports.expect = exports.test = exports.atestFixtures = void 0;
|
|
27
|
+
exports.createCaptureFixture = createCaptureFixture;
|
|
28
|
+
const test_1 = require("@playwright/test");
|
|
29
|
+
const sidecar_js_1 = require("./sidecar.js");
|
|
30
|
+
const DEFAULTS = {
|
|
31
|
+
testIdAttribute: 'data-testid',
|
|
32
|
+
slowRequestMs: 2_000,
|
|
33
|
+
maxRequests: 200,
|
|
34
|
+
maxConsoleEntries: 100,
|
|
35
|
+
};
|
|
36
|
+
function warn(message) {
|
|
37
|
+
process.stderr.write(`[atest] ${message}\n`);
|
|
38
|
+
}
|
|
39
|
+
/** Run a capture step; never let it escape. */
|
|
40
|
+
async function safely(label, fn, fallback) {
|
|
41
|
+
try {
|
|
42
|
+
return await fn();
|
|
43
|
+
}
|
|
44
|
+
catch (error) {
|
|
45
|
+
warn(`capture "${label}" failed: ${error instanceof Error ? error.message : String(error)}`);
|
|
46
|
+
return fallback;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
async function attach(testInfo, name, payload) {
|
|
50
|
+
await safely(`attach ${name}`, async () => {
|
|
51
|
+
await testInfo.attach(name, {
|
|
52
|
+
body: JSON.stringify(payload),
|
|
53
|
+
contentType: 'application/json',
|
|
54
|
+
});
|
|
55
|
+
}, undefined);
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Collect every test id currently in the DOM.
|
|
59
|
+
*
|
|
60
|
+
* This single list answers the most common healing question — "was the id
|
|
61
|
+
* renamed, or is the element genuinely gone?" — without a model and without a
|
|
62
|
+
* second browser session.
|
|
63
|
+
*/
|
|
64
|
+
async function collectTestIds(page, attribute) {
|
|
65
|
+
const ids = await page.evaluate(attr => {
|
|
66
|
+
// Array.from rather than for-of: iterating a NodeList needs the
|
|
67
|
+
// DOM.Iterable lib, and this package should carry the smallest browser
|
|
68
|
+
// surface that compiles.
|
|
69
|
+
const values = Array.from(document.querySelectorAll(`[${attr}]`), element => element.getAttribute(attr));
|
|
70
|
+
return values.filter((value) => value !== null && value !== '');
|
|
71
|
+
}, attribute);
|
|
72
|
+
return [...new Set(ids)].sort();
|
|
73
|
+
}
|
|
74
|
+
function createCaptureFixture(options = {}) {
|
|
75
|
+
const config = { ...DEFAULTS, ...options };
|
|
76
|
+
return async ({ page }, use, testInfo) => {
|
|
77
|
+
const requests = [];
|
|
78
|
+
const consoleErrors = [];
|
|
79
|
+
const consoleWarnings = [];
|
|
80
|
+
const started = new Map();
|
|
81
|
+
const routes = new Set();
|
|
82
|
+
/**
|
|
83
|
+
* Route coverage is recorded for EVERY test, passing or failing — unlike
|
|
84
|
+
* the failure evidence below. It costs one listener and a Set, and it is
|
|
85
|
+
* what lets impact analysis narrow past a shared fixture barrel that
|
|
86
|
+
* makes every spec look like it depends on every feature.
|
|
87
|
+
*/
|
|
88
|
+
const onNavigated = (frame) => {
|
|
89
|
+
try {
|
|
90
|
+
const { pathname } = new URL(frame.url());
|
|
91
|
+
// Path only: query strings are per-test data, not coverage.
|
|
92
|
+
if (pathname !== '' && pathname !== 'blank')
|
|
93
|
+
routes.add(pathname);
|
|
94
|
+
}
|
|
95
|
+
catch {
|
|
96
|
+
// about:blank and data: URLs are not routes.
|
|
97
|
+
}
|
|
98
|
+
};
|
|
99
|
+
const onRequest = (request) => {
|
|
100
|
+
started.set(request.url(), Date.now());
|
|
101
|
+
};
|
|
102
|
+
const record = (entry) => {
|
|
103
|
+
if (requests.length < config.maxRequests)
|
|
104
|
+
requests.push(entry);
|
|
105
|
+
};
|
|
106
|
+
const onResponse = (response) => {
|
|
107
|
+
const url = response.url();
|
|
108
|
+
const startedAt = started.get(url);
|
|
109
|
+
record({
|
|
110
|
+
url,
|
|
111
|
+
method: response.request().method(),
|
|
112
|
+
status: response.status(),
|
|
113
|
+
durationMs: startedAt === undefined ? 0 : Date.now() - startedAt,
|
|
114
|
+
failureText: null,
|
|
115
|
+
schemaError: null,
|
|
116
|
+
});
|
|
117
|
+
};
|
|
118
|
+
const onRequestFailed = (request) => {
|
|
119
|
+
const url = request.url();
|
|
120
|
+
const startedAt = started.get(url);
|
|
121
|
+
record({
|
|
122
|
+
url,
|
|
123
|
+
method: request.method(),
|
|
124
|
+
status: null,
|
|
125
|
+
durationMs: startedAt === undefined ? 0 : Date.now() - startedAt,
|
|
126
|
+
failureText: request.failure()?.errorText ?? 'request failed',
|
|
127
|
+
schemaError: null,
|
|
128
|
+
});
|
|
129
|
+
};
|
|
130
|
+
const onConsole = (message) => {
|
|
131
|
+
const type = message.type();
|
|
132
|
+
if (type === 'error' && consoleErrors.length < config.maxConsoleEntries) {
|
|
133
|
+
consoleErrors.push(message.text());
|
|
134
|
+
}
|
|
135
|
+
else if (type === 'warning' && consoleWarnings.length < config.maxConsoleEntries) {
|
|
136
|
+
consoleWarnings.push(message.text());
|
|
137
|
+
}
|
|
138
|
+
};
|
|
139
|
+
/**
|
|
140
|
+
* An uncaught exception is the single strongest signal that the APP broke
|
|
141
|
+
* rather than the test. It is prefixed to match the classifier's uncaught
|
|
142
|
+
* patterns, which is what routes the failure to `app_error` — a kind that
|
|
143
|
+
* is never healed.
|
|
144
|
+
*/
|
|
145
|
+
const onPageError = (error) => {
|
|
146
|
+
if (consoleErrors.length < config.maxConsoleEntries) {
|
|
147
|
+
consoleErrors.push(`Uncaught ${error.name}: ${error.message}`);
|
|
148
|
+
}
|
|
149
|
+
};
|
|
150
|
+
page.on('framenavigated', onNavigated);
|
|
151
|
+
page.on('request', onRequest);
|
|
152
|
+
page.on('response', onResponse);
|
|
153
|
+
page.on('requestfailed', onRequestFailed);
|
|
154
|
+
page.on('console', onConsole);
|
|
155
|
+
page.on('pageerror', onPageError);
|
|
156
|
+
await use();
|
|
157
|
+
page.off('framenavigated', onNavigated);
|
|
158
|
+
page.off('request', onRequest);
|
|
159
|
+
page.off('response', onResponse);
|
|
160
|
+
page.off('requestfailed', onRequestFailed);
|
|
161
|
+
page.off('console', onConsole);
|
|
162
|
+
page.off('pageerror', onPageError);
|
|
163
|
+
// Coverage is attached regardless of outcome — a passing test's routes are
|
|
164
|
+
// exactly what future selection needs to know about.
|
|
165
|
+
if (routes.size > 0) {
|
|
166
|
+
await attach(testInfo, sidecar_js_1.SIDECAR.coverage, { routes: [...routes].sort() });
|
|
167
|
+
}
|
|
168
|
+
// Everything below is failure-only: green tests pay nothing beyond the
|
|
169
|
+
// listeners above.
|
|
170
|
+
if (testInfo.status === testInfo.expectedStatus)
|
|
171
|
+
return;
|
|
172
|
+
const pageClosed = page.isClosed();
|
|
173
|
+
const ariaSnapshot = pageClosed
|
|
174
|
+
? ''
|
|
175
|
+
: await safely('aria snapshot', () => page.locator('body').ariaSnapshot(), '');
|
|
176
|
+
const testIdsPresent = pageClosed
|
|
177
|
+
? []
|
|
178
|
+
: await safely('test-id sweep', () => collectTestIds(page, config.testIdAttribute), []);
|
|
179
|
+
const url = pageClosed ? '' : await safely('url', async () => page.url(), '');
|
|
180
|
+
const title = pageClosed ? '' : await safely('title', () => page.title(), '');
|
|
181
|
+
await attach(testInfo, sidecar_js_1.SIDECAR.page, {
|
|
182
|
+
url,
|
|
183
|
+
title,
|
|
184
|
+
ariaSnapshot,
|
|
185
|
+
testIdsPresent,
|
|
186
|
+
htmlDigest: null,
|
|
187
|
+
});
|
|
188
|
+
const failed = requests.filter(r => r.failureText !== null || (r.status ?? 0) >= 400);
|
|
189
|
+
// A fixed threshold, not a per-route p95: that needs history, and
|
|
190
|
+
// claiming one now would be a number nobody measured.
|
|
191
|
+
const slow = requests.filter(r => r.durationMs >= config.slowRequestMs);
|
|
192
|
+
const statusCounts = {};
|
|
193
|
+
for (const request of requests) {
|
|
194
|
+
const key = request.status === null ? 'failed' : String(request.status);
|
|
195
|
+
statusCounts[key] = (statusCounts[key] ?? 0) + 1;
|
|
196
|
+
}
|
|
197
|
+
await attach(testInfo, sidecar_js_1.SIDECAR.network, { failed, slow, statusCounts });
|
|
198
|
+
await attach(testInfo, sidecar_js_1.SIDECAR.console, { errors: consoleErrors, warnings: consoleWarnings });
|
|
199
|
+
};
|
|
200
|
+
}
|
|
201
|
+
/**
|
|
202
|
+
* Spread into a fixture composition:
|
|
203
|
+
*
|
|
204
|
+
* export const test = base.extend({ ...atestFixtures, ...featureFixtures });
|
|
205
|
+
*
|
|
206
|
+
* `auto: true` means specs never mention it.
|
|
207
|
+
*/
|
|
208
|
+
exports.atestFixtures = {
|
|
209
|
+
atestCapture: [createCaptureFixture(), { auto: true }],
|
|
210
|
+
};
|
|
211
|
+
/** Ready-made `test` for suites with no fixtures of their own. */
|
|
212
|
+
exports.test = test_1.test.extend({ ...exports.atestFixtures });
|
|
213
|
+
var test_2 = require("@playwright/test");
|
|
214
|
+
Object.defineProperty(exports, "expect", { enumerable: true, get: function () { return test_2.expect; } });
|
|
215
|
+
//# sourceMappingURL=fixtures.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fixtures.js","sourceRoot":"","sources":["../src/fixtures.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* @aplaytest/runner-playwright — the Playwright adapter.
|
|
4
|
+
*
|
|
5
|
+
* The only package that knows Playwright exists. Everything above it consumes
|
|
6
|
+
* EvidenceBundles and RunRecords, so swapping in a different runner means
|
|
7
|
+
* writing a sibling of this package and nothing else.
|
|
8
|
+
*
|
|
9
|
+
* NOTE: this package must NOT depend on @aplaytest/llm. The reporter runs inside
|
|
10
|
+
* the test process; pulling an HTTP client and a model SDK into every worker
|
|
11
|
+
* would be both slow and a place a credential should never be.
|
|
12
|
+
*/
|
|
13
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
14
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
exports.runFileName = exports.recordingContext = exports.createApiCaptureFixture = exports.atestApiFixtures = exports.escapeForGrep = exports.runPlaywright = exports.CoverageSidecarSchema = exports.IntentSidecarSchema = exports.ConsoleSidecarSchema = exports.NetworkSidecarSchema = exports.PageSidecarSchema = exports.SidecarParseError = exports.parseSidecar = exports.SIDECAR = exports.domainStringArgs = exports.parseStepTitle = exports.findFailingStep = exports.extractSteps = exports.previewValue = exports.previewArgs = exports.bindPage = exports.expect = exports.test = exports.createCaptureFixture = exports.atestFixtures = exports.joinErrors = exports.stripAnsi = exports.splitCallLog = exports.parsePlaywrightError = exports.classifyResult = exports.toClassifiable = exports.assembleBundle = exports.ATEST_VERSION = exports.AtestReporter = void 0;
|
|
18
|
+
var reporter_js_1 = require("./reporter.js");
|
|
19
|
+
Object.defineProperty(exports, "AtestReporter", { enumerable: true, get: function () { return __importDefault(reporter_js_1).default; } });
|
|
20
|
+
Object.defineProperty(exports, "ATEST_VERSION", { enumerable: true, get: function () { return reporter_js_1.ATEST_VERSION; } });
|
|
21
|
+
var assemble_js_1 = require("./assemble.js");
|
|
22
|
+
Object.defineProperty(exports, "assembleBundle", { enumerable: true, get: function () { return assemble_js_1.assembleBundle; } });
|
|
23
|
+
Object.defineProperty(exports, "toClassifiable", { enumerable: true, get: function () { return assemble_js_1.toClassifiable; } });
|
|
24
|
+
Object.defineProperty(exports, "classifyResult", { enumerable: true, get: function () { return assemble_js_1.classifyResult; } });
|
|
25
|
+
// Re-exported from @aplaytest/core, where the parser now lives beside the
|
|
26
|
+
// classifier that consumes it. Kept here so existing importers do not break.
|
|
27
|
+
var core_1 = require("@aplaytest/core");
|
|
28
|
+
Object.defineProperty(exports, "parsePlaywrightError", { enumerable: true, get: function () { return core_1.parsePlaywrightError; } });
|
|
29
|
+
Object.defineProperty(exports, "splitCallLog", { enumerable: true, get: function () { return core_1.splitCallLog; } });
|
|
30
|
+
Object.defineProperty(exports, "stripAnsi", { enumerable: true, get: function () { return core_1.stripAnsi; } });
|
|
31
|
+
Object.defineProperty(exports, "joinErrors", { enumerable: true, get: function () { return core_1.joinErrors; } });
|
|
32
|
+
var fixtures_js_1 = require("./fixtures.js");
|
|
33
|
+
Object.defineProperty(exports, "atestFixtures", { enumerable: true, get: function () { return fixtures_js_1.atestFixtures; } });
|
|
34
|
+
Object.defineProperty(exports, "createCaptureFixture", { enumerable: true, get: function () { return fixtures_js_1.createCaptureFixture; } });
|
|
35
|
+
Object.defineProperty(exports, "test", { enumerable: true, get: function () { return fixtures_js_1.test; } });
|
|
36
|
+
Object.defineProperty(exports, "expect", { enumerable: true, get: function () { return fixtures_js_1.expect; } });
|
|
37
|
+
var bind_js_1 = require("./bind.js");
|
|
38
|
+
Object.defineProperty(exports, "bindPage", { enumerable: true, get: function () { return bind_js_1.bindPage; } });
|
|
39
|
+
Object.defineProperty(exports, "previewArgs", { enumerable: true, get: function () { return bind_js_1.previewArgs; } });
|
|
40
|
+
Object.defineProperty(exports, "previewValue", { enumerable: true, get: function () { return bind_js_1.previewValue; } });
|
|
41
|
+
var steps_js_1 = require("./steps.js");
|
|
42
|
+
Object.defineProperty(exports, "extractSteps", { enumerable: true, get: function () { return steps_js_1.extractSteps; } });
|
|
43
|
+
Object.defineProperty(exports, "findFailingStep", { enumerable: true, get: function () { return steps_js_1.findFailingStep; } });
|
|
44
|
+
Object.defineProperty(exports, "parseStepTitle", { enumerable: true, get: function () { return steps_js_1.parseStepTitle; } });
|
|
45
|
+
Object.defineProperty(exports, "domainStringArgs", { enumerable: true, get: function () { return steps_js_1.domainStringArgs; } });
|
|
46
|
+
var sidecar_js_1 = require("./sidecar.js");
|
|
47
|
+
Object.defineProperty(exports, "SIDECAR", { enumerable: true, get: function () { return sidecar_js_1.SIDECAR; } });
|
|
48
|
+
Object.defineProperty(exports, "parseSidecar", { enumerable: true, get: function () { return sidecar_js_1.parseSidecar; } });
|
|
49
|
+
Object.defineProperty(exports, "SidecarParseError", { enumerable: true, get: function () { return sidecar_js_1.SidecarParseError; } });
|
|
50
|
+
Object.defineProperty(exports, "PageSidecarSchema", { enumerable: true, get: function () { return sidecar_js_1.PageSidecarSchema; } });
|
|
51
|
+
Object.defineProperty(exports, "NetworkSidecarSchema", { enumerable: true, get: function () { return sidecar_js_1.NetworkSidecarSchema; } });
|
|
52
|
+
Object.defineProperty(exports, "ConsoleSidecarSchema", { enumerable: true, get: function () { return sidecar_js_1.ConsoleSidecarSchema; } });
|
|
53
|
+
Object.defineProperty(exports, "IntentSidecarSchema", { enumerable: true, get: function () { return sidecar_js_1.IntentSidecarSchema; } });
|
|
54
|
+
Object.defineProperty(exports, "CoverageSidecarSchema", { enumerable: true, get: function () { return sidecar_js_1.CoverageSidecarSchema; } });
|
|
55
|
+
var spawn_js_1 = require("./spawn.js");
|
|
56
|
+
Object.defineProperty(exports, "runPlaywright", { enumerable: true, get: function () { return spawn_js_1.runPlaywright; } });
|
|
57
|
+
Object.defineProperty(exports, "escapeForGrep", { enumerable: true, get: function () { return spawn_js_1.escapeForGrep; } });
|
|
58
|
+
var api_fixtures_js_1 = require("./api-fixtures.js");
|
|
59
|
+
Object.defineProperty(exports, "atestApiFixtures", { enumerable: true, get: function () { return api_fixtures_js_1.atestApiFixtures; } });
|
|
60
|
+
Object.defineProperty(exports, "createApiCaptureFixture", { enumerable: true, get: function () { return api_fixtures_js_1.createApiCaptureFixture; } });
|
|
61
|
+
Object.defineProperty(exports, "recordingContext", { enumerable: true, get: function () { return api_fixtures_js_1.recordingContext; } });
|
|
62
|
+
var reporter_js_2 = require("./reporter.js");
|
|
63
|
+
Object.defineProperty(exports, "runFileName", { enumerable: true, get: function () { return reporter_js_2.runFileName; } });
|
|
64
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;GAUG;;;;;;AAEH,6CAAwE;AAA/D,6HAAA,OAAO,OAAiB;AAAE,4GAAA,aAAa,OAAA;AAGhD,6CAA+E;AAAtE,6GAAA,cAAc,OAAA;AAAE,6GAAA,cAAc,OAAA;AAAE,6GAAA,cAAc,OAAA;AAUvD,0EAA0E;AAC1E,6EAA6E;AAC7E,wCAA4F;AAAnF,4GAAA,oBAAoB,OAAA;AAAE,oGAAA,YAAY,OAAA;AAAE,iGAAA,SAAS,OAAA;AAAE,kGAAA,UAAU,OAAA;AAGlE,6CAAkF;AAAzE,4GAAA,aAAa,OAAA;AAAE,mHAAA,oBAAoB,OAAA;AAAE,mGAAA,IAAI,OAAA;AAAE,qGAAA,MAAM,OAAA;AAG1D,qCAAgE;AAAvD,mGAAA,QAAQ,OAAA;AAAE,sGAAA,WAAW,OAAA;AAAE,uGAAA,YAAY,OAAA;AAG5C,uCAA6F;AAApF,wGAAA,YAAY,OAAA;AAAE,2GAAA,eAAe,OAAA;AAAE,0GAAA,cAAc,OAAA;AAAE,4GAAA,gBAAgB,OAAA;AAGxE,2CASsB;AARpB,qGAAA,OAAO,OAAA;AACP,0GAAA,YAAY,OAAA;AACZ,+GAAA,iBAAiB,OAAA;AACjB,+GAAA,iBAAiB,OAAA;AACjB,kHAAA,oBAAoB,OAAA;AACpB,kHAAA,oBAAoB,OAAA;AACpB,iHAAA,mBAAmB,OAAA;AACnB,mHAAA,qBAAqB,OAAA;AAWvB,uCAA0D;AAAjD,yGAAA,aAAa,OAAA;AAAE,yGAAA,aAAa,OAAA;AAGrC,qDAI2B;AAHzB,mHAAA,gBAAgB,OAAA;AAChB,0HAAA,uBAAuB,OAAA;AACvB,mHAAA,gBAAgB,OAAA;AAIlB,6CAA4C;AAAnC,0GAAA,WAAW,OAAA"}
|