@empiricalrun/playwright-utils 0.42.0 → 0.43.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/CHANGELOG.md CHANGED
@@ -1,5 +1,21 @@
1
1
  # @empiricalrun/playwright-utils
2
2
 
3
+ ## 0.43.1
4
+
5
+ ### Patch Changes
6
+
7
+ - 5c120e0: fix: summary json generated after html
8
+
9
+ ## 0.43.0
10
+
11
+ ### Minor Changes
12
+
13
+ - ab403b8: fix: move json report location to avoid accidental agent commits
14
+
15
+ ### Patch Changes
16
+
17
+ - 002127f: feat: add code coverage helper in base fixtures
18
+
3
19
  ## 0.42.0
4
20
 
5
21
  ### Minor Changes
@@ -51,8 +51,8 @@ function getReporters() {
51
51
  ],
52
52
  ]
53
53
  : [
54
- ["json", { outputFile: "summary.json" }],
55
54
  ["html", { open: "never" }],
55
+ ["json", { outputFile: "playwright-report/summary.json" }],
56
56
  ];
57
57
  return [
58
58
  ["list"],
@@ -11,7 +11,7 @@ declare class EmpiricalReporter implements Reporter {
11
11
  private enqueTestAttachmentUploadTask;
12
12
  onTestEnd(test: TestCase, result: TestResult): void;
13
13
  onEnd(result: FullResult): Promise<void>;
14
- private _logMissingFiles;
14
+ private _logReportDirContents;
15
15
  private _patchBlobReport;
16
16
  private _uploadBlobReport;
17
17
  }
@@ -1 +1 @@
1
- {"version":3,"file":"empirical-reporter.d.ts","sourceRoot":"","sources":["../../src/reporter/empirical-reporter.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,UAAU,EACV,QAAQ,EACR,QAAQ,EACR,UAAU,EACX,MAAM,2BAA2B,CAAC;AAqBnC,cAAM,iBAAkB,YAAW,QAAQ;IACzC,OAAO,CAAC,kBAAkB,CAAyB;IACnD,OAAO,CAAC,oBAAoB,CAG1B;IACF,OAAO,CAAC,sBAAsB,CAAuB;IACrD,OAAO,CAAC,YAAY,CAAgD;IACpE,OAAO,CAAC,iBAAiB,CAAyC;IAClE,OAAO,CAAC,gBAAgB,CAAkC;IAC1D,OAAO,CAAC,SAAS,CAAyB;;IAM1C,OAAO,CAAC,6BAA6B,CAkCnC;IAEF,SAAS,CAAC,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU;IAuGtC,KAAK,CAAC,MAAM,EAAE,UAAU;IA8G9B,OAAO,CAAC,gBAAgB;YAoBV,gBAAgB;YAOhB,iBAAiB;CAmChC;AAED,eAAe,iBAAiB,CAAC"}
1
+ {"version":3,"file":"empirical-reporter.d.ts","sourceRoot":"","sources":["../../src/reporter/empirical-reporter.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,UAAU,EACV,QAAQ,EACR,QAAQ,EACR,UAAU,EACX,MAAM,2BAA2B,CAAC;AAqBnC,cAAM,iBAAkB,YAAW,QAAQ;IACzC,OAAO,CAAC,kBAAkB,CAAyB;IACnD,OAAO,CAAC,oBAAoB,CAG1B;IACF,OAAO,CAAC,sBAAsB,CAAuB;IACrD,OAAO,CAAC,YAAY,CAAgD;IACpE,OAAO,CAAC,iBAAiB,CAAyC;IAClE,OAAO,CAAC,gBAAgB,CAAkC;IAC1D,OAAO,CAAC,SAAS,CAAyB;;IAM1C,OAAO,CAAC,6BAA6B,CAkCnC;IAEF,SAAS,CAAC,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU;IAuGtC,KAAK,CAAC,MAAM,EAAE,UAAU;IAiG9B,OAAO,CAAC,qBAAqB;YAkBf,gBAAgB;YAOhB,iBAAiB;CAmChC;AAED,eAAe,iBAAiB,CAAC"}
@@ -129,35 +129,29 @@ class EmpiricalReporter {
129
129
  logger_1.logger.debug(`[Empirical Reporter] Test run completed with status: ${result.status}`);
130
130
  logger_1.logger.debug(`[Empirical Reporter] State: cwd=${this._currentWorkingDir}, hasSharding=${this._hasSharding}`);
131
131
  const startTime = Date.now();
132
- logger_1.logger.debug("[Empirical Reporter] Starting final report upload at: ", new Intl.DateTimeFormat("en-US", {
133
- hour: "2-digit",
134
- minute: "2-digit",
135
- second: "2-digit",
136
- }).format(startTime));
137
- const jsonFilePath = path_1.default.join(this._currentWorkingDir, "summary.json");
132
+ const reportDir = path_1.default.join(this._currentWorkingDir, "playwright-report");
133
+ const jsonFilePath = path_1.default.join(reportDir, "summary.json");
134
+ const htmlFilePath = path_1.default.join(reportDir, "index.html");
138
135
  const jsonExists = fs_1.default.existsSync(jsonFilePath);
139
- const htmlFilePath = path_1.default.join(this._currentWorkingDir, "playwright-report/index.html");
140
- const htmlExists = await (0, util_1.checkFileExistsAsync)(htmlFilePath);
136
+ const htmlExists = fs_1.default.existsSync(htmlFilePath);
141
137
  if (!htmlExists || !jsonExists) {
142
- this._logMissingFiles();
138
+ this._logReportDirContents();
143
139
  }
144
140
  if (htmlExists && jsonExists) {
145
- logger_1.logger.debug("[Empirical Reporter] Updating the HTML Zip");
141
+ logger_1.logger.debug("[Empirical Reporter] Patching HTML with attachment URLs");
146
142
  await (0, util_1.updateHtmlZipFileAttachmentPaths)(jsonFilePath, htmlFilePath, this._testResultSourceDir);
147
- logger_1.logger.debug("[Empirical Reporter] Uploading HTML file");
148
143
  await this._uploader.uploadFile(htmlFilePath, "index.html");
149
144
  }
150
- else {
151
- logger_1.logger.error(`[Empirical Reporter] playwright-report/index.html does not exist at: ${htmlFilePath}`);
145
+ else if (!htmlExists) {
146
+ logger_1.logger.error(`[Empirical Reporter] index.html not found at: ${htmlFilePath}`);
152
147
  }
153
148
  if (jsonExists) {
154
- logger_1.logger.debug("[Empirical Reporter] Updating the JSON file");
149
+ logger_1.logger.debug("[Empirical Reporter] Patching summary.json with attachment URLs");
155
150
  await (0, util_1.updateSummaryJsonAttachmentPaths)(jsonFilePath, this._testResultSourceDir, `${this._uploader.urlPrefix}/data`);
156
- logger_1.logger.debug("[Empirical Reporter] Uploading JSON file");
157
151
  await this._uploader.uploadFile(jsonFilePath, "summary.json");
158
152
  }
159
153
  else {
160
- logger_1.logger.error(`[Empirical Reporter] summary.json does not exist at: ${jsonFilePath}`);
154
+ logger_1.logger.error(`[Empirical Reporter] summary.json not found at: ${jsonFilePath}`);
161
155
  }
162
156
  const traceFilePath = path_1.default.join(this._currentWorkingDir, "playwright-report/trace");
163
157
  const traceExists = await (0, util_1.checkFileExistsAsync)(traceFilePath);
@@ -188,21 +182,19 @@ class EmpiricalReporter {
188
182
  const timeDiff = Date.now() - startTime;
189
183
  logger_1.logger.debug("[Empirical Reporter] Time taken to upload after tests ended: ", timeDiff, "ms");
190
184
  }
191
- _logMissingFiles() {
185
+ _logReportDirContents() {
192
186
  try {
193
- const cwdFiles = fs_1.default.readdirSync(this._currentWorkingDir);
194
- logger_1.logger.debug(`[Empirical Reporter] Files in cwd: ${cwdFiles.join(", ")}`);
195
187
  const reportDir = path_1.default.join(this._currentWorkingDir, "playwright-report");
196
188
  if (fs_1.default.existsSync(reportDir)) {
197
189
  const reportFiles = fs_1.default.readdirSync(reportDir);
198
- logger_1.logger.debug(`[Empirical Reporter] Files in playwright-report: ${reportFiles.join(", ")}`);
190
+ logger_1.logger.info(`[Empirical Reporter] Files in playwright-report: ${reportFiles.join(", ")}`);
199
191
  }
200
192
  else {
201
- logger_1.logger.debug(`[Empirical Reporter] playwright-report directory does not exist`);
193
+ logger_1.logger.warn(`[Empirical Reporter] playwright-report directory does not exist`);
202
194
  }
203
195
  }
204
196
  catch (e) {
205
- logger_1.logger.debug(`[Empirical Reporter] Error listing files: ${e}`);
197
+ logger_1.logger.error(`[Empirical Reporter] Error listing report dir: ${e}`);
206
198
  }
207
199
  }
208
200
  async _patchBlobReport(blobDir) {
@@ -0,0 +1,9 @@
1
+ import type { BrowserContext } from "@playwright/test";
2
+ export declare function setupCoverageCollection(context: BrowserContext): Promise<string[]>;
3
+ export declare function collectAndAttachCoverage(context: BrowserContext, coverageFiles: string[], testInfo: {
4
+ attach: (name: string, options: {
5
+ path: string;
6
+ contentType: string;
7
+ }) => Promise<void>;
8
+ }): Promise<void>;
9
+ //# sourceMappingURL=coverage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"coverage.d.ts","sourceRoot":"","sources":["../../src/test/coverage.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAYvD,wBAAsB,uBAAuB,CAAC,OAAO,EAAE,cAAc,qBAwBpE;AAED,wBAAsB,wBAAwB,CAC5C,OAAO,EAAE,cAAc,EACvB,aAAa,EAAE,MAAM,EAAE,EACvB,QAAQ,EAAE;IACR,MAAM,EAAE,CACN,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,KAC3C,OAAO,CAAC,IAAI,CAAC,CAAC;CACpB,iBAqBF"}
@@ -0,0 +1,46 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.setupCoverageCollection = setupCoverageCollection;
7
+ exports.collectAndAttachCoverage = collectAndAttachCoverage;
8
+ const fs_1 = __importDefault(require("fs"));
9
+ const path_1 = __importDefault(require("path"));
10
+ const istanbulCLIOutput = path_1.default.join(process.cwd(), ".nyc_output");
11
+ function generateCoverageFilename() {
12
+ const timestamp = Date.now();
13
+ const random = Math.random().toString(36).substring(2, 8);
14
+ return `coverage_${timestamp}_${random}.json`;
15
+ }
16
+ async function setupCoverageCollection(context) {
17
+ const coverageFiles = [];
18
+ await context.addInitScript(() => window.addEventListener("beforeunload", () => window.collectIstanbulCoverage(JSON.stringify(window.__coverage__))));
19
+ await fs_1.default.promises.mkdir(istanbulCLIOutput, { recursive: true });
20
+ await context.exposeFunction("collectIstanbulCoverage", (coverageJSON) => {
21
+ if (coverageJSON) {
22
+ const filepath = path_1.default.join(istanbulCLIOutput, generateCoverageFilename());
23
+ fs_1.default.writeFileSync(filepath, coverageJSON);
24
+ coverageFiles.push(filepath);
25
+ }
26
+ });
27
+ return coverageFiles;
28
+ }
29
+ async function collectAndAttachCoverage(context, coverageFiles, testInfo) {
30
+ for (const page of context.pages()) {
31
+ try {
32
+ await page.evaluate(() => window.collectIstanbulCoverage(JSON.stringify(window.__coverage__)));
33
+ }
34
+ catch {
35
+ // Page might be closed or coverage not available
36
+ }
37
+ }
38
+ for (const filepath of coverageFiles) {
39
+ if (fs_1.default.existsSync(filepath)) {
40
+ await testInfo.attach(path_1.default.basename(filepath), {
41
+ path: filepath,
42
+ contentType: "application/json",
43
+ });
44
+ }
45
+ }
46
+ }
@@ -3,7 +3,7 @@ import { KVClient } from "../kv";
3
3
  import { PostgresClient } from "../postgres";
4
4
  import { type WebhookMatcherOptions } from "./expect";
5
5
  import { injectLocatorHighlightScripts } from "./scripts";
6
- import { HighlighterOpts } from "./types";
6
+ import { type BaseTestFixtureOpts } from "./types";
7
7
  import { setVideoLabel } from "./video-labels";
8
8
  declare global {
9
9
  namespace PlaywrightTest {
@@ -24,6 +24,6 @@ type TestOptions = {
24
24
  }>;
25
25
  saveVideos: void;
26
26
  };
27
- declare const baseTestFixture: (testFn: TestType<PlaywrightTestArgs & PlaywrightTestOptions, PlaywrightWorkerArgs & PlaywrightWorkerOptions>, options?: HighlighterOpts) => TestType<PlaywrightTestArgs & PlaywrightTestOptions & TestOptions, PlaywrightWorkerArgs & PlaywrightWorkerOptions>;
27
+ declare const baseTestFixture: (testFn: TestType<PlaywrightTestArgs & PlaywrightTestOptions, PlaywrightWorkerArgs & PlaywrightWorkerOptions>, options?: BaseTestFixtureOpts) => TestType<PlaywrightTestArgs & PlaywrightTestOptions & TestOptions, PlaywrightWorkerArgs & PlaywrightWorkerOptions>;
28
28
  export { baseTestFixture, extendExpect, injectLocatorHighlightScripts, setVideoLabel, };
29
29
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/test/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,cAAc,EACd,qBAAqB,EACrB,MAAM,EACN,IAAI,EACJ,kBAAkB,EAClB,qBAAqB,EACrB,oBAAoB,EACpB,uBAAuB,EACvB,QAAQ,EACT,MAAM,kBAAkB,CAAC;AAG1B,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACjC,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAGL,KAAK,qBAAqB,EAC3B,MAAM,UAAU,CAAC;AAClB,OAAO,EAAE,6BAA6B,EAAE,MAAM,WAAW,CAAC;AAC1D,OAAO,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAC1C,OAAO,EAA8B,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAE3E,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,cAAc,CAAC;QACvB,UAAU,QAAQ,CAAC,CAAC;YAClB,WAAW,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;YAC7C,qBAAqB,CAAC,OAAO,EAAE,qBAAqB,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;SACnE;KACF;CACF;AAED,QAAA,MAAM,YAAY,GAAa,gBAAgB,OAAO,MAAM,0CAG3D,CAAC;AAEF,KAAK,WAAW,GAAG;IACjB,IAAI,EAAE,IAAI,CAAC;IACX,EAAE,EAAE,QAAQ,CAAC;IACb,QAAQ,EAAE,cAAc,CAAC;IACzB,yBAAyB,EAAE,CACzB,OAAO,CAAC,EAAE,qBAAqB,KAC5B,OAAO,CAAC;QAAE,OAAO,EAAE,cAAc,CAAC;QAAC,IAAI,EAAE,IAAI,CAAA;KAAE,CAAC,CAAC;IACtD,UAAU,EAAE,IAAI,CAAC;CAClB,CAAC;AAYF,QAAA,MAAM,eAAe,GACnB,QAAQ,QAAQ,CACd,kBAAkB,GAAG,qBAAqB,EAC1C,oBAAoB,GAAG,uBAAuB,CAC/C,EACD,UAAS,eAAgC,uHA2G1C,CAAC;AAEF,OAAO,EACL,eAAe,EACf,YAAY,EACZ,6BAA6B,EAC7B,aAAa,GACd,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/test/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,cAAc,EACd,qBAAqB,EACrB,MAAM,EACN,IAAI,EACJ,kBAAkB,EAClB,qBAAqB,EACrB,oBAAoB,EACpB,uBAAuB,EACvB,QAAQ,EACT,MAAM,kBAAkB,CAAC;AAG1B,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACjC,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAE7C,OAAO,EAGL,KAAK,qBAAqB,EAC3B,MAAM,UAAU,CAAC;AAClB,OAAO,EAAE,6BAA6B,EAAE,MAAM,WAAW,CAAC;AAC1D,OAAO,EAAE,KAAK,mBAAmB,EAAwB,MAAM,SAAS,CAAC;AACzE,OAAO,EAA8B,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAE3E,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,cAAc,CAAC;QACvB,UAAU,QAAQ,CAAC,CAAC;YAClB,WAAW,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;YAC7C,qBAAqB,CAAC,OAAO,EAAE,qBAAqB,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;SACnE;KACF;CACF;AAED,QAAA,MAAM,YAAY,GAAa,gBAAgB,OAAO,MAAM,0CAG3D,CAAC;AAEF,KAAK,WAAW,GAAG;IACjB,IAAI,EAAE,IAAI,CAAC;IACX,EAAE,EAAE,QAAQ,CAAC;IACb,QAAQ,EAAE,cAAc,CAAC;IACzB,yBAAyB,EAAE,CACzB,OAAO,CAAC,EAAE,qBAAqB,KAC5B,OAAO,CAAC;QAAE,OAAO,EAAE,cAAc,CAAC;QAAC,IAAI,EAAE,IAAI,CAAA;KAAE,CAAC,CAAC;IACtD,UAAU,EAAE,IAAI,CAAC;CAClB,CAAC;AAYF,QAAA,MAAM,eAAe,GACnB,QAAQ,QAAQ,CACd,kBAAkB,GAAG,qBAAqB,EAC1C,oBAAoB,GAAG,uBAAuB,CAC/C,EACD,UAAS,mBAAoC,uHAqH9C,CAAC;AAEF,OAAO,EACL,eAAe,EACf,YAAY,EACZ,6BAA6B,EAC7B,aAAa,GACd,CAAC"}
@@ -7,6 +7,7 @@ exports.setVideoLabel = exports.injectLocatorHighlightScripts = exports.extendEx
7
7
  const path_1 = __importDefault(require("path"));
8
8
  const kv_1 = require("../kv");
9
9
  const postgres_1 = require("../postgres");
10
+ const coverage_1 = require("./coverage");
10
11
  const expect_1 = require("./expect");
11
12
  const scripts_1 = require("./scripts");
12
13
  Object.defineProperty(exports, "injectLocatorHighlightScripts", { enumerable: true, get: function () { return scripts_1.injectLocatorHighlightScripts; } });
@@ -26,6 +27,7 @@ const defaultOptions = {
26
27
  agentCapabilities: true,
27
28
  };
28
29
  const baseTestFixture = function (testFn, options = defaultOptions) {
30
+ const coverageEnabled = options.collectCoverage ?? false;
29
31
  const extendedTestFn = testFn.extend({
30
32
  context: async ({ browser }, use, testInfo) => {
31
33
  const context = await browser.newContext({
@@ -36,7 +38,14 @@ const baseTestFixture = function (testFn, options = defaultOptions) {
36
38
  });
37
39
  const pages = [];
38
40
  context.on("page", (page) => pages.push(page));
41
+ let coverageFiles = [];
42
+ if (coverageEnabled) {
43
+ coverageFiles = await (0, coverage_1.setupCoverageCollection)(context);
44
+ }
39
45
  await use(context);
46
+ if (coverageEnabled) {
47
+ await (0, coverage_1.collectAndAttachCoverage)(context, coverageFiles, testInfo);
48
+ }
40
49
  if (!testPages.has(testInfo.testId)) {
41
50
  testPages.set(testInfo.testId, []);
42
51
  }
@@ -4,4 +4,7 @@ export type HighlighterOpts = {
4
4
  visionMethods?: boolean;
5
5
  agentCapabilities?: boolean;
6
6
  };
7
+ export type BaseTestFixtureOpts = HighlighterOpts & {
8
+ collectCoverage?: boolean;
9
+ };
7
10
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/test/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,eAAe,GAAG;IAC5B,uBAAuB,CAAC,EAAE,OAAO,CAAC;IAClC,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,iBAAiB,CAAC,EAAE,OAAO,CAAC;CAC7B,CAAC"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/test/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,eAAe,GAAG;IAC5B,uBAAuB,CAAC,EAAE,OAAO,CAAC;IAClC,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,iBAAiB,CAAC,EAAE,OAAO,CAAC;CAC7B,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG,eAAe,GAAG;IAClD,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@empiricalrun/playwright-utils",
3
- "version": "0.42.0",
3
+ "version": "0.43.1",
4
4
  "publishConfig": {
5
5
  "registry": "https://registry.npmjs.org/",
6
6
  "access": "public"
@@ -43,11 +43,11 @@
43
43
  "puppeteer-extra-plugin-recaptcha": "^3.6.8",
44
44
  "rimraf": "^6.0.1",
45
45
  "ts-morph": "^23.0.0",
46
- "@empiricalrun/cua": "^0.3.0",
47
- "@empiricalrun/dashboard-client": "^0.2.0",
48
46
  "@empiricalrun/llm": "^0.26.0",
49
47
  "@empiricalrun/r2-uploader": "^0.9.1",
50
- "@empiricalrun/reporter": "^0.28.0"
48
+ "@empiricalrun/reporter": "^0.28.0",
49
+ "@empiricalrun/cua": "^0.3.0",
50
+ "@empiricalrun/dashboard-client": "^0.2.0"
51
51
  },
52
52
  "scripts": {
53
53
  "dev": "tsc --build --watch",
@@ -1 +1 @@
1
- {"root":["./src/email.ts","./src/index.ts","./src/kv.ts","./src/logger.ts","./src/mailosaur-client.ts","./src/playwright-extensions.ts","./src/postgres.ts","./src/telemetry.ts","./src/webhook.ts","./src/auth/google.ts","./src/auth/index.ts","./src/auth/types.ts","./src/captcha/index.ts","./src/config/index.ts","./src/config/proxy.ts","./src/config/devices/types.ts","./src/overlay-tests/cache.spec.ts","./src/overlay-tests/click.spec.ts","./src/overlay-tests/fixtures.ts","./src/overlay-tests/patch.spec.ts","./src/reporter/blob-utils.ts","./src/reporter/empirical-reporter.ts","./src/reporter/failing-line.ts","./src/reporter/incremental-blob-reporter.ts","./src/reporter/uploader.ts","./src/reporter/util.ts","./src/test/constants.ts","./src/test/index.ts","./src/test/types.ts","./src/test/video-labels.ts","./src/test/expect/index.ts","./src/test/expect/types.ts","./src/test/expect/visual.ts","./src/test/expect/webhook.ts","./src/test/scripts/agent-capabilities.ts","./src/test/scripts/index.ts","./src/test/scripts/locator-highlights.ts","./src/test/scripts/locator-vision.ts","./src/test/scripts/mouse-pointer.ts","./src/test/scripts/types.ts","./src/test/scripts/pw-locator-patch/dismiss-overlays/cache.ts","./src/test/scripts/pw-locator-patch/dismiss-overlays/index.ts","./src/test/scripts/pw-locator-patch/dismiss-overlays/prompt.ts","./src/test/scripts/pw-locator-patch/dismiss-overlays/types.ts","./src/test/scripts/pw-locator-patch/dismiss-overlays/utils.ts","./src/test/scripts/pw-locator-patch/highlight/click.ts","./src/test/scripts/pw-locator-patch/highlight/expect.ts","./src/test/scripts/pw-locator-patch/highlight/hover.ts","./src/test/scripts/pw-locator-patch/highlight/inner-text.ts","./src/test/scripts/pw-locator-patch/highlight/input-value.ts","./src/test/scripts/pw-locator-patch/highlight/is-checked.ts","./src/test/scripts/pw-locator-patch/highlight/is-disabled.ts","./src/test/scripts/pw-locator-patch/highlight/is-editable.ts","./src/test/scripts/pw-locator-patch/highlight/text-content.ts","./src/test/scripts/pw-locator-patch/utils/index.ts","./src/test/scripts/pw-locator-patch/vision/query.ts"],"version":"5.8.3"}
1
+ {"root":["./src/email.ts","./src/index.ts","./src/kv.ts","./src/logger.ts","./src/mailosaur-client.ts","./src/playwright-extensions.ts","./src/postgres.ts","./src/telemetry.ts","./src/webhook.ts","./src/auth/google.ts","./src/auth/index.ts","./src/auth/types.ts","./src/captcha/index.ts","./src/config/index.ts","./src/config/proxy.ts","./src/config/devices/types.ts","./src/overlay-tests/cache.spec.ts","./src/overlay-tests/click.spec.ts","./src/overlay-tests/fixtures.ts","./src/overlay-tests/patch.spec.ts","./src/reporter/blob-utils.ts","./src/reporter/empirical-reporter.ts","./src/reporter/failing-line.ts","./src/reporter/incremental-blob-reporter.ts","./src/reporter/uploader.ts","./src/reporter/util.ts","./src/test/constants.ts","./src/test/coverage.ts","./src/test/index.ts","./src/test/types.ts","./src/test/video-labels.ts","./src/test/expect/index.ts","./src/test/expect/types.ts","./src/test/expect/visual.ts","./src/test/expect/webhook.ts","./src/test/scripts/agent-capabilities.ts","./src/test/scripts/index.ts","./src/test/scripts/locator-highlights.ts","./src/test/scripts/locator-vision.ts","./src/test/scripts/mouse-pointer.ts","./src/test/scripts/types.ts","./src/test/scripts/pw-locator-patch/dismiss-overlays/cache.ts","./src/test/scripts/pw-locator-patch/dismiss-overlays/index.ts","./src/test/scripts/pw-locator-patch/dismiss-overlays/prompt.ts","./src/test/scripts/pw-locator-patch/dismiss-overlays/types.ts","./src/test/scripts/pw-locator-patch/dismiss-overlays/utils.ts","./src/test/scripts/pw-locator-patch/highlight/click.ts","./src/test/scripts/pw-locator-patch/highlight/expect.ts","./src/test/scripts/pw-locator-patch/highlight/hover.ts","./src/test/scripts/pw-locator-patch/highlight/inner-text.ts","./src/test/scripts/pw-locator-patch/highlight/input-value.ts","./src/test/scripts/pw-locator-patch/highlight/is-checked.ts","./src/test/scripts/pw-locator-patch/highlight/is-disabled.ts","./src/test/scripts/pw-locator-patch/highlight/is-editable.ts","./src/test/scripts/pw-locator-patch/highlight/text-content.ts","./src/test/scripts/pw-locator-patch/utils/index.ts","./src/test/scripts/pw-locator-patch/vision/query.ts"],"version":"5.8.3"}