@testchimp/playwright 0.1.7 → 0.1.9

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.
@@ -0,0 +1,495 @@
1
+ "use strict";
2
+ /**
3
+ * ExploreChimp local runs (when `EXPLORECHIMP_ENABLED`): page instrumentation + analyze API via Featureservice.
4
+ * Wired automatically by `installTrueCoverage` / `installTestChimp` — do not import this module from app code.
5
+ * With ExploreChimp on, call markers via the Playwright fixture: `test('…', async ({ markScreenState }) => { … })`.
6
+ * Env: TESTCHIMP_BACKEND_URL, TESTCHIMP_API_KEY, TESTCHIMP_BATCH_INVOCATION_ID (exploration id).
7
+ * Optional: EXPLORECHIMP_SOURCES_TO_ANALYZE, EXPLORECHIMP_REQUEST_REGEX_TO_ANALYZE (required when NETWORK is listed),
8
+ * EXPLORECHIMP_LONG_TASK_THRESHOLD_MS (default 50; matches scriptservice watcher long-task gate).
9
+ * DOM/axe payload caps: EXPLORECHIMP_DOM_MAX_CHARS (default 32000), EXPLORECHIMP_AXE_MAX_VIOLATIONS (default 25),
10
+ * EXPLORECHIMP_AXE_MAX_NODES_PER_VIOLATION (default 8).
11
+ */
12
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
13
+ if (k2 === undefined) k2 = k;
14
+ var desc = Object.getOwnPropertyDescriptor(m, k);
15
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
16
+ desc = { enumerable: true, get: function() { return m[k]; } };
17
+ }
18
+ Object.defineProperty(o, k2, desc);
19
+ }) : (function(o, m, k, k2) {
20
+ if (k2 === undefined) k2 = k;
21
+ o[k2] = m[k];
22
+ }));
23
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
24
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
25
+ }) : function(o, v) {
26
+ o["default"] = v;
27
+ });
28
+ var __importStar = (this && this.__importStar) || (function () {
29
+ var ownKeys = function(o) {
30
+ ownKeys = Object.getOwnPropertyNames || function (o) {
31
+ var ar = [];
32
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
33
+ return ar;
34
+ };
35
+ return ownKeys(o);
36
+ };
37
+ return function (mod) {
38
+ if (mod && mod.__esModule) return mod;
39
+ var result = {};
40
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
41
+ __setModuleDefault(result, mod);
42
+ return result;
43
+ };
44
+ })();
45
+ var __importDefault = (this && this.__importDefault) || function (mod) {
46
+ return (mod && mod.__esModule) ? mod : { "default": mod };
47
+ };
48
+ Object.defineProperty(exports, "__esModule", { value: true });
49
+ exports.DataSourceEnum = void 0;
50
+ exports.isExploreChimpEnabled = isExploreChimpEnabled;
51
+ exports.parseExploreChimpSources = parseExploreChimpSources;
52
+ exports.attachExploreChimpInstrumentation = attachExploreChimpInstrumentation;
53
+ exports.applyExploreChimpPageFixture = applyExploreChimpPageFixture;
54
+ exports.runExploreChimpMarkScreenState = runExploreChimpMarkScreenState;
55
+ const axios_1 = __importDefault(require("axios"));
56
+ const form_data_1 = __importDefault(require("form-data"));
57
+ const crypto_1 = require("crypto");
58
+ const module_1 = require("module");
59
+ const path_1 = __importDefault(require("path"));
60
+ const utils_1 = require("../utils");
61
+ const perf_metrics_1 = require("./perf-metrics");
62
+ const clean_html_1 = require("./clean-html");
63
+ const axe_compact_1 = require("./axe-compact");
64
+ const pwRequire = (0, module_1.createRequire)(path_1.default.join(process.cwd(), 'package.json'));
65
+ const K_META = '__testchimpExploreChimpMeta';
66
+ const K_BUF = '__testchimpExploreChimpBuffers';
67
+ const K_HOOKED = '__testchimpExploreChimpHooked';
68
+ /** Matches scriptservice / protos/agents DataSource numeric values (user-facing sources only). */
69
+ exports.DataSourceEnum = {
70
+ UNKNOWN_DATA_SOURCE: 0,
71
+ DOM_SOURCE: 1,
72
+ SCREENSHOT_SOURCE: 2,
73
+ NETWORK_SOURCE: 3,
74
+ CONSOLE_SOURCE: 4,
75
+ METRICS_SOURCE: 5,
76
+ };
77
+ function exploreChimpAnalyticsStepId(meta, stepTitle) {
78
+ return (0, utils_1.stableExploreChimpAnalyticsStepId)(meta.testId, meta.testRetry, stepTitle);
79
+ }
80
+ const MAX_CONSOLE = 60;
81
+ const MAX_CONSOLE_MSG = 600;
82
+ const MAX_NETWORK_ROWS = 35;
83
+ function isExploreChimpEnabled() {
84
+ const v = process.env.EXPLORECHIMP_ENABLED;
85
+ return v === '1' || v === 'true' || v === 'TRUE';
86
+ }
87
+ function parseExploreChimpSources() {
88
+ const raw = process.env.EXPLORECHIMP_SOURCES_TO_ANALYZE?.trim();
89
+ if (!raw) {
90
+ return new Set(['DOM', 'SCREENSHOT', 'CONSOLE', 'NETWORK', 'METRICS']);
91
+ }
92
+ return new Set(raw.split(',').map((s) => s.trim().toUpperCase()).filter(Boolean));
93
+ }
94
+ function parseNetworkRegex() {
95
+ const raw = process.env.EXPLORECHIMP_REQUEST_REGEX_TO_ANALYZE?.trim();
96
+ if (!raw)
97
+ return null;
98
+ try {
99
+ return new RegExp(raw);
100
+ }
101
+ catch {
102
+ console.warn(`[ExploreChimp] Invalid EXPLORECHIMP_REQUEST_REGEX_TO_ANALYZE — ignoring`);
103
+ return null;
104
+ }
105
+ }
106
+ function createBackendClient() {
107
+ const backendUrl = process.env.TESTCHIMP_BACKEND_URL?.trim() || 'https://featureservice.testchimp.io';
108
+ const apiKey = process.env.TESTCHIMP_API_KEY?.trim() || '';
109
+ return axios_1.default.create({
110
+ baseURL: backendUrl.replace(/\/+$/, ''),
111
+ headers: {
112
+ 'Content-Type': 'application/json',
113
+ 'testchimp-api-key': apiKey,
114
+ },
115
+ timeout: 120000,
116
+ });
117
+ }
118
+ async function uploadScreenshot(client, buffer) {
119
+ const form = new form_data_1.default();
120
+ form.append('file', buffer, { filename: 'explorechimp.jpg', contentType: 'image/jpeg' });
121
+ const response = await client.post('/api/upload_attachment', form, {
122
+ headers: {
123
+ ...form.getHeaders(),
124
+ },
125
+ timeout: 120000,
126
+ });
127
+ const gcpPath = response.data?.gcpPath;
128
+ if (!gcpPath) {
129
+ throw new Error('[ExploreChimp] upload_attachment missing gcpPath');
130
+ }
131
+ return gcpPath;
132
+ }
133
+ async function postAnalyze(client, body) {
134
+ await client.post('/smart-test/analyze_explorechimp_data_sources', body);
135
+ }
136
+ function truncate(s, max) {
137
+ if (s.length <= max)
138
+ return s;
139
+ return s.slice(0, max);
140
+ }
141
+ function headersToRecord(headers) {
142
+ const out = {};
143
+ const allowReq = new Set([
144
+ 'content-type',
145
+ 'authorization',
146
+ 'cookie',
147
+ 'user-agent',
148
+ 'accept',
149
+ 'referer',
150
+ 'origin',
151
+ ]);
152
+ const allowRes = new Set([
153
+ 'content-type',
154
+ 'cache-control',
155
+ 'x-frame-options',
156
+ 'content-security-policy',
157
+ ]);
158
+ for (const [k, v] of Object.entries(headers)) {
159
+ const lk = k.toLowerCase();
160
+ if (allowReq.has(lk) || allowRes.has(lk)) {
161
+ out[k] = lk === 'authorization' ? '[REDACTED]' : truncate(String(v), 500);
162
+ }
163
+ }
164
+ return out;
165
+ }
166
+ function consolePayload(rows) {
167
+ const map = {};
168
+ const slice = rows.slice(-MAX_CONSOLE);
169
+ slice.forEach((r, i) => {
170
+ map[String(i)] = {
171
+ type: r.type,
172
+ text: truncate(r.text, MAX_CONSOLE_MSG),
173
+ timestamp: String(r.timestamp),
174
+ };
175
+ });
176
+ return map;
177
+ }
178
+ function networkPayload(rows) {
179
+ const requests = {};
180
+ rows.slice(-MAX_NETWORK_ROWS).forEach((r, i) => {
181
+ requests[String(i)] = {
182
+ url: truncate(r.url, 2000),
183
+ method: r.method,
184
+ status: r.status,
185
+ responseTimeMs: r.responseTimeMs,
186
+ timestamp: String(r.timestamp),
187
+ requestHeaders: r.requestHeaders,
188
+ responseHeaders: r.responseHeaders,
189
+ };
190
+ });
191
+ return { requests };
192
+ }
193
+ function hashNetworkBatch(rows) {
194
+ const key = rows
195
+ .map((r) => `${r.method} ${r.url}`)
196
+ .sort()
197
+ .join('\n');
198
+ return (0, crypto_1.createHash)('sha256').update(key).digest('hex');
199
+ }
200
+ function getBuffers(page) {
201
+ const p = page;
202
+ if (!p[K_BUF]) {
203
+ p[K_BUF] = {
204
+ consoleRows: [],
205
+ networkRows: [],
206
+ priorMarkedScreen: null,
207
+ metricsIntervalSinceMs: Date.now(),
208
+ };
209
+ }
210
+ return p[K_BUF];
211
+ }
212
+ /** Clears console/network buffers, resets in-page perf buffers (watcher.resetMetrics), advances metrics interval. */
213
+ async function resetExploreChimpIntervalBuffers(page) {
214
+ const b = getBuffers(page);
215
+ b.consoleRows = [];
216
+ b.networkRows = [];
217
+ await (0, perf_metrics_1.resetExploreChimpPerfMetricsBuffers)(page);
218
+ b.metricsIntervalSinceMs = Date.now();
219
+ }
220
+ function attachExploreChimpInstrumentation(page, opts) {
221
+ const p = page;
222
+ if (p[K_HOOKED])
223
+ return;
224
+ p[K_HOOKED] = true;
225
+ const reqStarts = new WeakMap();
226
+ if (opts.recordNetwork && opts.networkRegex) {
227
+ const networkRegex = opts.networkRegex;
228
+ page.on('request', (req) => {
229
+ reqStarts.set(req, Date.now());
230
+ });
231
+ page.on('response', async (response) => {
232
+ try {
233
+ const req = response.request();
234
+ const url = req.url();
235
+ if (!networkRegex.test(url))
236
+ return;
237
+ const start = reqStarts.get(req) ?? Date.now();
238
+ const rt = Math.max(0, Date.now() - start);
239
+ const reqHeaders = headersToRecord(req.headers());
240
+ let resHeaders = {};
241
+ try {
242
+ resHeaders = headersToRecord(response.headers());
243
+ }
244
+ catch {
245
+ /* ignore */
246
+ }
247
+ const b = getBuffers(page);
248
+ if (b.networkRows.length >= MAX_NETWORK_ROWS * 2) {
249
+ b.networkRows.splice(0, b.networkRows.length - MAX_NETWORK_ROWS);
250
+ }
251
+ b.networkRows.push({
252
+ url,
253
+ method: req.method(),
254
+ status: response.status(),
255
+ responseTimeMs: rt,
256
+ timestamp: Date.now(),
257
+ requestHeaders: reqHeaders,
258
+ responseHeaders: resHeaders,
259
+ });
260
+ }
261
+ catch {
262
+ /* ignore */
263
+ }
264
+ });
265
+ }
266
+ page.on('console', (msg) => {
267
+ const b = getBuffers(page);
268
+ b.consoleRows.push({
269
+ type: msg.type(),
270
+ text: truncate(msg.text(), MAX_CONSOLE_MSG),
271
+ timestamp: Date.now(),
272
+ });
273
+ if (b.consoleRows.length > MAX_CONSOLE * 2) {
274
+ b.consoleRows.splice(0, b.consoleRows.length - MAX_CONSOLE);
275
+ }
276
+ });
277
+ }
278
+ function computeJourneyId(testInfo) {
279
+ const tp = Array.isArray(testInfo.titlePath) ? testInfo.titlePath.join('::') : '';
280
+ return (0, crypto_1.createHash)('sha256').update(`${testInfo.file}::${tp}`).digest('hex');
281
+ }
282
+ /**
283
+ * Extends Playwright `test` with ExploreChimp page meta + buffers (only when `EXPLORECHIMP_ENABLED`).
284
+ * Used from {@link installTrueCoverage} / {@link installTestChimp}; not required as a separate install.
285
+ */
286
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
287
+ function applyExploreChimpPageFixture(test) {
288
+ return test.extend({
289
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
290
+ page: async ({ page }, use, testInfo) => {
291
+ if (!isExploreChimpEnabled()) {
292
+ await use(page);
293
+ return;
294
+ }
295
+ const project = testInfo.project;
296
+ const projectRootDir = project.rootDir ?? process.cwd();
297
+ const testsFolder = (0, utils_1.deriveTestsFolder)(projectRootDir);
298
+ const manifest = (0, utils_1.loadJobManifestEntries)(projectRootDir);
299
+ const dp = (0, utils_1.derivePathsFromTestInfo)({
300
+ file: testInfo.file,
301
+ title: testInfo.title,
302
+ titlePath: testInfo.titlePath,
303
+ project: testInfo.project,
304
+ }, testsFolder, projectRootDir);
305
+ const resolved = (0, utils_1.resolveManifestEntryFromRuntime)(manifest, {
306
+ folderPath: dp.folderPath,
307
+ fileName: dp.fileName,
308
+ suitePath: dp.suitePath,
309
+ testName: dp.testName,
310
+ });
311
+ const journeyExecutionId = resolved?.entry.jobId?.trim() || (0, utils_1.generateUUID)();
312
+ if (!resolved?.entry.jobId && process.env.TESTCHIMP_EXECUTION_MODE === 'platform') {
313
+ console.warn('[ExploreChimp] No manifest jobId for this test — journeyExecutionId is random; journey viewer merge will not align with smart_test_execution_jobs.');
314
+ }
315
+ const meta = {
316
+ journeyExecutionId,
317
+ journeyId: computeJourneyId({ file: testInfo.file, titlePath: testInfo.titlePath }),
318
+ testId: String(testInfo.testId ?? ''),
319
+ testRetry: typeof testInfo.retry === 'number' ? testInfo.retry : 0,
320
+ projectRootDir,
321
+ };
322
+ page[K_META] = meta;
323
+ const sources = parseExploreChimpSources();
324
+ const wantNetwork = sources.has('NETWORK');
325
+ const regex = wantNetwork ? parseNetworkRegex() : null;
326
+ if (wantNetwork && !regex) {
327
+ console.warn('[ExploreChimp] NETWORK listed in EXPLORECHIMP_SOURCES_TO_ANALYZE but EXPLORECHIMP_REQUEST_REGEX_TO_ANALYZE is missing — network capture disabled');
328
+ }
329
+ attachExploreChimpInstrumentation(page, {
330
+ recordNetwork: !!(wantNetwork && regex),
331
+ networkRegex: regex,
332
+ });
333
+ if (sources.has('METRICS')) {
334
+ await (0, perf_metrics_1.installExploreChimpPerfMetricsObservers)(page, (0, perf_metrics_1.parseExploreChimpLongTaskThresholdMs)());
335
+ }
336
+ await use(page);
337
+ },
338
+ });
339
+ }
340
+ function getMeta(page) {
341
+ return page[K_META];
342
+ }
343
+ /**
344
+ * ExploreChimp path for screen markers; invoked by the `markScreenState` fixture (not directly from specs).
345
+ */
346
+ async function runExploreChimpMarkScreenState(page, screenName, stateName) {
347
+ const screen = String(screenName ?? '').trim();
348
+ if (!screen)
349
+ return;
350
+ const state = stateName != null && String(stateName).trim() !== ''
351
+ ? String(stateName).trim()
352
+ : 'default';
353
+ const { test } = pwRequire('@playwright/test');
354
+ const sources = parseExploreChimpSources();
355
+ const meta = getMeta(page);
356
+ const explorationId = (0, utils_1.readTestChimpBatchInvocationId)(meta?.projectRootDir ?? process.cwd());
357
+ const apiKey = process.env.TESTCHIMP_API_KEY?.trim() || '';
358
+ if (!meta || !explorationId || !apiKey) {
359
+ console.warn('[ExploreChimp] Missing ExploreChimp page wiring (installTrueCoverage + EXPLORECHIMP_ENABLED), TESTCHIMP_API_KEY, or TESTCHIMP_BATCH_INVOCATION_ID — skipping backend calls');
360
+ // eslint-disable-next-line no-console
361
+ console.log(`reached ${screen} | ${state}`);
362
+ return;
363
+ }
364
+ await test.step(`ScreenState: ${screen} | ${state}`, async () => {
365
+ await page.waitForLoadState('networkidle', { timeout: 8000 }).catch(() => { });
366
+ });
367
+ const client = createBackendClient();
368
+ const buffers = getBuffers(page);
369
+ const prior = buffers.priorMarkedScreen;
370
+ const current = { name: screen, state };
371
+ const branchName = (0, utils_1.getBranchName)();
372
+ const wantNetwork = sources.has('NETWORK');
373
+ const regex = wantNetwork ? parseNetworkRegex() : null;
374
+ // --- Prior interval: console, network, metrics (attribute to prior screen-state)
375
+ if (prior) {
376
+ if (sources.has('CONSOLE') && buffers.consoleRows.length > 0) {
377
+ const consoleTitle = `Analyzing Console for Screen-state ${prior.name} | ${prior.state}`;
378
+ await test.step(consoleTitle, async () => {
379
+ await postAnalyze(client, {
380
+ explorationId,
381
+ journeyExecutionId: meta.journeyExecutionId,
382
+ journeyId: meta.journeyId,
383
+ testId: meta.testId,
384
+ branchName: branchName ?? '',
385
+ stepId: exploreChimpAnalyticsStepId(meta, consoleTitle),
386
+ analyzedDataSource: exports.DataSourceEnum.CONSOLE_SOURCE,
387
+ screenState: { name: prior.name, state: prior.state },
388
+ consoleLogsPayload: { consoleLogs: consolePayload(buffers.consoleRows) },
389
+ networkRequestHash: '',
390
+ });
391
+ });
392
+ }
393
+ if (wantNetwork && regex && buffers.networkRows.length > 0) {
394
+ const netRows = buffers.networkRows.filter((r) => regex.test(r.url));
395
+ if (netRows.length > 0) {
396
+ const networkTitle = `Analyzing Network for Screen-state ${prior.name} | ${prior.state}`;
397
+ const hash = hashNetworkBatch(netRows);
398
+ await test.step(networkTitle, async () => {
399
+ await postAnalyze(client, {
400
+ explorationId,
401
+ journeyExecutionId: meta.journeyExecutionId,
402
+ journeyId: meta.journeyId,
403
+ testId: meta.testId,
404
+ branchName: branchName ?? '',
405
+ stepId: exploreChimpAnalyticsStepId(meta, networkTitle),
406
+ analyzedDataSource: exports.DataSourceEnum.NETWORK_SOURCE,
407
+ screenState: { name: prior.name, state: prior.state },
408
+ apiRequestsPayload: networkPayload(netRows),
409
+ networkRequestHash: hash,
410
+ });
411
+ });
412
+ }
413
+ }
414
+ if (sources.has('METRICS')) {
415
+ const metricsTitle = `Analyzing Metrics for Screen-state ${prior.name} | ${prior.state}`;
416
+ let metricsPayload = null;
417
+ try {
418
+ metricsPayload = await (0, perf_metrics_1.collectMetricsSince)(page, buffers.metricsIntervalSinceMs);
419
+ }
420
+ catch {
421
+ metricsPayload = null;
422
+ }
423
+ if (metricsPayload) {
424
+ await test.step(metricsTitle, async () => {
425
+ await postAnalyze(client, {
426
+ explorationId,
427
+ journeyExecutionId: meta.journeyExecutionId,
428
+ journeyId: meta.journeyId,
429
+ testId: meta.testId,
430
+ branchName: branchName ?? '',
431
+ stepId: exploreChimpAnalyticsStepId(meta, metricsTitle),
432
+ analyzedDataSource: exports.DataSourceEnum.METRICS_SOURCE,
433
+ screenState: { name: prior.name, state: prior.state },
434
+ metricsPayload,
435
+ networkRequestHash: '',
436
+ });
437
+ });
438
+ }
439
+ }
440
+ }
441
+ // --- Current screen: screenshot + DOM (DOM + axe = single request, single Playwright step)
442
+ if (sources.has('SCREENSHOT')) {
443
+ const shotTitle = `Analyzing Screenshot for Screen-state ${current.name} | ${current.state}`;
444
+ await test.step(shotTitle, async () => {
445
+ const jpeg = await page.screenshot({ type: 'jpeg', quality: 80, fullPage: false });
446
+ const gcpPath = await uploadScreenshot(client, jpeg);
447
+ await postAnalyze(client, {
448
+ explorationId,
449
+ journeyExecutionId: meta.journeyExecutionId,
450
+ journeyId: meta.journeyId,
451
+ testId: meta.testId,
452
+ branchName: branchName ?? '',
453
+ stepId: exploreChimpAnalyticsStepId(meta, shotTitle),
454
+ analyzedDataSource: exports.DataSourceEnum.SCREENSHOT_SOURCE,
455
+ screenState: { name: current.name, state: current.state },
456
+ screenshotPath: gcpPath,
457
+ networkRequestHash: '',
458
+ });
459
+ });
460
+ }
461
+ if (sources.has('DOM')) {
462
+ const domTitle = `Analyzing DOM for Screen-state ${current.name} | ${current.state}`;
463
+ await test.step(domTitle, async () => {
464
+ let html = '';
465
+ try {
466
+ html = await page.content();
467
+ }
468
+ catch {
469
+ html = '';
470
+ }
471
+ const { default: AxeBuilder } = await Promise.resolve().then(() => __importStar(require('@axe-core/playwright')));
472
+ const axeResults = await new AxeBuilder({ page }).analyze();
473
+ const domMaxParsed = Number.parseInt(process.env.EXPLORECHIMP_DOM_MAX_CHARS?.trim() || '', 10);
474
+ const domMax = Number.isFinite(domMaxParsed) && domMaxParsed > 0 ? domMaxParsed : 32000;
475
+ const snapshot = (0, clean_html_1.cleanHtml)(html, domMax);
476
+ const axeResultsJson = (0, axe_compact_1.compactAxeResultsForUpload)(axeResults);
477
+ await postAnalyze(client, {
478
+ explorationId,
479
+ journeyExecutionId: meta.journeyExecutionId,
480
+ journeyId: meta.journeyId,
481
+ testId: meta.testId,
482
+ branchName: branchName ?? '',
483
+ stepId: exploreChimpAnalyticsStepId(meta, domTitle),
484
+ analyzedDataSource: exports.DataSourceEnum.DOM_SOURCE,
485
+ screenState: { name: current.name, state: current.state },
486
+ domSnapshotPayload: { snapshot },
487
+ axeResultsJson,
488
+ networkRequestHash: '',
489
+ });
490
+ });
491
+ }
492
+ buffers.priorMarkedScreen = current;
493
+ await resetExploreChimpIntervalBuffers(page);
494
+ }
495
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/explorechimp/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Browser performance metrics for ExploreChimp local runs — mirrors scriptservice
3
+ * `helpers/watcher.ts` (PerformanceObserver pipeline + getMetricsSince / resetMetrics).
4
+ */
5
+ import type { Page } from '@playwright/test';
6
+ export declare function parseExploreChimpLongTaskThresholdMs(): number;
7
+ /**
8
+ * Injects observers on every new document (Playwright init script). Idempotent per document.
9
+ */
10
+ export declare function installExploreChimpPerfMetricsObservers(page: Page, longTaskThresholdMs: number): Promise<void>;
11
+ /** Same semantics as watcher.getMetricsSince — filters perf entries by wall-clock `since`. */
12
+ export declare function collectMetricsSince(page: Page, sinceTimestamp: number): Promise<Record<string, unknown> | null>;
13
+ /** Clears in-page metric buffers (watcher.resetMetrics). */
14
+ export declare function resetExploreChimpPerfMetricsBuffers(page: Page): Promise<void>;
15
+ //# sourceMappingURL=perf-metrics.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"perf-metrics.d.ts","sourceRoot":"","sources":["../../src/explorechimp/perf-metrics.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAE7C,wBAAgB,oCAAoC,IAAI,MAAM,CAK7D;AAED;;GAEG;AACH,wBAAsB,uCAAuC,CAC3D,IAAI,EAAE,IAAI,EACV,mBAAmB,EAAE,MAAM,GAC1B,OAAO,CAAC,IAAI,CAAC,CA6Yf;AAED,8FAA8F;AAC9F,wBAAsB,mBAAmB,CACvC,IAAI,EAAE,IAAI,EACV,cAAc,EAAE,MAAM,GACrB,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC,CAyJzC;AAED,4DAA4D;AAC5D,wBAAsB,mCAAmC,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAiBnF"}