@ricsam/isolate-playwright 0.1.4 → 0.1.5

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,287 @@
1
+ // @bun @bun-cjs
2
+ (function(exports, require, module, __filename, __dirname) {var __defProp = Object.defineProperty;
3
+ var __getOwnPropNames = Object.getOwnPropertyNames;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __moduleCache = /* @__PURE__ */ new WeakMap;
7
+ var __toCommonJS = (from) => {
8
+ var entry = __moduleCache.get(from), desc;
9
+ if (entry)
10
+ return entry;
11
+ entry = __defProp({}, "__esModule", { value: true });
12
+ if (from && typeof from === "object" || typeof from === "function")
13
+ __getOwnPropNames(from).map((key) => !__hasOwnProp.call(entry, key) && __defProp(entry, key, {
14
+ get: () => from[key],
15
+ enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
16
+ }));
17
+ __moduleCache.set(from, entry);
18
+ return entry;
19
+ };
20
+ var __export = (target, all) => {
21
+ for (var name in all)
22
+ __defProp(target, name, {
23
+ get: all[name],
24
+ enumerable: true,
25
+ configurable: true,
26
+ set: (newValue) => all[name] = () => newValue
27
+ });
28
+ };
29
+
30
+ // packages/playwright/src/client.ts
31
+ var exports_client = {};
32
+ __export(exports_client, {
33
+ createPlaywrightHandler: () => createPlaywrightHandler
34
+ });
35
+ module.exports = __toCommonJS(exports_client);
36
+ function getLocator(page, selectorType, selectorValue, optionsJson) {
37
+ const options = optionsJson ? JSON.parse(optionsJson) : undefined;
38
+ const nthIndex = options?.nth;
39
+ const roleOptions = options ? { ...options } : undefined;
40
+ if (roleOptions) {
41
+ delete roleOptions.nth;
42
+ }
43
+ let locator;
44
+ switch (selectorType) {
45
+ case "css":
46
+ locator = page.locator(selectorValue);
47
+ break;
48
+ case "role":
49
+ locator = page.getByRole(selectorValue, roleOptions && Object.keys(roleOptions).length > 0 ? roleOptions : undefined);
50
+ break;
51
+ case "text":
52
+ locator = page.getByText(selectorValue);
53
+ break;
54
+ case "label":
55
+ locator = page.getByLabel(selectorValue);
56
+ break;
57
+ case "placeholder":
58
+ locator = page.getByPlaceholder(selectorValue);
59
+ break;
60
+ case "testId":
61
+ locator = page.getByTestId(selectorValue);
62
+ break;
63
+ default:
64
+ locator = page.locator(selectorValue);
65
+ }
66
+ if (nthIndex !== undefined) {
67
+ locator = locator.nth(nthIndex);
68
+ }
69
+ return locator;
70
+ }
71
+ async function executeLocatorAction(locator, action, actionArg, timeout) {
72
+ switch (action) {
73
+ case "click":
74
+ await locator.click({ timeout });
75
+ return null;
76
+ case "dblclick":
77
+ await locator.dblclick({ timeout });
78
+ return null;
79
+ case "fill":
80
+ await locator.fill(String(actionArg ?? ""), { timeout });
81
+ return null;
82
+ case "type":
83
+ await locator.pressSequentially(String(actionArg ?? ""), { timeout });
84
+ return null;
85
+ case "check":
86
+ await locator.check({ timeout });
87
+ return null;
88
+ case "uncheck":
89
+ await locator.uncheck({ timeout });
90
+ return null;
91
+ case "selectOption":
92
+ await locator.selectOption(String(actionArg ?? ""), { timeout });
93
+ return null;
94
+ case "clear":
95
+ await locator.clear({ timeout });
96
+ return null;
97
+ case "press":
98
+ await locator.press(String(actionArg ?? ""), { timeout });
99
+ return null;
100
+ case "hover":
101
+ await locator.hover({ timeout });
102
+ return null;
103
+ case "focus":
104
+ await locator.focus({ timeout });
105
+ return null;
106
+ case "getText":
107
+ return await locator.textContent({ timeout });
108
+ case "getValue":
109
+ return await locator.inputValue({ timeout });
110
+ case "isVisible":
111
+ return await locator.isVisible();
112
+ case "isEnabled":
113
+ return await locator.isEnabled();
114
+ case "isChecked":
115
+ return await locator.isChecked();
116
+ case "count":
117
+ return await locator.count();
118
+ default:
119
+ throw new Error(`Unknown action: ${action}`);
120
+ }
121
+ }
122
+ async function executeExpectAssertion(locator, matcher, expected, negated, timeout) {
123
+ switch (matcher) {
124
+ case "toBeVisible": {
125
+ const isVisible = await locator.isVisible();
126
+ if (negated) {
127
+ if (isVisible)
128
+ throw new Error("Expected element to not be visible, but it was visible");
129
+ } else {
130
+ if (!isVisible)
131
+ throw new Error("Expected element to be visible, but it was not");
132
+ }
133
+ break;
134
+ }
135
+ case "toContainText": {
136
+ const text = await locator.textContent({ timeout });
137
+ const matches = text?.includes(String(expected)) ?? false;
138
+ if (negated) {
139
+ if (matches)
140
+ throw new Error(`Expected text to not contain "${expected}", but got "${text}"`);
141
+ } else {
142
+ if (!matches)
143
+ throw new Error(`Expected text to contain "${expected}", but got "${text}"`);
144
+ }
145
+ break;
146
+ }
147
+ case "toHaveValue": {
148
+ const value = await locator.inputValue({ timeout });
149
+ const matches = value === String(expected);
150
+ if (negated) {
151
+ if (matches)
152
+ throw new Error(`Expected value to not be "${expected}", but it was`);
153
+ } else {
154
+ if (!matches)
155
+ throw new Error(`Expected value to be "${expected}", but got "${value}"`);
156
+ }
157
+ break;
158
+ }
159
+ case "toBeEnabled": {
160
+ const isEnabled = await locator.isEnabled();
161
+ if (negated) {
162
+ if (isEnabled)
163
+ throw new Error("Expected element to be disabled, but it was enabled");
164
+ } else {
165
+ if (!isEnabled)
166
+ throw new Error("Expected element to be enabled, but it was disabled");
167
+ }
168
+ break;
169
+ }
170
+ case "toBeChecked": {
171
+ const isChecked = await locator.isChecked();
172
+ if (negated) {
173
+ if (isChecked)
174
+ throw new Error("Expected element to not be checked, but it was checked");
175
+ } else {
176
+ if (!isChecked)
177
+ throw new Error("Expected element to be checked, but it was not");
178
+ }
179
+ break;
180
+ }
181
+ default:
182
+ throw new Error(`Unknown matcher: ${matcher}`);
183
+ }
184
+ }
185
+ function createPlaywrightHandler(page, options) {
186
+ const timeout = options?.timeout ?? 30000;
187
+ const baseUrl = options?.baseUrl;
188
+ return async (op) => {
189
+ try {
190
+ switch (op.type) {
191
+ case "goto": {
192
+ const [url, waitUntil] = op.args;
193
+ const targetUrl = baseUrl && !url.startsWith("http") ? `${baseUrl}${url}` : url;
194
+ await page.goto(targetUrl, {
195
+ timeout,
196
+ waitUntil: waitUntil ?? "load"
197
+ });
198
+ return { ok: true };
199
+ }
200
+ case "reload":
201
+ await page.reload({ timeout });
202
+ return { ok: true };
203
+ case "url":
204
+ return { ok: true, value: page.url() };
205
+ case "title":
206
+ return { ok: true, value: await page.title() };
207
+ case "content":
208
+ return { ok: true, value: await page.content() };
209
+ case "waitForSelector": {
210
+ const [selector, optionsJson] = op.args;
211
+ const opts = optionsJson ? JSON.parse(optionsJson) : {};
212
+ await page.waitForSelector(selector, { timeout, ...opts });
213
+ return { ok: true };
214
+ }
215
+ case "waitForTimeout": {
216
+ const [ms] = op.args;
217
+ await page.waitForTimeout(ms);
218
+ return { ok: true };
219
+ }
220
+ case "waitForLoadState": {
221
+ const [state] = op.args;
222
+ await page.waitForLoadState(state ?? "load", { timeout });
223
+ return { ok: true };
224
+ }
225
+ case "evaluate": {
226
+ const [script] = op.args;
227
+ const result = await page.evaluate(script);
228
+ return { ok: true, value: result };
229
+ }
230
+ case "locatorAction": {
231
+ const [selectorType, selectorValue, roleOptions, action, actionArg] = op.args;
232
+ const locator = getLocator(page, selectorType, selectorValue, roleOptions);
233
+ const result = await executeLocatorAction(locator, action, actionArg, timeout);
234
+ return { ok: true, value: result };
235
+ }
236
+ case "expectLocator": {
237
+ const [selectorType, selectorValue, roleOptions, matcher, expected, negated, customTimeout] = op.args;
238
+ const locator = getLocator(page, selectorType, selectorValue, roleOptions);
239
+ const effectiveTimeout = customTimeout ?? timeout;
240
+ await executeExpectAssertion(locator, matcher, expected, negated ?? false, effectiveTimeout);
241
+ return { ok: true };
242
+ }
243
+ case "request": {
244
+ const [url, method, data, headers] = op.args;
245
+ const targetUrl = baseUrl && !url.startsWith("http") ? `${baseUrl}${url}` : url;
246
+ const requestOptions = {
247
+ timeout
248
+ };
249
+ if (headers) {
250
+ requestOptions.headers = headers;
251
+ }
252
+ if (data !== undefined && data !== null) {
253
+ requestOptions.data = data;
254
+ }
255
+ const response = await page.request.fetch(targetUrl, {
256
+ method,
257
+ ...requestOptions
258
+ });
259
+ const text = await response.text();
260
+ let json = null;
261
+ try {
262
+ json = JSON.parse(text);
263
+ } catch {}
264
+ return {
265
+ ok: true,
266
+ value: {
267
+ status: response.status(),
268
+ ok: response.ok(),
269
+ headers: response.headers(),
270
+ text,
271
+ json,
272
+ body: null
273
+ }
274
+ };
275
+ }
276
+ default:
277
+ return { ok: false, error: { name: "Error", message: `Unknown operation: ${op.type}` } };
278
+ }
279
+ } catch (err) {
280
+ const error = err;
281
+ return { ok: false, error: { name: error.name, message: error.message } };
282
+ }
283
+ };
284
+ }
285
+ })
286
+
287
+ //# debugId=32EDBABEF8B46B5164756E2164756E21
@@ -0,0 +1,10 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/client.ts"],
4
+ "sourcesContent": [
5
+ "/**\n * Client-safe exports for @ricsam/isolate-playwright\n * This module can be imported without loading isolated-vm\n */\n\nimport type { Page, Locator as PlaywrightLocator } from \"playwright\";\nimport type {\n PlaywrightOperation,\n PlaywrightResult,\n} from \"@ricsam/isolate-protocol\";\n\n// Re-export types\nexport type {\n NetworkRequestInfo,\n NetworkResponseInfo,\n BrowserConsoleLogEntry,\n PlaywrightSetupOptions,\n PlaywrightOptions,\n PlaywrightHandle,\n} from \"./types.cjs\";\n\n// Import PlaywrightCallback for use in function return type\nimport type { PlaywrightCallback } from \"./types.cjs\";\nexport type { PlaywrightCallback };\n\nexport type { PlaywrightOperation, PlaywrightResult, PlaywrightEvent } from \"@ricsam/isolate-protocol\";\n\n// ============================================================================\n// Helper: Get locator from selector info\n// ============================================================================\n\nfunction getLocator(\n page: Page,\n selectorType: string,\n selectorValue: string,\n optionsJson: string | null\n): PlaywrightLocator {\n // Parse options and extract nth if present\n const options = optionsJson ? JSON.parse(optionsJson) : undefined;\n const nthIndex = options?.nth;\n\n // For role selectors, pass options (excluding nth) to getByRole\n const roleOptions = options ? { ...options } : undefined;\n if (roleOptions) {\n delete roleOptions.nth;\n }\n\n let locator: PlaywrightLocator;\n switch (selectorType) {\n case \"css\":\n locator = page.locator(selectorValue);\n break;\n case \"role\":\n locator = page.getByRole(\n selectorValue as Parameters<Page[\"getByRole\"]>[0],\n roleOptions && Object.keys(roleOptions).length > 0 ? roleOptions : undefined\n );\n break;\n case \"text\":\n locator = page.getByText(selectorValue);\n break;\n case \"label\":\n locator = page.getByLabel(selectorValue);\n break;\n case \"placeholder\":\n locator = page.getByPlaceholder(selectorValue);\n break;\n case \"testId\":\n locator = page.getByTestId(selectorValue);\n break;\n default:\n locator = page.locator(selectorValue);\n }\n\n // Apply nth if specified\n if (nthIndex !== undefined) {\n locator = locator.nth(nthIndex);\n }\n\n return locator;\n}\n\n// ============================================================================\n// Helper: Execute locator action\n// ============================================================================\n\nasync function executeLocatorAction(\n locator: PlaywrightLocator,\n action: string,\n actionArg: unknown,\n timeout: number\n): Promise<unknown> {\n switch (action) {\n case \"click\":\n await locator.click({ timeout });\n return null;\n case \"dblclick\":\n await locator.dblclick({ timeout });\n return null;\n case \"fill\":\n await locator.fill(String(actionArg ?? \"\"), { timeout });\n return null;\n case \"type\":\n await locator.pressSequentially(String(actionArg ?? \"\"), { timeout });\n return null;\n case \"check\":\n await locator.check({ timeout });\n return null;\n case \"uncheck\":\n await locator.uncheck({ timeout });\n return null;\n case \"selectOption\":\n await locator.selectOption(String(actionArg ?? \"\"), { timeout });\n return null;\n case \"clear\":\n await locator.clear({ timeout });\n return null;\n case \"press\":\n await locator.press(String(actionArg ?? \"\"), { timeout });\n return null;\n case \"hover\":\n await locator.hover({ timeout });\n return null;\n case \"focus\":\n await locator.focus({ timeout });\n return null;\n case \"getText\":\n return await locator.textContent({ timeout });\n case \"getValue\":\n return await locator.inputValue({ timeout });\n case \"isVisible\":\n return await locator.isVisible();\n case \"isEnabled\":\n return await locator.isEnabled();\n case \"isChecked\":\n return await locator.isChecked();\n case \"count\":\n return await locator.count();\n default:\n throw new Error(`Unknown action: ${action}`);\n }\n}\n\n// ============================================================================\n// Helper: Execute expect assertion\n// ============================================================================\n\nasync function executeExpectAssertion(\n locator: PlaywrightLocator,\n matcher: string,\n expected: unknown,\n negated: boolean,\n timeout: number\n): Promise<void> {\n switch (matcher) {\n case \"toBeVisible\": {\n const isVisible = await locator.isVisible();\n if (negated) {\n if (isVisible) throw new Error(\"Expected element to not be visible, but it was visible\");\n } else {\n if (!isVisible) throw new Error(\"Expected element to be visible, but it was not\");\n }\n break;\n }\n case \"toContainText\": {\n const text = await locator.textContent({ timeout });\n const matches = text?.includes(String(expected)) ?? false;\n if (negated) {\n if (matches) throw new Error(`Expected text to not contain \"${expected}\", but got \"${text}\"`);\n } else {\n if (!matches) throw new Error(`Expected text to contain \"${expected}\", but got \"${text}\"`);\n }\n break;\n }\n case \"toHaveValue\": {\n const value = await locator.inputValue({ timeout });\n const matches = value === String(expected);\n if (negated) {\n if (matches) throw new Error(`Expected value to not be \"${expected}\", but it was`);\n } else {\n if (!matches) throw new Error(`Expected value to be \"${expected}\", but got \"${value}\"`);\n }\n break;\n }\n case \"toBeEnabled\": {\n const isEnabled = await locator.isEnabled();\n if (negated) {\n if (isEnabled) throw new Error(\"Expected element to be disabled, but it was enabled\");\n } else {\n if (!isEnabled) throw new Error(\"Expected element to be enabled, but it was disabled\");\n }\n break;\n }\n case \"toBeChecked\": {\n const isChecked = await locator.isChecked();\n if (negated) {\n if (isChecked) throw new Error(\"Expected element to not be checked, but it was checked\");\n } else {\n if (!isChecked) throw new Error(\"Expected element to be checked, but it was not\");\n }\n break;\n }\n default:\n throw new Error(`Unknown matcher: ${matcher}`);\n }\n}\n\n// ============================================================================\n// Create Playwright Handler (for remote use)\n// ============================================================================\n\n/**\n * Create a playwright handler from a Page object.\n * This handler is called by the daemon (via callback) when sandbox needs page operations.\n * Used for remote runtime where the browser runs on the client.\n */\nexport function createPlaywrightHandler(\n page: Page,\n options?: { timeout?: number; baseUrl?: string }\n): PlaywrightCallback {\n const timeout = options?.timeout ?? 30000;\n const baseUrl = options?.baseUrl;\n\n return async (op: PlaywrightOperation): Promise<PlaywrightResult> => {\n try {\n switch (op.type) {\n case \"goto\": {\n const [url, waitUntil] = op.args as [string, string?];\n const targetUrl = baseUrl && !url.startsWith(\"http\") ? `${baseUrl}${url}` : url;\n await page.goto(targetUrl, {\n timeout,\n waitUntil: (waitUntil as \"load\" | \"domcontentloaded\" | \"networkidle\") ?? \"load\",\n });\n return { ok: true };\n }\n case \"reload\":\n await page.reload({ timeout });\n return { ok: true };\n case \"url\":\n return { ok: true, value: page.url() };\n case \"title\":\n return { ok: true, value: await page.title() };\n case \"content\":\n return { ok: true, value: await page.content() };\n case \"waitForSelector\": {\n const [selector, optionsJson] = op.args as [string, string?];\n const opts = optionsJson ? JSON.parse(optionsJson) : {};\n await page.waitForSelector(selector, { timeout, ...opts });\n return { ok: true };\n }\n case \"waitForTimeout\": {\n const [ms] = op.args as [number];\n await page.waitForTimeout(ms);\n return { ok: true };\n }\n case \"waitForLoadState\": {\n const [state] = op.args as [string?];\n await page.waitForLoadState(\n (state as \"load\" | \"domcontentloaded\" | \"networkidle\") ?? \"load\",\n { timeout }\n );\n return { ok: true };\n }\n case \"evaluate\": {\n const [script] = op.args as [string];\n const result = await page.evaluate(script);\n return { ok: true, value: result };\n }\n case \"locatorAction\": {\n const [selectorType, selectorValue, roleOptions, action, actionArg] = op.args as [\n string,\n string,\n string | null,\n string,\n unknown\n ];\n const locator = getLocator(page, selectorType, selectorValue, roleOptions);\n const result = await executeLocatorAction(locator, action, actionArg, timeout);\n return { ok: true, value: result };\n }\n case \"expectLocator\": {\n const [selectorType, selectorValue, roleOptions, matcher, expected, negated, customTimeout] = op.args as [\n string,\n string,\n string | null,\n string,\n unknown,\n boolean,\n number?\n ];\n const locator = getLocator(page, selectorType, selectorValue, roleOptions);\n const effectiveTimeout = customTimeout ?? timeout;\n await executeExpectAssertion(locator, matcher, expected, negated ?? false, effectiveTimeout);\n return { ok: true };\n }\n case \"request\": {\n const [url, method, data, headers] = op.args as [\n string,\n string,\n unknown,\n Record<string, string>?\n ];\n const targetUrl = baseUrl && !url.startsWith(\"http\") ? `${baseUrl}${url}` : url;\n const requestOptions: {\n method?: string;\n data?: unknown;\n headers?: Record<string, string>;\n timeout?: number;\n } = {\n timeout,\n };\n if (headers) {\n requestOptions.headers = headers;\n }\n if (data !== undefined && data !== null) {\n requestOptions.data = data;\n }\n\n const response = await page.request.fetch(targetUrl, {\n method: method as \"GET\" | \"POST\" | \"PUT\" | \"DELETE\" | \"PATCH\" | \"HEAD\" | \"OPTIONS\",\n ...requestOptions,\n });\n\n // Get response data - try to parse as JSON, fall back to text\n const text = await response.text();\n let json: unknown = null;\n try {\n json = JSON.parse(text);\n } catch {\n // Not valid JSON, that's ok\n }\n\n return {\n ok: true,\n value: {\n status: response.status(),\n ok: response.ok(),\n headers: response.headers(),\n text,\n json,\n body: null, // ArrayBuffer not easily serializable, use text/json instead\n },\n };\n }\n default:\n return { ok: false, error: { name: \"Error\", message: `Unknown operation: ${(op as PlaywrightOperation).type}` } };\n }\n } catch (err) {\n const error = err as Error;\n return { ok: false, error: { name: error.name, message: error.message } };\n }\n };\n}\n"
6
+ ],
7
+ "mappings": "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",
8
+ "debugId": "32EDBABEF8B46B5164756E2164756E21",
9
+ "names": []
10
+ }
@@ -1,5 +1,5 @@
1
1
  {
2
2
  "name": "@ricsam/isolate-playwright",
3
- "version": "0.1.4",
3
+ "version": "0.1.5",
4
4
  "type": "commonjs"
5
5
  }
@@ -0,0 +1,26 @@
1
+ // @bun @bun-cjs
2
+ (function(exports, require, module, __filename, __dirname) {var __defProp = Object.defineProperty;
3
+ var __getOwnPropNames = Object.getOwnPropertyNames;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __moduleCache = /* @__PURE__ */ new WeakMap;
7
+ var __toCommonJS = (from) => {
8
+ var entry = __moduleCache.get(from), desc;
9
+ if (entry)
10
+ return entry;
11
+ entry = __defProp({}, "__esModule", { value: true });
12
+ if (from && typeof from === "object" || typeof from === "function")
13
+ __getOwnPropNames(from).map((key) => !__hasOwnProp.call(entry, key) && __defProp(entry, key, {
14
+ get: () => from[key],
15
+ enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
16
+ }));
17
+ __moduleCache.set(from, entry);
18
+ return entry;
19
+ };
20
+
21
+ // packages/playwright/src/types.ts
22
+ var exports_types = {};
23
+ module.exports = __toCommonJS(exports_types);
24
+ })
25
+
26
+ //# debugId=356710393F1117F164756E2164756E21
@@ -0,0 +1,9 @@
1
+ {
2
+ "version": 3,
3
+ "sources": [],
4
+ "sourcesContent": [
5
+ ],
6
+ "mappings": "",
7
+ "debugId": "356710393F1117F164756E2164756E21",
8
+ "names": []
9
+ }
@@ -0,0 +1,256 @@
1
+ // @bun
2
+ // packages/playwright/src/client.ts
3
+ function getLocator(page, selectorType, selectorValue, optionsJson) {
4
+ const options = optionsJson ? JSON.parse(optionsJson) : undefined;
5
+ const nthIndex = options?.nth;
6
+ const roleOptions = options ? { ...options } : undefined;
7
+ if (roleOptions) {
8
+ delete roleOptions.nth;
9
+ }
10
+ let locator;
11
+ switch (selectorType) {
12
+ case "css":
13
+ locator = page.locator(selectorValue);
14
+ break;
15
+ case "role":
16
+ locator = page.getByRole(selectorValue, roleOptions && Object.keys(roleOptions).length > 0 ? roleOptions : undefined);
17
+ break;
18
+ case "text":
19
+ locator = page.getByText(selectorValue);
20
+ break;
21
+ case "label":
22
+ locator = page.getByLabel(selectorValue);
23
+ break;
24
+ case "placeholder":
25
+ locator = page.getByPlaceholder(selectorValue);
26
+ break;
27
+ case "testId":
28
+ locator = page.getByTestId(selectorValue);
29
+ break;
30
+ default:
31
+ locator = page.locator(selectorValue);
32
+ }
33
+ if (nthIndex !== undefined) {
34
+ locator = locator.nth(nthIndex);
35
+ }
36
+ return locator;
37
+ }
38
+ async function executeLocatorAction(locator, action, actionArg, timeout) {
39
+ switch (action) {
40
+ case "click":
41
+ await locator.click({ timeout });
42
+ return null;
43
+ case "dblclick":
44
+ await locator.dblclick({ timeout });
45
+ return null;
46
+ case "fill":
47
+ await locator.fill(String(actionArg ?? ""), { timeout });
48
+ return null;
49
+ case "type":
50
+ await locator.pressSequentially(String(actionArg ?? ""), { timeout });
51
+ return null;
52
+ case "check":
53
+ await locator.check({ timeout });
54
+ return null;
55
+ case "uncheck":
56
+ await locator.uncheck({ timeout });
57
+ return null;
58
+ case "selectOption":
59
+ await locator.selectOption(String(actionArg ?? ""), { timeout });
60
+ return null;
61
+ case "clear":
62
+ await locator.clear({ timeout });
63
+ return null;
64
+ case "press":
65
+ await locator.press(String(actionArg ?? ""), { timeout });
66
+ return null;
67
+ case "hover":
68
+ await locator.hover({ timeout });
69
+ return null;
70
+ case "focus":
71
+ await locator.focus({ timeout });
72
+ return null;
73
+ case "getText":
74
+ return await locator.textContent({ timeout });
75
+ case "getValue":
76
+ return await locator.inputValue({ timeout });
77
+ case "isVisible":
78
+ return await locator.isVisible();
79
+ case "isEnabled":
80
+ return await locator.isEnabled();
81
+ case "isChecked":
82
+ return await locator.isChecked();
83
+ case "count":
84
+ return await locator.count();
85
+ default:
86
+ throw new Error(`Unknown action: ${action}`);
87
+ }
88
+ }
89
+ async function executeExpectAssertion(locator, matcher, expected, negated, timeout) {
90
+ switch (matcher) {
91
+ case "toBeVisible": {
92
+ const isVisible = await locator.isVisible();
93
+ if (negated) {
94
+ if (isVisible)
95
+ throw new Error("Expected element to not be visible, but it was visible");
96
+ } else {
97
+ if (!isVisible)
98
+ throw new Error("Expected element to be visible, but it was not");
99
+ }
100
+ break;
101
+ }
102
+ case "toContainText": {
103
+ const text = await locator.textContent({ timeout });
104
+ const matches = text?.includes(String(expected)) ?? false;
105
+ if (negated) {
106
+ if (matches)
107
+ throw new Error(`Expected text to not contain "${expected}", but got "${text}"`);
108
+ } else {
109
+ if (!matches)
110
+ throw new Error(`Expected text to contain "${expected}", but got "${text}"`);
111
+ }
112
+ break;
113
+ }
114
+ case "toHaveValue": {
115
+ const value = await locator.inputValue({ timeout });
116
+ const matches = value === String(expected);
117
+ if (negated) {
118
+ if (matches)
119
+ throw new Error(`Expected value to not be "${expected}", but it was`);
120
+ } else {
121
+ if (!matches)
122
+ throw new Error(`Expected value to be "${expected}", but got "${value}"`);
123
+ }
124
+ break;
125
+ }
126
+ case "toBeEnabled": {
127
+ const isEnabled = await locator.isEnabled();
128
+ if (negated) {
129
+ if (isEnabled)
130
+ throw new Error("Expected element to be disabled, but it was enabled");
131
+ } else {
132
+ if (!isEnabled)
133
+ throw new Error("Expected element to be enabled, but it was disabled");
134
+ }
135
+ break;
136
+ }
137
+ case "toBeChecked": {
138
+ const isChecked = await locator.isChecked();
139
+ if (negated) {
140
+ if (isChecked)
141
+ throw new Error("Expected element to not be checked, but it was checked");
142
+ } else {
143
+ if (!isChecked)
144
+ throw new Error("Expected element to be checked, but it was not");
145
+ }
146
+ break;
147
+ }
148
+ default:
149
+ throw new Error(`Unknown matcher: ${matcher}`);
150
+ }
151
+ }
152
+ function createPlaywrightHandler(page, options) {
153
+ const timeout = options?.timeout ?? 30000;
154
+ const baseUrl = options?.baseUrl;
155
+ return async (op) => {
156
+ try {
157
+ switch (op.type) {
158
+ case "goto": {
159
+ const [url, waitUntil] = op.args;
160
+ const targetUrl = baseUrl && !url.startsWith("http") ? `${baseUrl}${url}` : url;
161
+ await page.goto(targetUrl, {
162
+ timeout,
163
+ waitUntil: waitUntil ?? "load"
164
+ });
165
+ return { ok: true };
166
+ }
167
+ case "reload":
168
+ await page.reload({ timeout });
169
+ return { ok: true };
170
+ case "url":
171
+ return { ok: true, value: page.url() };
172
+ case "title":
173
+ return { ok: true, value: await page.title() };
174
+ case "content":
175
+ return { ok: true, value: await page.content() };
176
+ case "waitForSelector": {
177
+ const [selector, optionsJson] = op.args;
178
+ const opts = optionsJson ? JSON.parse(optionsJson) : {};
179
+ await page.waitForSelector(selector, { timeout, ...opts });
180
+ return { ok: true };
181
+ }
182
+ case "waitForTimeout": {
183
+ const [ms] = op.args;
184
+ await page.waitForTimeout(ms);
185
+ return { ok: true };
186
+ }
187
+ case "waitForLoadState": {
188
+ const [state] = op.args;
189
+ await page.waitForLoadState(state ?? "load", { timeout });
190
+ return { ok: true };
191
+ }
192
+ case "evaluate": {
193
+ const [script] = op.args;
194
+ const result = await page.evaluate(script);
195
+ return { ok: true, value: result };
196
+ }
197
+ case "locatorAction": {
198
+ const [selectorType, selectorValue, roleOptions, action, actionArg] = op.args;
199
+ const locator = getLocator(page, selectorType, selectorValue, roleOptions);
200
+ const result = await executeLocatorAction(locator, action, actionArg, timeout);
201
+ return { ok: true, value: result };
202
+ }
203
+ case "expectLocator": {
204
+ const [selectorType, selectorValue, roleOptions, matcher, expected, negated, customTimeout] = op.args;
205
+ const locator = getLocator(page, selectorType, selectorValue, roleOptions);
206
+ const effectiveTimeout = customTimeout ?? timeout;
207
+ await executeExpectAssertion(locator, matcher, expected, negated ?? false, effectiveTimeout);
208
+ return { ok: true };
209
+ }
210
+ case "request": {
211
+ const [url, method, data, headers] = op.args;
212
+ const targetUrl = baseUrl && !url.startsWith("http") ? `${baseUrl}${url}` : url;
213
+ const requestOptions = {
214
+ timeout
215
+ };
216
+ if (headers) {
217
+ requestOptions.headers = headers;
218
+ }
219
+ if (data !== undefined && data !== null) {
220
+ requestOptions.data = data;
221
+ }
222
+ const response = await page.request.fetch(targetUrl, {
223
+ method,
224
+ ...requestOptions
225
+ });
226
+ const text = await response.text();
227
+ let json = null;
228
+ try {
229
+ json = JSON.parse(text);
230
+ } catch {}
231
+ return {
232
+ ok: true,
233
+ value: {
234
+ status: response.status(),
235
+ ok: response.ok(),
236
+ headers: response.headers(),
237
+ text,
238
+ json,
239
+ body: null
240
+ }
241
+ };
242
+ }
243
+ default:
244
+ return { ok: false, error: { name: "Error", message: `Unknown operation: ${op.type}` } };
245
+ }
246
+ } catch (err) {
247
+ const error = err;
248
+ return { ok: false, error: { name: error.name, message: error.message } };
249
+ }
250
+ };
251
+ }
252
+ export {
253
+ createPlaywrightHandler
254
+ };
255
+
256
+ //# debugId=B132F04935BB96B564756E2164756E21
@@ -0,0 +1,10 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/client.ts"],
4
+ "sourcesContent": [
5
+ "/**\n * Client-safe exports for @ricsam/isolate-playwright\n * This module can be imported without loading isolated-vm\n */\n\nimport type { Page, Locator as PlaywrightLocator } from \"playwright\";\nimport type {\n PlaywrightOperation,\n PlaywrightResult,\n} from \"@ricsam/isolate-protocol\";\n\n// Re-export types\nexport type {\n NetworkRequestInfo,\n NetworkResponseInfo,\n BrowserConsoleLogEntry,\n PlaywrightSetupOptions,\n PlaywrightOptions,\n PlaywrightHandle,\n} from \"./types.mjs\";\n\n// Import PlaywrightCallback for use in function return type\nimport type { PlaywrightCallback } from \"./types.mjs\";\nexport type { PlaywrightCallback };\n\nexport type { PlaywrightOperation, PlaywrightResult, PlaywrightEvent } from \"@ricsam/isolate-protocol\";\n\n// ============================================================================\n// Helper: Get locator from selector info\n// ============================================================================\n\nfunction getLocator(\n page: Page,\n selectorType: string,\n selectorValue: string,\n optionsJson: string | null\n): PlaywrightLocator {\n // Parse options and extract nth if present\n const options = optionsJson ? JSON.parse(optionsJson) : undefined;\n const nthIndex = options?.nth;\n\n // For role selectors, pass options (excluding nth) to getByRole\n const roleOptions = options ? { ...options } : undefined;\n if (roleOptions) {\n delete roleOptions.nth;\n }\n\n let locator: PlaywrightLocator;\n switch (selectorType) {\n case \"css\":\n locator = page.locator(selectorValue);\n break;\n case \"role\":\n locator = page.getByRole(\n selectorValue as Parameters<Page[\"getByRole\"]>[0],\n roleOptions && Object.keys(roleOptions).length > 0 ? roleOptions : undefined\n );\n break;\n case \"text\":\n locator = page.getByText(selectorValue);\n break;\n case \"label\":\n locator = page.getByLabel(selectorValue);\n break;\n case \"placeholder\":\n locator = page.getByPlaceholder(selectorValue);\n break;\n case \"testId\":\n locator = page.getByTestId(selectorValue);\n break;\n default:\n locator = page.locator(selectorValue);\n }\n\n // Apply nth if specified\n if (nthIndex !== undefined) {\n locator = locator.nth(nthIndex);\n }\n\n return locator;\n}\n\n// ============================================================================\n// Helper: Execute locator action\n// ============================================================================\n\nasync function executeLocatorAction(\n locator: PlaywrightLocator,\n action: string,\n actionArg: unknown,\n timeout: number\n): Promise<unknown> {\n switch (action) {\n case \"click\":\n await locator.click({ timeout });\n return null;\n case \"dblclick\":\n await locator.dblclick({ timeout });\n return null;\n case \"fill\":\n await locator.fill(String(actionArg ?? \"\"), { timeout });\n return null;\n case \"type\":\n await locator.pressSequentially(String(actionArg ?? \"\"), { timeout });\n return null;\n case \"check\":\n await locator.check({ timeout });\n return null;\n case \"uncheck\":\n await locator.uncheck({ timeout });\n return null;\n case \"selectOption\":\n await locator.selectOption(String(actionArg ?? \"\"), { timeout });\n return null;\n case \"clear\":\n await locator.clear({ timeout });\n return null;\n case \"press\":\n await locator.press(String(actionArg ?? \"\"), { timeout });\n return null;\n case \"hover\":\n await locator.hover({ timeout });\n return null;\n case \"focus\":\n await locator.focus({ timeout });\n return null;\n case \"getText\":\n return await locator.textContent({ timeout });\n case \"getValue\":\n return await locator.inputValue({ timeout });\n case \"isVisible\":\n return await locator.isVisible();\n case \"isEnabled\":\n return await locator.isEnabled();\n case \"isChecked\":\n return await locator.isChecked();\n case \"count\":\n return await locator.count();\n default:\n throw new Error(`Unknown action: ${action}`);\n }\n}\n\n// ============================================================================\n// Helper: Execute expect assertion\n// ============================================================================\n\nasync function executeExpectAssertion(\n locator: PlaywrightLocator,\n matcher: string,\n expected: unknown,\n negated: boolean,\n timeout: number\n): Promise<void> {\n switch (matcher) {\n case \"toBeVisible\": {\n const isVisible = await locator.isVisible();\n if (negated) {\n if (isVisible) throw new Error(\"Expected element to not be visible, but it was visible\");\n } else {\n if (!isVisible) throw new Error(\"Expected element to be visible, but it was not\");\n }\n break;\n }\n case \"toContainText\": {\n const text = await locator.textContent({ timeout });\n const matches = text?.includes(String(expected)) ?? false;\n if (negated) {\n if (matches) throw new Error(`Expected text to not contain \"${expected}\", but got \"${text}\"`);\n } else {\n if (!matches) throw new Error(`Expected text to contain \"${expected}\", but got \"${text}\"`);\n }\n break;\n }\n case \"toHaveValue\": {\n const value = await locator.inputValue({ timeout });\n const matches = value === String(expected);\n if (negated) {\n if (matches) throw new Error(`Expected value to not be \"${expected}\", but it was`);\n } else {\n if (!matches) throw new Error(`Expected value to be \"${expected}\", but got \"${value}\"`);\n }\n break;\n }\n case \"toBeEnabled\": {\n const isEnabled = await locator.isEnabled();\n if (negated) {\n if (isEnabled) throw new Error(\"Expected element to be disabled, but it was enabled\");\n } else {\n if (!isEnabled) throw new Error(\"Expected element to be enabled, but it was disabled\");\n }\n break;\n }\n case \"toBeChecked\": {\n const isChecked = await locator.isChecked();\n if (negated) {\n if (isChecked) throw new Error(\"Expected element to not be checked, but it was checked\");\n } else {\n if (!isChecked) throw new Error(\"Expected element to be checked, but it was not\");\n }\n break;\n }\n default:\n throw new Error(`Unknown matcher: ${matcher}`);\n }\n}\n\n// ============================================================================\n// Create Playwright Handler (for remote use)\n// ============================================================================\n\n/**\n * Create a playwright handler from a Page object.\n * This handler is called by the daemon (via callback) when sandbox needs page operations.\n * Used for remote runtime where the browser runs on the client.\n */\nexport function createPlaywrightHandler(\n page: Page,\n options?: { timeout?: number; baseUrl?: string }\n): PlaywrightCallback {\n const timeout = options?.timeout ?? 30000;\n const baseUrl = options?.baseUrl;\n\n return async (op: PlaywrightOperation): Promise<PlaywrightResult> => {\n try {\n switch (op.type) {\n case \"goto\": {\n const [url, waitUntil] = op.args as [string, string?];\n const targetUrl = baseUrl && !url.startsWith(\"http\") ? `${baseUrl}${url}` : url;\n await page.goto(targetUrl, {\n timeout,\n waitUntil: (waitUntil as \"load\" | \"domcontentloaded\" | \"networkidle\") ?? \"load\",\n });\n return { ok: true };\n }\n case \"reload\":\n await page.reload({ timeout });\n return { ok: true };\n case \"url\":\n return { ok: true, value: page.url() };\n case \"title\":\n return { ok: true, value: await page.title() };\n case \"content\":\n return { ok: true, value: await page.content() };\n case \"waitForSelector\": {\n const [selector, optionsJson] = op.args as [string, string?];\n const opts = optionsJson ? JSON.parse(optionsJson) : {};\n await page.waitForSelector(selector, { timeout, ...opts });\n return { ok: true };\n }\n case \"waitForTimeout\": {\n const [ms] = op.args as [number];\n await page.waitForTimeout(ms);\n return { ok: true };\n }\n case \"waitForLoadState\": {\n const [state] = op.args as [string?];\n await page.waitForLoadState(\n (state as \"load\" | \"domcontentloaded\" | \"networkidle\") ?? \"load\",\n { timeout }\n );\n return { ok: true };\n }\n case \"evaluate\": {\n const [script] = op.args as [string];\n const result = await page.evaluate(script);\n return { ok: true, value: result };\n }\n case \"locatorAction\": {\n const [selectorType, selectorValue, roleOptions, action, actionArg] = op.args as [\n string,\n string,\n string | null,\n string,\n unknown\n ];\n const locator = getLocator(page, selectorType, selectorValue, roleOptions);\n const result = await executeLocatorAction(locator, action, actionArg, timeout);\n return { ok: true, value: result };\n }\n case \"expectLocator\": {\n const [selectorType, selectorValue, roleOptions, matcher, expected, negated, customTimeout] = op.args as [\n string,\n string,\n string | null,\n string,\n unknown,\n boolean,\n number?\n ];\n const locator = getLocator(page, selectorType, selectorValue, roleOptions);\n const effectiveTimeout = customTimeout ?? timeout;\n await executeExpectAssertion(locator, matcher, expected, negated ?? false, effectiveTimeout);\n return { ok: true };\n }\n case \"request\": {\n const [url, method, data, headers] = op.args as [\n string,\n string,\n unknown,\n Record<string, string>?\n ];\n const targetUrl = baseUrl && !url.startsWith(\"http\") ? `${baseUrl}${url}` : url;\n const requestOptions: {\n method?: string;\n data?: unknown;\n headers?: Record<string, string>;\n timeout?: number;\n } = {\n timeout,\n };\n if (headers) {\n requestOptions.headers = headers;\n }\n if (data !== undefined && data !== null) {\n requestOptions.data = data;\n }\n\n const response = await page.request.fetch(targetUrl, {\n method: method as \"GET\" | \"POST\" | \"PUT\" | \"DELETE\" | \"PATCH\" | \"HEAD\" | \"OPTIONS\",\n ...requestOptions,\n });\n\n // Get response data - try to parse as JSON, fall back to text\n const text = await response.text();\n let json: unknown = null;\n try {\n json = JSON.parse(text);\n } catch {\n // Not valid JSON, that's ok\n }\n\n return {\n ok: true,\n value: {\n status: response.status(),\n ok: response.ok(),\n headers: response.headers(),\n text,\n json,\n body: null, // ArrayBuffer not easily serializable, use text/json instead\n },\n };\n }\n default:\n return { ok: false, error: { name: \"Error\", message: `Unknown operation: ${(op as PlaywrightOperation).type}` } };\n }\n } catch (err) {\n const error = err as Error;\n return { ok: false, error: { name: error.name, message: error.message } };\n }\n };\n}\n"
6
+ ],
7
+ "mappings": "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",
8
+ "debugId": "B132F04935BB96B564756E2164756E21",
9
+ "names": []
10
+ }
@@ -1,5 +1,5 @@
1
1
  {
2
2
  "name": "@ricsam/isolate-playwright",
3
- "version": "0.1.4",
3
+ "version": "0.1.5",
4
4
  "type": "module"
5
5
  }
@@ -0,0 +1,3 @@
1
+ // @bun
2
+
3
+ //# debugId=690F7352A78213DC64756E2164756E21
@@ -0,0 +1,9 @@
1
+ {
2
+ "version": 3,
3
+ "sources": [],
4
+ "sourcesContent": [
5
+ ],
6
+ "mappings": "",
7
+ "debugId": "690F7352A78213DC64756E2164756E21",
8
+ "names": []
9
+ }
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Client-safe exports for @ricsam/isolate-playwright
3
+ * This module can be imported without loading isolated-vm
4
+ */
5
+ import type { Page } from "playwright";
6
+ export type { NetworkRequestInfo, NetworkResponseInfo, BrowserConsoleLogEntry, PlaywrightSetupOptions, PlaywrightOptions, PlaywrightHandle, } from "./types.ts";
7
+ import type { PlaywrightCallback } from "./types.ts";
8
+ export type { PlaywrightCallback };
9
+ export type { PlaywrightOperation, PlaywrightResult, PlaywrightEvent } from "@ricsam/isolate-protocol";
10
+ /**
11
+ * Create a playwright handler from a Page object.
12
+ * This handler is called by the daemon (via callback) when sandbox needs page operations.
13
+ * Used for remote runtime where the browser runs on the client.
14
+ */
15
+ export declare function createPlaywrightHandler(page: Page, options?: {
16
+ timeout?: number;
17
+ baseUrl?: string;
18
+ }): PlaywrightCallback;
@@ -0,0 +1,68 @@
1
+ /**
2
+ * Client-safe types for @ricsam/isolate-playwright
3
+ * This module can be imported without loading isolated-vm
4
+ */
5
+ export type { PlaywrightOperation, PlaywrightResult, PlaywrightEvent, } from "@ricsam/isolate-protocol";
6
+ export interface NetworkRequestInfo {
7
+ url: string;
8
+ method: string;
9
+ headers: Record<string, string>;
10
+ postData?: string;
11
+ resourceType: string;
12
+ timestamp: number;
13
+ }
14
+ export interface NetworkResponseInfo {
15
+ url: string;
16
+ status: number;
17
+ statusText: string;
18
+ headers: Record<string, string>;
19
+ timestamp: number;
20
+ }
21
+ /**
22
+ * Browser console log entry - logs from the page context (not sandbox).
23
+ */
24
+ export interface BrowserConsoleLogEntry {
25
+ level: string;
26
+ args: string[];
27
+ timestamp: number;
28
+ }
29
+ /**
30
+ * Callback type for handling playwright operations.
31
+ * Used for remote execution where the page lives on the client.
32
+ */
33
+ export type PlaywrightCallback = (op: import("@ricsam/isolate-protocol").PlaywrightOperation) => Promise<import("@ricsam/isolate-protocol").PlaywrightResult>;
34
+ /**
35
+ * Options for setting up playwright in an isolate.
36
+ */
37
+ export interface PlaywrightSetupOptions {
38
+ /** Direct page object (for local use) */
39
+ page?: import("playwright").Page;
40
+ /** Handler callback (for remote use - daemon invokes this) */
41
+ handler?: PlaywrightCallback;
42
+ /** Default timeout for operations */
43
+ timeout?: number;
44
+ /** Base URL for relative navigation */
45
+ baseUrl?: string;
46
+ /** If true, browser console logs are printed to stdout */
47
+ console?: boolean;
48
+ /** Unified event callback for all playwright events */
49
+ onEvent?: (event: import("@ricsam/isolate-protocol").PlaywrightEvent) => void;
50
+ }
51
+ /**
52
+ * @deprecated Use PlaywrightSetupOptions instead
53
+ */
54
+ export interface PlaywrightOptions {
55
+ page: import("playwright").Page;
56
+ timeout?: number;
57
+ baseUrl?: string;
58
+ onNetworkRequest?: (info: NetworkRequestInfo) => void;
59
+ onNetworkResponse?: (info: NetworkResponseInfo) => void;
60
+ }
61
+ export interface PlaywrightHandle {
62
+ dispose(): void;
63
+ /** Get browser console logs (from the page, not sandbox) */
64
+ getBrowserConsoleLogs(): BrowserConsoleLogEntry[];
65
+ getNetworkRequests(): NetworkRequestInfo[];
66
+ getNetworkResponses(): NetworkResponseInfo[];
67
+ clearCollected(): void;
68
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ricsam/isolate-playwright",
3
- "version": "0.1.4",
3
+ "version": "0.1.5",
4
4
  "main": "./dist/cjs/index.cjs",
5
5
  "types": "./dist/types/index.d.ts",
6
6
  "exports": {
@@ -8,6 +8,16 @@
8
8
  "types": "./dist/types/index.d.ts",
9
9
  "require": "./dist/cjs/index.cjs",
10
10
  "import": "./dist/mjs/index.mjs"
11
+ },
12
+ "./types": {
13
+ "types": "./dist/types/types.d.ts",
14
+ "require": "./dist/cjs/types.cjs",
15
+ "import": "./dist/mjs/types.mjs"
16
+ },
17
+ "./client": {
18
+ "types": "./dist/types/client.d.ts",
19
+ "require": "./dist/cjs/client.cjs",
20
+ "import": "./dist/mjs/client.mjs"
11
21
  }
12
22
  },
13
23
  "scripts": {