@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.
Files changed (58) hide show
  1. package/dist/.tsbuildinfo +1 -0
  2. package/dist/api-fixtures.d.ts +71 -0
  3. package/dist/api-fixtures.d.ts.map +1 -0
  4. package/dist/api-fixtures.js +162 -0
  5. package/dist/api-fixtures.js.map +1 -0
  6. package/dist/assemble.d.ts +86 -0
  7. package/dist/assemble.d.ts.map +1 -0
  8. package/dist/assemble.js +176 -0
  9. package/dist/assemble.js.map +1 -0
  10. package/dist/bind.d.ts +43 -0
  11. package/dist/bind.d.ts.map +1 -0
  12. package/dist/bind.js +112 -0
  13. package/dist/bind.js.map +1 -0
  14. package/dist/fixtures.d.ts +54 -0
  15. package/dist/fixtures.d.ts.map +1 -0
  16. package/dist/fixtures.js +210 -0
  17. package/dist/fixtures.js.map +1 -0
  18. package/dist/index.d.ts +31 -0
  19. package/dist/index.d.ts.map +1 -0
  20. package/dist/index.js +24 -0
  21. package/dist/index.js.map +1 -0
  22. package/dist/reporter.d.ts +79 -0
  23. package/dist/reporter.d.ts.map +1 -0
  24. package/dist/reporter.js +277 -0
  25. package/dist/reporter.js.map +1 -0
  26. package/dist/sidecar.d.ts +134 -0
  27. package/dist/sidecar.d.ts.map +1 -0
  28. package/dist/sidecar.js +111 -0
  29. package/dist/sidecar.js.map +1 -0
  30. package/dist/spawn.d.ts +57 -0
  31. package/dist/spawn.d.ts.map +1 -0
  32. package/dist/spawn.js +170 -0
  33. package/dist/spawn.js.map +1 -0
  34. package/dist/steps.d.ts +45 -0
  35. package/dist/steps.d.ts.map +1 -0
  36. package/dist/steps.js +106 -0
  37. package/dist/steps.js.map +1 -0
  38. package/dist-cjs/.tsbuildinfo +1 -0
  39. package/dist-cjs/api-fixtures.js +166 -0
  40. package/dist-cjs/api-fixtures.js.map +1 -0
  41. package/dist-cjs/assemble.js +181 -0
  42. package/dist-cjs/assemble.js.map +1 -0
  43. package/dist-cjs/bind.js +117 -0
  44. package/dist-cjs/bind.js.map +1 -0
  45. package/dist-cjs/fixtures.js +215 -0
  46. package/dist-cjs/fixtures.js.map +1 -0
  47. package/dist-cjs/index.js +64 -0
  48. package/dist-cjs/index.js.map +1 -0
  49. package/dist-cjs/package.json +3 -0
  50. package/dist-cjs/reporter.js +282 -0
  51. package/dist-cjs/reporter.js.map +1 -0
  52. package/dist-cjs/sidecar.js +116 -0
  53. package/dist-cjs/sidecar.js.map +1 -0
  54. package/dist-cjs/spawn.js +174 -0
  55. package/dist-cjs/spawn.js.map +1 -0
  56. package/dist-cjs/steps.js +112 -0
  57. package/dist-cjs/steps.js.map +1 -0
  58. package/package.json +51 -0
@@ -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"}
@@ -0,0 +1,3 @@
1
+ {
2
+ "type": "commonjs"
3
+ }