@empiricalrun/playwright-utils 0.33.0 → 0.34.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 +12 -0
- package/README.md +2 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/postgres.d.ts +22 -0
- package/dist/postgres.d.ts.map +1 -0
- package/dist/postgres.js +133 -0
- package/dist/test/index.d.ts +2 -0
- package/dist/test/index.d.ts.map +1 -1
- package/dist/test/index.js +5 -0
- package/docs/postgres.md +78 -0
- package/package.json +3 -1
- package/tsconfig.tsbuildinfo +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,17 @@
|
|
|
1
1
|
# @empiricalrun/playwright-utils
|
|
2
2
|
|
|
3
|
+
## 0.34.1
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- 510c376: fix: get or create behavior in postgres client
|
|
8
|
+
|
|
9
|
+
## 0.34.0
|
|
10
|
+
|
|
11
|
+
### Minor Changes
|
|
12
|
+
|
|
13
|
+
- 88dd018: feat: proxy endpoint for neon db on dash
|
|
14
|
+
|
|
3
15
|
## 0.33.0
|
|
4
16
|
|
|
5
17
|
### Minor Changes
|
package/README.md
CHANGED
package/dist/index.d.ts
CHANGED
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,QAAQ,CAAC;AACvB,cAAc,eAAe,CAAC;AAC9B,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAC3C,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AACjE,cAAc,SAAS,CAAC;AACxB,cAAc,MAAM,CAAC;AACrB,cAAc,yBAAyB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,QAAQ,CAAC;AACvB,cAAc,eAAe,CAAC;AAC9B,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAC3C,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AACjE,cAAc,SAAS,CAAC;AACxB,cAAc,MAAM,CAAC;AACrB,cAAc,yBAAyB,CAAC;AACxC,cAAc,YAAY,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -26,3 +26,4 @@ Object.defineProperty(exports, "devices", { enumerable: true, get: function () {
|
|
|
26
26
|
__exportStar(require("./email"), exports);
|
|
27
27
|
__exportStar(require("./kv"), exports);
|
|
28
28
|
__exportStar(require("./playwright-extensions"), exports);
|
|
29
|
+
__exportStar(require("./postgres"), exports);
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
export type PostgresDatabase = {
|
|
2
|
+
projectId: string;
|
|
3
|
+
connectionUri: string;
|
|
4
|
+
};
|
|
5
|
+
type GetOptions = {
|
|
6
|
+
pgVersion?: number;
|
|
7
|
+
};
|
|
8
|
+
export declare class PostgresClient {
|
|
9
|
+
private client;
|
|
10
|
+
constructor();
|
|
11
|
+
get(name: string, options?: GetOptions): Promise<PostgresDatabase>;
|
|
12
|
+
private getConnectionUri;
|
|
13
|
+
delete(projectId: string): Promise<void>;
|
|
14
|
+
query<T = Record<string, unknown>>(connectionUri: string, sql: string): Promise<T[]>;
|
|
15
|
+
execute(connectionUri: string, sql: string): Promise<{
|
|
16
|
+
statement: string;
|
|
17
|
+
rowCount: number;
|
|
18
|
+
}[]>;
|
|
19
|
+
private parseStatements;
|
|
20
|
+
}
|
|
21
|
+
export {};
|
|
22
|
+
//# sourceMappingURL=postgres.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"postgres.d.ts","sourceRoot":"","sources":["../src/postgres.ts"],"names":[],"mappings":"AAgDA,MAAM,MAAM,gBAAgB,GAAG;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;CACvB,CAAC;AAEF,KAAK,UAAU,GAAG;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,qBAAa,cAAc;IACzB,OAAO,CAAC,MAAM,CAAqB;;IAW7B,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC,gBAAgB,CAAC;YAqD1D,gBAAgB;IAwBxB,MAAM,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAiBxC,KAAK,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACrC,aAAa,EAAE,MAAM,EACrB,GAAG,EAAE,MAAM,GACV,OAAO,CAAC,CAAC,EAAE,CAAC;IAWT,OAAO,CACX,aAAa,EAAE,MAAM,EACrB,GAAG,EAAE,MAAM,GACV,OAAO,CAAC;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAsBrD,OAAO,CAAC,eAAe;CAsBxB"}
|
package/dist/postgres.js
ADDED
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.PostgresClient = void 0;
|
|
4
|
+
const dashboard_1 = require("@empiricalrun/test-gen/dashboard");
|
|
5
|
+
const pg_1 = require("pg");
|
|
6
|
+
class PostgresClient {
|
|
7
|
+
client;
|
|
8
|
+
constructor() {
|
|
9
|
+
if (!process.env.EMPIRICALRUN_API_KEY) {
|
|
10
|
+
throw new Error("EMPIRICALRUN_API_KEY environment variable is required");
|
|
11
|
+
}
|
|
12
|
+
this.client = new dashboard_1.DashboardAPIClient({
|
|
13
|
+
authType: "project-api-key",
|
|
14
|
+
});
|
|
15
|
+
}
|
|
16
|
+
async get(name, options) {
|
|
17
|
+
const listResponse = await this.client.request("/api/neon/proxy", {
|
|
18
|
+
method: "POST",
|
|
19
|
+
body: {
|
|
20
|
+
action: "list",
|
|
21
|
+
},
|
|
22
|
+
});
|
|
23
|
+
if (listResponse.error) {
|
|
24
|
+
throw new Error(`Postgres list failed: ${listResponse.error}`);
|
|
25
|
+
}
|
|
26
|
+
const existingProject = listResponse.data.projects.find((p) => p.name === name);
|
|
27
|
+
if (existingProject) {
|
|
28
|
+
const connectionUri = await this.getConnectionUri(existingProject.id);
|
|
29
|
+
return { projectId: existingProject.id, connectionUri };
|
|
30
|
+
}
|
|
31
|
+
const createResponse = await this.client.request("/api/neon/proxy", {
|
|
32
|
+
method: "POST",
|
|
33
|
+
body: {
|
|
34
|
+
action: "create",
|
|
35
|
+
payload: {
|
|
36
|
+
name,
|
|
37
|
+
pg_version: options?.pgVersion,
|
|
38
|
+
},
|
|
39
|
+
},
|
|
40
|
+
});
|
|
41
|
+
if (createResponse.error) {
|
|
42
|
+
throw new Error(`Postgres create failed: ${createResponse.error}`);
|
|
43
|
+
}
|
|
44
|
+
const projectId = createResponse.data.project.id;
|
|
45
|
+
const connectionUri = createResponse.data.connection_uris?.[0]?.connection_uri;
|
|
46
|
+
if (!connectionUri) {
|
|
47
|
+
throw new Error("No connection URI returned from Neon API");
|
|
48
|
+
}
|
|
49
|
+
return { projectId, connectionUri };
|
|
50
|
+
}
|
|
51
|
+
async getConnectionUri(projectId) {
|
|
52
|
+
const response = await this.client.request("/api/neon/proxy", {
|
|
53
|
+
method: "POST",
|
|
54
|
+
body: {
|
|
55
|
+
action: "getConnectionUri",
|
|
56
|
+
projectId,
|
|
57
|
+
payload: {
|
|
58
|
+
databaseName: "neondb",
|
|
59
|
+
roleName: "neondb_owner",
|
|
60
|
+
pooled: false,
|
|
61
|
+
},
|
|
62
|
+
},
|
|
63
|
+
});
|
|
64
|
+
if (response.error) {
|
|
65
|
+
throw new Error(`Postgres getConnectionUri failed: ${response.error}`);
|
|
66
|
+
}
|
|
67
|
+
return response.data.uri;
|
|
68
|
+
}
|
|
69
|
+
async delete(projectId) {
|
|
70
|
+
const response = await this.client.request("/api/neon/proxy", {
|
|
71
|
+
method: "POST",
|
|
72
|
+
body: {
|
|
73
|
+
action: "delete",
|
|
74
|
+
projectId,
|
|
75
|
+
},
|
|
76
|
+
});
|
|
77
|
+
if (response.error) {
|
|
78
|
+
throw new Error(`Postgres delete failed: ${response.error}`);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
async query(connectionUri, sql) {
|
|
82
|
+
const client = new pg_1.Client({ connectionString: connectionUri });
|
|
83
|
+
try {
|
|
84
|
+
await client.connect();
|
|
85
|
+
const result = await client.query(sql);
|
|
86
|
+
return result.rows;
|
|
87
|
+
}
|
|
88
|
+
finally {
|
|
89
|
+
await client.end();
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
async execute(connectionUri, sql) {
|
|
93
|
+
const client = new pg_1.Client({ connectionString: connectionUri });
|
|
94
|
+
const results = [];
|
|
95
|
+
try {
|
|
96
|
+
await client.connect();
|
|
97
|
+
const statements = this.parseStatements(sql);
|
|
98
|
+
for (const statement of statements) {
|
|
99
|
+
const result = await client.query(statement);
|
|
100
|
+
results.push({
|
|
101
|
+
statement: statement.substring(0, 80),
|
|
102
|
+
rowCount: result.rowCount ?? 0,
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
return results;
|
|
106
|
+
}
|
|
107
|
+
finally {
|
|
108
|
+
await client.end();
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
parseStatements(sql) {
|
|
112
|
+
const lines = sql.split("\n");
|
|
113
|
+
const cleanedLines = [];
|
|
114
|
+
for (const line of lines) {
|
|
115
|
+
const trimmed = line.trim();
|
|
116
|
+
if (trimmed && !trimmed.startsWith("--")) {
|
|
117
|
+
const commentIndex = line.indexOf("--");
|
|
118
|
+
if (commentIndex > 0) {
|
|
119
|
+
cleanedLines.push(line.substring(0, commentIndex));
|
|
120
|
+
}
|
|
121
|
+
else {
|
|
122
|
+
cleanedLines.push(line);
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
return cleanedLines
|
|
127
|
+
.join("\n")
|
|
128
|
+
.split(";")
|
|
129
|
+
.map((q) => q.trim())
|
|
130
|
+
.filter((q) => q.length > 0);
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
exports.PostgresClient = PostgresClient;
|
package/dist/test/index.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type { BrowserContext, BrowserContextOptions, expect, Page, PlaywrightTestArgs, PlaywrightTestOptions, PlaywrightWorkerArgs, PlaywrightWorkerOptions, TestType } from "@playwright/test";
|
|
2
2
|
import { KVClient } from "../kv";
|
|
3
|
+
import { PostgresClient } from "../postgres";
|
|
3
4
|
import { injectLocatorHighlightScripts } from "./scripts";
|
|
4
5
|
import { HighlighterOpts } from "./types";
|
|
5
6
|
import { setVideoLabel } from "./video-labels";
|
|
@@ -14,6 +15,7 @@ declare const extendExpect: (expectInstance: typeof expect) => import("@playwrig
|
|
|
14
15
|
type TestOptions = {
|
|
15
16
|
page: Page;
|
|
16
17
|
kv: KVClient;
|
|
18
|
+
postgres: PostgresClient;
|
|
17
19
|
customContextPageProvider: (options?: BrowserContextOptions) => Promise<{
|
|
18
20
|
context: BrowserContext;
|
|
19
21
|
page: Page;
|
package/dist/test/index.d.ts.map
CHANGED
|
@@ -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;
|
|
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,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;SAC9C;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"}
|
package/dist/test/index.js
CHANGED
|
@@ -6,6 +6,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
6
6
|
exports.setVideoLabel = exports.injectLocatorHighlightScripts = exports.extendExpect = exports.baseTestFixture = void 0;
|
|
7
7
|
const path_1 = __importDefault(require("path"));
|
|
8
8
|
const kv_1 = require("../kv");
|
|
9
|
+
const postgres_1 = require("../postgres");
|
|
9
10
|
const expect_1 = require("./expect");
|
|
10
11
|
const scripts_1 = require("./scripts");
|
|
11
12
|
Object.defineProperty(exports, "injectLocatorHighlightScripts", { enumerable: true, get: function () { return scripts_1.injectLocatorHighlightScripts; } });
|
|
@@ -53,6 +54,10 @@ const baseTestFixture = function (testFn, options = defaultOptions) {
|
|
|
53
54
|
const client = new kv_1.KVClient();
|
|
54
55
|
await use(client);
|
|
55
56
|
},
|
|
57
|
+
postgres: async ({}, use) => {
|
|
58
|
+
const client = new postgres_1.PostgresClient();
|
|
59
|
+
await use(client);
|
|
60
|
+
},
|
|
56
61
|
customContextPageProvider: async ({ browser }, use, testInfo) => {
|
|
57
62
|
const contexts = [];
|
|
58
63
|
async function createContext(contextOptions = {}) {
|
package/docs/postgres.md
ADDED
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
# Postgres
|
|
2
|
+
|
|
3
|
+
A PostgreSQL client for creating and managing temporary Neon databases in tests.
|
|
4
|
+
|
|
5
|
+
## Fixture usage
|
|
6
|
+
|
|
7
|
+
```ts
|
|
8
|
+
test("example", async ({ page, postgres }) => {
|
|
9
|
+
// Get or create a database (cached via KV for 1 hour by default)
|
|
10
|
+
const { connectionUri } = await postgres.get("my-test-db");
|
|
11
|
+
|
|
12
|
+
// Run queries
|
|
13
|
+
const users = await postgres.query<{ id: number; name: string }>(
|
|
14
|
+
connectionUri,
|
|
15
|
+
"SELECT * FROM users",
|
|
16
|
+
);
|
|
17
|
+
|
|
18
|
+
// Execute multiple SQL statements
|
|
19
|
+
await postgres.execute(
|
|
20
|
+
connectionUri,
|
|
21
|
+
`
|
|
22
|
+
CREATE TABLE users (id SERIAL PRIMARY KEY, name TEXT);
|
|
23
|
+
INSERT INTO users (name) VALUES ('Alice');
|
|
24
|
+
`,
|
|
25
|
+
);
|
|
26
|
+
|
|
27
|
+
// Delete when done (optional - TTL will auto-expire)
|
|
28
|
+
await postgres.delete("my-test-db");
|
|
29
|
+
});
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
## Standalone usage
|
|
33
|
+
|
|
34
|
+
```ts
|
|
35
|
+
import { PostgresClient } from "@empiricalrun/playwright-utils";
|
|
36
|
+
|
|
37
|
+
const postgres = new PostgresClient();
|
|
38
|
+
|
|
39
|
+
// Get or create a database
|
|
40
|
+
const { projectId, connectionUri } = await postgres.get("my-db", {
|
|
41
|
+
pgVersion: 15,
|
|
42
|
+
ttl: 7200, // 2 hours
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
// Run a query
|
|
46
|
+
const rows = await postgres.query(connectionUri, "SELECT NOW()");
|
|
47
|
+
|
|
48
|
+
// Delete when done
|
|
49
|
+
await postgres.delete("my-db");
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
## API
|
|
53
|
+
|
|
54
|
+
### `postgres.get(name, options?)`
|
|
55
|
+
|
|
56
|
+
Gets an existing database or creates a new one. Uses KV store to cache the connection.
|
|
57
|
+
|
|
58
|
+
- `name` - Unique identifier for the database
|
|
59
|
+
- `options.pgVersion` - PostgreSQL version (default: 15)
|
|
60
|
+
- `options.ttl` - Cache TTL in seconds (default: 3600)
|
|
61
|
+
|
|
62
|
+
Returns `{ projectId, connectionUri }`.
|
|
63
|
+
|
|
64
|
+
### `postgres.delete(name)`
|
|
65
|
+
|
|
66
|
+
Deletes the database and removes it from cache.
|
|
67
|
+
|
|
68
|
+
### `postgres.query(connectionUri, sql)`
|
|
69
|
+
|
|
70
|
+
Runs a SQL query and returns rows.
|
|
71
|
+
|
|
72
|
+
### `postgres.execute(connectionUri, sql)`
|
|
73
|
+
|
|
74
|
+
Executes multiple SQL statements separated by `;`.
|
|
75
|
+
|
|
76
|
+
## Requirements
|
|
77
|
+
|
|
78
|
+
- `EMPIRICALRUN_API_KEY` environment variable must be set
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@empiricalrun/playwright-utils",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.34.1",
|
|
4
4
|
"publishConfig": {
|
|
5
5
|
"registry": "https://registry.npmjs.org/",
|
|
6
6
|
"access": "public"
|
|
@@ -30,12 +30,14 @@
|
|
|
30
30
|
"@types/node": "^20.14.9",
|
|
31
31
|
"@types/serve-handler": "^6.1.4",
|
|
32
32
|
"@types/adm-zip": "^0.5.7",
|
|
33
|
+
"@types/pg": "^8.11.6",
|
|
33
34
|
"playwright-core": "1.53.2",
|
|
34
35
|
"serve-handler": "^6.1.6",
|
|
35
36
|
"@empiricalrun/shared-types": "0.12.0"
|
|
36
37
|
},
|
|
37
38
|
"dependencies": {
|
|
38
39
|
"@babel/code-frame": "^7.24.7",
|
|
40
|
+
"pg": "^8.13.1",
|
|
39
41
|
"adm-zip": "^0.5.16",
|
|
40
42
|
"async-retry": "^1.3.3",
|
|
41
43
|
"authenticator": "^1.1.5",
|
package/tsconfig.tsbuildinfo
CHANGED
|
@@ -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/auth/google.ts","./src/auth/index.ts","./src/auth/types.ts","./src/captcha/index.ts","./src/captcha/vision.ts","./src/config/index.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/empirical-reporter.ts","./src/reporter/uploader.ts","./src/reporter/util.ts","./src/test/constants.ts","./src/test/expect.ts","./src/test/index.ts","./src/test/types.ts","./src/test/video-labels.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/auth/google.ts","./src/auth/index.ts","./src/auth/types.ts","./src/captcha/index.ts","./src/captcha/vision.ts","./src/config/index.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/empirical-reporter.ts","./src/reporter/uploader.ts","./src/reporter/util.ts","./src/test/constants.ts","./src/test/expect.ts","./src/test/index.ts","./src/test/types.ts","./src/test/video-labels.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"}
|