@brightdata/cli 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.
Files changed (76) hide show
  1. package/README.md +354 -0
  2. package/dist/__tests__/browser/connection.test.d.ts +2 -0
  3. package/dist/__tests__/browser/connection.test.d.ts.map +1 -0
  4. package/dist/__tests__/browser/connection.test.js +168 -0
  5. package/dist/__tests__/browser/connection.test.js.map +1 -0
  6. package/dist/__tests__/browser/daemon.test.d.ts +2 -0
  7. package/dist/__tests__/browser/daemon.test.d.ts.map +1 -0
  8. package/dist/__tests__/browser/daemon.test.js +586 -0
  9. package/dist/__tests__/browser/daemon.test.js.map +1 -0
  10. package/dist/__tests__/browser/entrypoint.test.d.ts +2 -0
  11. package/dist/__tests__/browser/entrypoint.test.d.ts.map +1 -0
  12. package/dist/__tests__/browser/entrypoint.test.js +53 -0
  13. package/dist/__tests__/browser/entrypoint.test.js.map +1 -0
  14. package/dist/__tests__/browser/ipc.test.d.ts +2 -0
  15. package/dist/__tests__/browser/ipc.test.d.ts.map +1 -0
  16. package/dist/__tests__/browser/ipc.test.js +199 -0
  17. package/dist/__tests__/browser/ipc.test.js.map +1 -0
  18. package/dist/__tests__/browser/lifecycle.test.d.ts +2 -0
  19. package/dist/__tests__/browser/lifecycle.test.d.ts.map +1 -0
  20. package/dist/__tests__/browser/lifecycle.test.js +176 -0
  21. package/dist/__tests__/browser/lifecycle.test.js.map +1 -0
  22. package/dist/__tests__/browser/snapshot.test.d.ts +2 -0
  23. package/dist/__tests__/browser/snapshot.test.d.ts.map +1 -0
  24. package/dist/__tests__/browser/snapshot.test.js +202 -0
  25. package/dist/__tests__/browser/snapshot.test.js.map +1 -0
  26. package/dist/__tests__/commands/browser.test.d.ts +2 -0
  27. package/dist/__tests__/commands/browser.test.d.ts.map +1 -0
  28. package/dist/__tests__/commands/browser.test.js +431 -0
  29. package/dist/__tests__/commands/browser.test.js.map +1 -0
  30. package/dist/__tests__/utils/browser-credentials.test.d.ts +2 -0
  31. package/dist/__tests__/utils/browser-credentials.test.d.ts.map +1 -0
  32. package/dist/__tests__/utils/browser-credentials.test.js +81 -0
  33. package/dist/__tests__/utils/browser-credentials.test.js.map +1 -0
  34. package/dist/browser/connection.d.ts +24 -0
  35. package/dist/browser/connection.d.ts.map +1 -0
  36. package/dist/browser/connection.js +55 -0
  37. package/dist/browser/connection.js.map +1 -0
  38. package/dist/browser/daemon.d.ts +130 -0
  39. package/dist/browser/daemon.d.ts.map +1 -0
  40. package/dist/browser/daemon.js +645 -0
  41. package/dist/browser/daemon.js.map +1 -0
  42. package/dist/browser/entrypoint.d.ts +20 -0
  43. package/dist/browser/entrypoint.d.ts.map +1 -0
  44. package/dist/browser/entrypoint.js +46 -0
  45. package/dist/browser/entrypoint.js.map +1 -0
  46. package/dist/browser/interaction.d.ts +32 -0
  47. package/dist/browser/interaction.d.ts.map +1 -0
  48. package/dist/browser/interaction.js +215 -0
  49. package/dist/browser/interaction.js.map +1 -0
  50. package/dist/browser/ipc.d.ts +52 -0
  51. package/dist/browser/ipc.d.ts.map +1 -0
  52. package/dist/browser/ipc.js +254 -0
  53. package/dist/browser/ipc.js.map +1 -0
  54. package/dist/browser/lifecycle.d.ts +31 -0
  55. package/dist/browser/lifecycle.d.ts.map +1 -0
  56. package/dist/browser/lifecycle.js +202 -0
  57. package/dist/browser/lifecycle.js.map +1 -0
  58. package/dist/browser/screenshot.d.ts +19 -0
  59. package/dist/browser/screenshot.d.ts.map +1 -0
  60. package/dist/browser/screenshot.js +44 -0
  61. package/dist/browser/screenshot.js.map +1 -0
  62. package/dist/browser/snapshot.d.ts +48 -0
  63. package/dist/browser/snapshot.d.ts.map +1 -0
  64. package/dist/browser/snapshot.js +490 -0
  65. package/dist/browser/snapshot.js.map +1 -0
  66. package/dist/commands/browser.d.ts +62 -0
  67. package/dist/commands/browser.d.ts.map +1 -0
  68. package/dist/commands/browser.js +615 -0
  69. package/dist/commands/browser.js.map +1 -0
  70. package/dist/index.js +39 -25
  71. package/dist/index.js.map +1 -1
  72. package/dist/utils/browser-credentials.d.ts +5 -0
  73. package/dist/utils/browser-credentials.d.ts.map +1 -0
  74. package/dist/utils/browser-credentials.js +53 -0
  75. package/dist/utils/browser-credentials.js.map +1 -0
  76. package/package.json +2 -1
@@ -0,0 +1,431 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const vitest_1 = require("vitest");
4
+ const mocks = vitest_1.vi.hoisted(() => ({
5
+ DEFAULT_IPC_TIMEOUT_MS: 30_000,
6
+ DEFAULT_SESSION_NAME: 'default',
7
+ ensure_authenticated: vitest_1.vi.fn(),
8
+ ensure_browser_zone: vitest_1.vi.fn(),
9
+ ensure_daemon: vitest_1.vi.fn(),
10
+ existsSync: vitest_1.vi.fn(),
11
+ fail: vitest_1.vi.fn((msg) => { throw new Error(`fail:${msg}`); }),
12
+ get_cdp_endpoint: vitest_1.vi.fn(),
13
+ get_daemon_base_dir: vitest_1.vi.fn(),
14
+ info: vitest_1.vi.fn(),
15
+ is_daemon_alive: vitest_1.vi.fn(),
16
+ normalize_session_name: vitest_1.vi.fn(),
17
+ print: vitest_1.vi.fn(),
18
+ readdirSync: vitest_1.vi.fn(),
19
+ send_command: vitest_1.vi.fn(),
20
+ start: vitest_1.vi.fn(),
21
+ stop: vitest_1.vi.fn(),
22
+ success: vitest_1.vi.fn(),
23
+ }));
24
+ vitest_1.vi.mock('fs', () => ({
25
+ default: {
26
+ existsSync: mocks.existsSync,
27
+ readdirSync: mocks.readdirSync,
28
+ },
29
+ }));
30
+ vitest_1.vi.mock('../../browser/daemon', () => ({
31
+ DEFAULT_DAEMON_IDLE_TIMEOUT_MS: 600_000,
32
+ }));
33
+ vitest_1.vi.mock('../../browser/ipc', () => ({
34
+ DEFAULT_IPC_TIMEOUT_MS: mocks.DEFAULT_IPC_TIMEOUT_MS,
35
+ DEFAULT_SESSION_NAME: mocks.DEFAULT_SESSION_NAME,
36
+ get_daemon_base_dir: mocks.get_daemon_base_dir,
37
+ normalize_session_name: mocks.normalize_session_name,
38
+ }));
39
+ vitest_1.vi.mock('../../browser/lifecycle', () => ({
40
+ ensure_daemon: mocks.ensure_daemon,
41
+ is_daemon_alive: mocks.is_daemon_alive,
42
+ send_command: mocks.send_command,
43
+ }));
44
+ vitest_1.vi.mock('../../utils/auth', () => ({
45
+ ensure_authenticated: mocks.ensure_authenticated,
46
+ }));
47
+ vitest_1.vi.mock('../../utils/browser-credentials', () => ({
48
+ DEFAULT_BROWSER_ZONE: 'cli_browser',
49
+ ensure_browser_zone: mocks.ensure_browser_zone,
50
+ get_cdp_endpoint: mocks.get_cdp_endpoint,
51
+ }));
52
+ vitest_1.vi.mock('../../utils/output', () => ({
53
+ fail: mocks.fail,
54
+ info: mocks.info,
55
+ print: mocks.print,
56
+ success: mocks.success,
57
+ }));
58
+ vitest_1.vi.mock('../../utils/spinner', () => ({
59
+ start: mocks.start,
60
+ }));
61
+ const browser_1 = require("../../commands/browser");
62
+ (0, vitest_1.describe)('commands/browser', () => {
63
+ (0, vitest_1.beforeEach)(() => {
64
+ vitest_1.vi.clearAllMocks();
65
+ mocks.ensure_authenticated.mockReturnValue('api_key');
66
+ mocks.get_cdp_endpoint.mockResolvedValue('wss://browser.example');
67
+ mocks.get_daemon_base_dir.mockReturnValue('/tmp/brightdata-cli');
68
+ mocks.is_daemon_alive.mockResolvedValue(true);
69
+ mocks.normalize_session_name.mockImplementation((name) => (name ?? mocks.DEFAULT_SESSION_NAME).trim());
70
+ mocks.send_command.mockResolvedValue({ success: true, data: {} });
71
+ mocks.start.mockReturnValue({ stop: mocks.stop });
72
+ });
73
+ (0, vitest_1.it)('opens a URL by resolving credentials, ensuring the daemon, and navigating', async () => {
74
+ mocks.send_command.mockResolvedValue({
75
+ success: true,
76
+ data: {
77
+ status: 200,
78
+ title: 'Example Domain',
79
+ url: 'https://example.com',
80
+ },
81
+ });
82
+ await (0, browser_1.handle_browser_open)('https://example.com', {});
83
+ (0, vitest_1.expect)(mocks.ensure_authenticated).toHaveBeenCalledWith(undefined);
84
+ (0, vitest_1.expect)(mocks.ensure_browser_zone).toHaveBeenCalledWith('api_key', 'cli_browser');
85
+ (0, vitest_1.expect)(mocks.get_cdp_endpoint).toHaveBeenCalledWith('api_key', 'cli_browser', undefined);
86
+ (0, vitest_1.expect)(mocks.ensure_daemon).toHaveBeenCalledWith('default', {
87
+ cdp_endpoint: 'wss://browser.example',
88
+ daemon_dir: undefined,
89
+ idle_timeout_ms: undefined,
90
+ });
91
+ (0, vitest_1.expect)(mocks.send_command).toHaveBeenCalledWith('default', vitest_1.expect.objectContaining({
92
+ action: 'navigate',
93
+ params: { url: 'https://example.com' },
94
+ }), { daemon_dir: undefined, timeout_ms: undefined });
95
+ (0, vitest_1.expect)(mocks.stop).toHaveBeenCalledTimes(1);
96
+ (0, vitest_1.expect)(mocks.success).toHaveBeenCalledWith('Navigated to https://example.com');
97
+ (0, vitest_1.expect)(mocks.info).toHaveBeenNthCalledWith(1, 'Title: Example Domain');
98
+ (0, vitest_1.expect)(mocks.info).toHaveBeenNthCalledWith(2, 'URL: https://example.com');
99
+ });
100
+ (0, vitest_1.it)('reloads the current page for an active browser session', async () => {
101
+ mocks.send_command.mockResolvedValue({
102
+ success: true,
103
+ data: {
104
+ status: 200,
105
+ title: 'Reloaded Example',
106
+ url: 'https://example.com',
107
+ },
108
+ });
109
+ await (0, browser_1.handle_browser_reload)({ session: 'shop' });
110
+ (0, vitest_1.expect)(mocks.send_command).toHaveBeenCalledWith('shop', vitest_1.expect.objectContaining({ action: 'reload' }), { daemon_dir: undefined, timeout_ms: undefined });
111
+ (0, vitest_1.expect)(mocks.success).toHaveBeenCalledWith('Reloaded page.');
112
+ (0, vitest_1.expect)(mocks.info).toHaveBeenNthCalledWith(1, 'Title: Reloaded Example');
113
+ (0, vitest_1.expect)(mocks.info).toHaveBeenNthCalledWith(2, 'URL: https://example.com');
114
+ });
115
+ (0, vitest_1.it)('prints cookies for an active browser session', async () => {
116
+ const cookies = [{ name: 'session', value: 'abc' }];
117
+ mocks.send_command.mockResolvedValue({
118
+ success: true,
119
+ data: { cookies },
120
+ });
121
+ await (0, browser_1.handle_browser_cookies)({ session: 'shop', pretty: true });
122
+ (0, vitest_1.expect)(mocks.send_command).toHaveBeenCalledWith('shop', vitest_1.expect.objectContaining({ action: 'cookies' }), { daemon_dir: undefined, timeout_ms: undefined });
123
+ (0, vitest_1.expect)(mocks.print).toHaveBeenCalledWith(cookies, { json: undefined, output: undefined, pretty: true });
124
+ });
125
+ (0, vitest_1.it)('prints snapshot text for an active browser session with extended snapshot params', async () => {
126
+ mocks.send_command.mockResolvedValue({
127
+ success: true,
128
+ data: {
129
+ compact: true,
130
+ depth: 1,
131
+ interactive: false,
132
+ ref_count: 1,
133
+ selector: '#checkout',
134
+ snapshot: 'Page: Example Domain\nURL: https://example.com\n\n- link "Pricing" [ref=e1]',
135
+ title: 'Example Domain',
136
+ url: 'https://example.com',
137
+ },
138
+ });
139
+ await (0, browser_1.handle_browser_snapshot)({
140
+ compact: true,
141
+ depth: '1',
142
+ selector: '#checkout',
143
+ session: 'shop',
144
+ });
145
+ (0, vitest_1.expect)(mocks.send_command).toHaveBeenCalledWith('shop', vitest_1.expect.objectContaining({
146
+ action: 'snapshot',
147
+ params: {
148
+ compact: true,
149
+ depth: 1,
150
+ interactive: false,
151
+ selector: '#checkout',
152
+ },
153
+ }), { daemon_dir: undefined, timeout_ms: undefined });
154
+ (0, vitest_1.expect)(mocks.print).toHaveBeenCalledWith('Page: Example Domain\nURL: https://example.com\n\n- link "Pricing" [ref=e1]', { output: undefined });
155
+ });
156
+ (0, vitest_1.it)('captures a screenshot for an active browser session', async () => {
157
+ mocks.send_command.mockResolvedValue({
158
+ success: true,
159
+ data: {
160
+ full_page: true,
161
+ mime_type: 'image/png',
162
+ path: '/tmp/browser-shot.png',
163
+ },
164
+ });
165
+ await (0, browser_1.handle_browser_screenshot)('/tmp/browser-shot.png', {
166
+ fullPage: true,
167
+ session: 'shop',
168
+ });
169
+ (0, vitest_1.expect)(mocks.send_command).toHaveBeenCalledWith('shop', vitest_1.expect.objectContaining({
170
+ action: 'screenshot',
171
+ params: {
172
+ base64: false,
173
+ full_page: true,
174
+ path: '/tmp/browser-shot.png',
175
+ },
176
+ }), { daemon_dir: undefined, timeout_ms: undefined });
177
+ (0, vitest_1.expect)(mocks.print).toHaveBeenCalledWith('/tmp/browser-shot.png', { output: undefined });
178
+ });
179
+ (0, vitest_1.it)('rejects invalid snapshot depth before sending the command', async () => {
180
+ await (0, vitest_1.expect)((0, browser_1.handle_browser_snapshot)({ depth: 'abc', session: 'shop' })).rejects.toThrow('fail:Snapshot depth must be a non-negative integer.');
181
+ (0, vitest_1.expect)(mocks.send_command).not.toHaveBeenCalled();
182
+ });
183
+ (0, vitest_1.it)('fails status when the session is not active', async () => {
184
+ mocks.is_daemon_alive.mockResolvedValue(false);
185
+ await (0, vitest_1.expect)((0, browser_1.handle_browser_status)({ session: 'shop' })).rejects.toThrow('fail:No active browser session "shop".');
186
+ (0, vitest_1.expect)(mocks.send_command).not.toHaveBeenCalled();
187
+ });
188
+ (0, vitest_1.it)('collects browser session names from daemon files', () => {
189
+ mocks.existsSync.mockReturnValue(true);
190
+ mocks.readdirSync.mockReturnValue([
191
+ 'shop.sock',
192
+ 'shop.pid',
193
+ 'stale.pid',
194
+ 'notes.txt',
195
+ ]);
196
+ (0, vitest_1.expect)((0, browser_1.get_browser_session_names)({ daemonDir: '/tmp/test' }))
197
+ .toEqual(['shop', 'stale']);
198
+ (0, vitest_1.expect)(mocks.get_daemon_base_dir).toHaveBeenCalledWith({ daemon_dir: '/tmp/test' });
199
+ });
200
+ (0, vitest_1.it)('lists only active browser sessions', async () => {
201
+ mocks.existsSync.mockReturnValue(true);
202
+ mocks.readdirSync.mockReturnValue([
203
+ 'shop.sock',
204
+ 'shop.pid',
205
+ 'stale.pid',
206
+ ]);
207
+ mocks.is_daemon_alive.mockImplementation(async (name) => name == 'shop');
208
+ mocks.send_command.mockResolvedValue({
209
+ success: true,
210
+ data: { session_name: 'shop', connected: true },
211
+ });
212
+ await (0, browser_1.handle_browser_sessions)({ pretty: true });
213
+ (0, vitest_1.expect)(mocks.send_command).toHaveBeenCalledWith('shop', vitest_1.expect.objectContaining({ action: 'status' }), { daemon_dir: undefined, timeout_ms: undefined });
214
+ (0, vitest_1.expect)(mocks.print).toHaveBeenCalledWith([{ session_name: 'shop', connected: true }], { json: undefined, output: undefined, pretty: true });
215
+ });
216
+ (0, vitest_1.it)('closes all active browser sessions', async () => {
217
+ mocks.existsSync.mockReturnValue(true);
218
+ mocks.readdirSync.mockReturnValue([
219
+ 'shop.pid',
220
+ 'cart.sock',
221
+ 'stale.pid',
222
+ ]);
223
+ mocks.is_daemon_alive.mockImplementation(async (name) => name != 'stale');
224
+ mocks.send_command.mockResolvedValue({ success: true, data: { closed: true } });
225
+ await (0, browser_1.handle_browser_close)({ all: true });
226
+ (0, vitest_1.expect)(mocks.send_command).toHaveBeenCalledTimes(2);
227
+ (0, vitest_1.expect)(mocks.send_command).toHaveBeenNthCalledWith(1, 'cart', vitest_1.expect.objectContaining({ action: 'close' }), { daemon_dir: undefined, timeout_ms: undefined });
228
+ (0, vitest_1.expect)(mocks.send_command).toHaveBeenNthCalledWith(2, 'shop', vitest_1.expect.objectContaining({ action: 'close' }), { daemon_dir: undefined, timeout_ms: undefined });
229
+ (0, vitest_1.expect)(mocks.success).toHaveBeenCalledWith('Closed 2 browser sessions.');
230
+ });
231
+ (0, vitest_1.it)('parses browser-group flags for open and forwards them to the handler flow', async () => {
232
+ mocks.send_command.mockResolvedValue({
233
+ success: true,
234
+ data: {
235
+ status: 200,
236
+ title: 'Example Domain',
237
+ url: 'https://example.com',
238
+ },
239
+ });
240
+ const command = (0, browser_1.create_browser_command)();
241
+ command.exitOverride();
242
+ await command.parseAsync([
243
+ 'open',
244
+ 'https://example.com',
245
+ '--session',
246
+ 'shop',
247
+ '--timeout',
248
+ '1234',
249
+ '--country',
250
+ 'us',
251
+ '--zone',
252
+ 'browser_us',
253
+ '--idle-timeout',
254
+ '4567',
255
+ '--json',
256
+ ], { from: 'user' });
257
+ (0, vitest_1.expect)(mocks.ensure_browser_zone).toHaveBeenCalledWith('api_key', 'browser_us');
258
+ (0, vitest_1.expect)(mocks.get_cdp_endpoint).toHaveBeenCalledWith('api_key', 'browser_us', 'us');
259
+ (0, vitest_1.expect)(mocks.ensure_daemon).toHaveBeenCalledWith('shop', {
260
+ cdp_endpoint: 'wss://browser.example',
261
+ daemon_dir: undefined,
262
+ idle_timeout_ms: 4567,
263
+ });
264
+ (0, vitest_1.expect)(mocks.send_command).toHaveBeenCalledWith('shop', vitest_1.expect.objectContaining({
265
+ action: 'navigate',
266
+ params: { url: 'https://example.com' },
267
+ }), { daemon_dir: undefined, timeout_ms: 1234 });
268
+ (0, vitest_1.expect)(mocks.print).toHaveBeenCalledWith({
269
+ status: 200,
270
+ title: 'Example Domain',
271
+ url: 'https://example.com',
272
+ }, { json: true, output: undefined, pretty: undefined });
273
+ (0, vitest_1.expect)(mocks.success).not.toHaveBeenCalled();
274
+ });
275
+ (0, vitest_1.it)('parses the back subcommand and sends the browser action', async () => {
276
+ mocks.send_command.mockResolvedValue({
277
+ success: true,
278
+ data: {
279
+ status: 200,
280
+ title: 'Back Page',
281
+ url: 'https://example.com/back',
282
+ },
283
+ });
284
+ const command = (0, browser_1.create_browser_command)();
285
+ command.exitOverride();
286
+ await command.parseAsync([
287
+ 'back',
288
+ '--session',
289
+ 'shop',
290
+ '--json',
291
+ ], { from: 'user' });
292
+ (0, vitest_1.expect)(mocks.send_command).toHaveBeenCalledWith('shop', vitest_1.expect.objectContaining({ action: 'back' }), { daemon_dir: undefined, timeout_ms: undefined });
293
+ (0, vitest_1.expect)(mocks.print).toHaveBeenCalledWith({
294
+ status: 200,
295
+ title: 'Back Page',
296
+ url: 'https://example.com/back',
297
+ }, { json: true, output: undefined, pretty: undefined });
298
+ });
299
+ (0, vitest_1.it)('parses snapshot flags and forwards the full snapshot param set', async () => {
300
+ mocks.send_command.mockResolvedValue({
301
+ success: true,
302
+ data: {
303
+ compact: false,
304
+ depth: 2,
305
+ interactive: true,
306
+ ref_count: 1,
307
+ selector: '#checkout',
308
+ snapshot: 'Page: Example Domain\nURL: https://example.com\n\n- link "Pricing" [ref=e1]',
309
+ title: 'Example Domain',
310
+ url: 'https://example.com',
311
+ },
312
+ });
313
+ const command = (0, browser_1.create_browser_command)();
314
+ command.exitOverride();
315
+ await command.parseAsync([
316
+ 'snapshot',
317
+ '--session',
318
+ 'shop',
319
+ '--interactive',
320
+ '--depth',
321
+ '2',
322
+ '--selector',
323
+ '#checkout',
324
+ '--json',
325
+ ], { from: 'user' });
326
+ (0, vitest_1.expect)(mocks.send_command).toHaveBeenCalledWith('shop', vitest_1.expect.objectContaining({
327
+ action: 'snapshot',
328
+ params: {
329
+ compact: false,
330
+ depth: 2,
331
+ interactive: true,
332
+ selector: '#checkout',
333
+ },
334
+ }), { daemon_dir: undefined, timeout_ms: undefined });
335
+ (0, vitest_1.expect)(mocks.print).toHaveBeenCalledWith({
336
+ compact: false,
337
+ depth: 2,
338
+ interactive: true,
339
+ ref_count: 1,
340
+ selector: '#checkout',
341
+ snapshot: 'Page: Example Domain\nURL: https://example.com\n\n- link "Pricing" [ref=e1]',
342
+ title: 'Example Domain',
343
+ url: 'https://example.com',
344
+ }, { json: true, output: undefined, pretty: undefined });
345
+ });
346
+ (0, vitest_1.it)('parses screenshot flags and forwards the screenshot params', async () => {
347
+ mocks.send_command.mockResolvedValue({
348
+ success: true,
349
+ data: {
350
+ base64: 'aW1hZ2U=',
351
+ full_page: true,
352
+ mime_type: 'image/png',
353
+ path: '/tmp/browser-shot.png',
354
+ },
355
+ });
356
+ const command = (0, browser_1.create_browser_command)();
357
+ command.exitOverride();
358
+ await command.parseAsync([
359
+ 'screenshot',
360
+ '/tmp/browser-shot.png',
361
+ '--session',
362
+ 'shop',
363
+ '--full-page',
364
+ '--base64',
365
+ '--json',
366
+ ], { from: 'user' });
367
+ (0, vitest_1.expect)(mocks.send_command).toHaveBeenCalledWith('shop', vitest_1.expect.objectContaining({
368
+ action: 'screenshot',
369
+ params: {
370
+ base64: true,
371
+ full_page: true,
372
+ path: '/tmp/browser-shot.png',
373
+ },
374
+ }), { daemon_dir: undefined, timeout_ms: undefined });
375
+ (0, vitest_1.expect)(mocks.print).toHaveBeenCalledWith({
376
+ base64: 'aW1hZ2U=',
377
+ full_page: true,
378
+ mime_type: 'image/png',
379
+ path: '/tmp/browser-shot.png',
380
+ }, { json: true, output: undefined, pretty: undefined });
381
+ });
382
+ (0, vitest_1.it)('rejects open-only flags on status through browser-group parsing', async () => {
383
+ const command = (0, browser_1.create_browser_command)();
384
+ command.exitOverride();
385
+ await (0, vitest_1.expect)(command.parseAsync([
386
+ 'status',
387
+ '--country',
388
+ 'us',
389
+ ], { from: 'user' })).rejects.toThrow('fail:--country is not supported by "brightdata browser status".');
390
+ (0, vitest_1.expect)(mocks.send_command).not.toHaveBeenCalled();
391
+ });
392
+ (0, vitest_1.it)('rejects compact mode outside the snapshot command', async () => {
393
+ const command = (0, browser_1.create_browser_command)();
394
+ command.exitOverride();
395
+ await (0, vitest_1.expect)(command.parseAsync([
396
+ 'status',
397
+ '--compact',
398
+ ], { from: 'user' })).rejects.toThrow('fail:--compact is not supported by "brightdata browser status".');
399
+ (0, vitest_1.expect)(mocks.send_command).not.toHaveBeenCalled();
400
+ });
401
+ (0, vitest_1.it)('rejects selector mode outside the snapshot command', async () => {
402
+ const command = (0, browser_1.create_browser_command)();
403
+ command.exitOverride();
404
+ await (0, vitest_1.expect)(command.parseAsync([
405
+ 'status',
406
+ '--selector',
407
+ '#checkout',
408
+ ], { from: 'user' })).rejects.toThrow('fail:--selector is not supported by "brightdata browser status".');
409
+ (0, vitest_1.expect)(mocks.send_command).not.toHaveBeenCalled();
410
+ });
411
+ (0, vitest_1.it)('rejects screenshot-only flags outside the screenshot command', async () => {
412
+ const command = (0, browser_1.create_browser_command)();
413
+ command.exitOverride();
414
+ await (0, vitest_1.expect)(command.parseAsync([
415
+ 'status',
416
+ '--full-page',
417
+ ], { from: 'user' })).rejects.toThrow('fail:--full-page is not supported by "brightdata browser status".');
418
+ (0, vitest_1.expect)(mocks.send_command).not.toHaveBeenCalled();
419
+ });
420
+ (0, vitest_1.it)('rejects not-yet-implemented global flags on open', async () => {
421
+ const command = (0, browser_1.create_browser_command)();
422
+ command.exitOverride();
423
+ await (0, vitest_1.expect)(command.parseAsync([
424
+ 'open',
425
+ 'https://example.com',
426
+ '--headed',
427
+ ], { from: 'user' })).rejects.toThrow('fail:--headed is not supported by "brightdata browser open".');
428
+ (0, vitest_1.expect)(mocks.ensure_authenticated).not.toHaveBeenCalled();
429
+ });
430
+ });
431
+ //# sourceMappingURL=browser.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"browser.test.js","sourceRoot":"","sources":["../../../src/__tests__/commands/browser.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=browser-credentials.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"browser-credentials.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/utils/browser-credentials.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,81 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const vitest_1 = require("vitest");
4
+ const mocks = vitest_1.vi.hoisted(() => ({
5
+ get: vitest_1.vi.fn(),
6
+ post: vitest_1.vi.fn(),
7
+ }));
8
+ vitest_1.vi.mock('../../utils/client', () => ({
9
+ get: mocks.get,
10
+ post: mocks.post,
11
+ }));
12
+ const browser_credentials_1 = require("../../utils/browser-credentials");
13
+ (0, vitest_1.describe)('utils/browser-credentials', () => {
14
+ (0, vitest_1.beforeEach)(() => {
15
+ vitest_1.vi.clearAllMocks();
16
+ });
17
+ (0, vitest_1.it)('does not create the browser zone when it already exists', async () => {
18
+ mocks.get.mockResolvedValueOnce([
19
+ { name: 'cli_browser', type: 'browser_api' },
20
+ ]);
21
+ await (0, vitest_1.expect)((0, browser_credentials_1.ensure_browser_zone)('api_key')).resolves.toBeUndefined();
22
+ (0, vitest_1.expect)(mocks.get).toHaveBeenCalledWith('api_key', '/zone/get_active_zones');
23
+ (0, vitest_1.expect)(mocks.post).not.toHaveBeenCalled();
24
+ });
25
+ (0, vitest_1.it)('creates the default browser zone when it is missing', async () => {
26
+ mocks.get.mockResolvedValueOnce([
27
+ { name: 'cli_unlocker', type: 'unblocker' },
28
+ ]);
29
+ mocks.post.mockResolvedValueOnce({});
30
+ await (0, browser_credentials_1.ensure_browser_zone)('api_key');
31
+ (0, vitest_1.expect)(mocks.post).toHaveBeenCalledWith('api_key', '/zone', {
32
+ zone: { name: 'cli_browser', type: 'browser_api' },
33
+ plan: { type: 'browser_api' },
34
+ });
35
+ });
36
+ (0, vitest_1.it)('creates a custom browser zone when an override is missing', async () => {
37
+ mocks.get.mockResolvedValueOnce([]);
38
+ mocks.post.mockResolvedValueOnce({});
39
+ await (0, browser_credentials_1.ensure_browser_zone)('api_key', ' browser_us ');
40
+ (0, vitest_1.expect)(mocks.post).toHaveBeenCalledWith('api_key', '/zone', {
41
+ zone: { name: 'browser_us', type: 'browser_api' },
42
+ plan: { type: 'browser_api' },
43
+ });
44
+ });
45
+ (0, vitest_1.it)('builds a CDP endpoint without country targeting', async () => {
46
+ mocks.get
47
+ .mockResolvedValueOnce({ customer: 'hl_123' })
48
+ .mockResolvedValueOnce({ passwords: ['secret'] });
49
+ await (0, vitest_1.expect)((0, browser_credentials_1.get_cdp_endpoint)('api_key', 'cli_browser'))
50
+ .resolves.toBe('wss://brd-customer-hl_123-zone-cli_browser:secret@'
51
+ + 'brd.superproxy.io:9222');
52
+ (0, vitest_1.expect)(mocks.get).toHaveBeenNthCalledWith(1, 'api_key', '/status');
53
+ (0, vitest_1.expect)(mocks.get).toHaveBeenNthCalledWith(2, 'api_key', '/zone/passwords?zone=cli_browser');
54
+ });
55
+ (0, vitest_1.it)('builds a CDP endpoint with normalized country targeting', async () => {
56
+ mocks.get
57
+ .mockResolvedValueOnce({ customer: 'hl_123' })
58
+ .mockResolvedValueOnce({ passwords: ['secret'] });
59
+ await (0, vitest_1.expect)((0, browser_credentials_1.get_cdp_endpoint)('api_key', ' cli_browser ', ' US '))
60
+ .resolves.toBe('wss://brd-customer-hl_123-zone-cli_browser-country-us:'
61
+ + 'secret@brd.superproxy.io:9222');
62
+ });
63
+ (0, vitest_1.it)('throws when the customer id is missing', async () => {
64
+ mocks.get.mockResolvedValueOnce({});
65
+ await (0, vitest_1.expect)((0, browser_credentials_1.get_cdp_endpoint)('api_key', 'cli_browser'))
66
+ .rejects.toThrow('Could not resolve Bright Data customer ID from /status.');
67
+ });
68
+ (0, vitest_1.it)('throws when the zone has no passwords', async () => {
69
+ mocks.get
70
+ .mockResolvedValueOnce({ customer: 'hl_123' })
71
+ .mockResolvedValueOnce({ passwords: [] });
72
+ await (0, vitest_1.expect)((0, browser_credentials_1.get_cdp_endpoint)('api_key', 'cli_browser'))
73
+ .rejects.toThrow('No browser password found for zone "cli_browser".');
74
+ });
75
+ (0, vitest_1.it)('rejects invalid country codes before making requests', async () => {
76
+ await (0, vitest_1.expect)((0, browser_credentials_1.get_cdp_endpoint)('api_key', 'cli_browser', 'usa'))
77
+ .rejects.toThrow('Browser country must be a 2-letter ISO code.');
78
+ (0, vitest_1.expect)(mocks.get).not.toHaveBeenCalled();
79
+ });
80
+ });
81
+ //# sourceMappingURL=browser-credentials.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"browser-credentials.test.js","sourceRoot":"","sources":["../../../src/__tests__/utils/browser-credentials.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ import type { Browser, BrowserContext, Page } from 'playwright-core';
2
+ type Browser_connection_state = {
3
+ browser: Browser | null;
4
+ page: Page | null;
5
+ connected: boolean;
6
+ cdp_endpoint: string;
7
+ dom_refs: Map<string, string>;
8
+ };
9
+ type Browser_connection_deps = {
10
+ connect_over_cdp: (cdp_endpoint: string) => Promise<Browser>;
11
+ };
12
+ type Browser_connection_hooks = {
13
+ on_context?: (context: BrowserContext) => void;
14
+ on_page?: (page: Page) => void;
15
+ };
16
+ declare const clear_connection_state: (state: Browser_connection_state) => void;
17
+ declare const connect_browser: (state: Browser_connection_state, deps: Browser_connection_deps, hooks?: Browser_connection_hooks) => Promise<{
18
+ browser: Browser;
19
+ page: Page;
20
+ }>;
21
+ declare const ensure_connected: (state: Browser_connection_state, deps: Browser_connection_deps, hooks?: Browser_connection_hooks) => Promise<Page>;
22
+ export { clear_connection_state, connect_browser, ensure_connected, };
23
+ export type { Browser_connection_deps, Browser_connection_hooks, Browser_connection_state, };
24
+ //# sourceMappingURL=connection.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connection.d.ts","sourceRoot":"","sources":["../../src/browser/connection.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,OAAO,EAAE,cAAc,EAAE,IAAI,EAAC,MAAM,iBAAiB,CAAC;AAEnE,KAAK,wBAAwB,GAAG;IAC5B,OAAO,EAAE,OAAO,GAAC,IAAI,CAAC;IACtB,IAAI,EAAE,IAAI,GAAC,IAAI,CAAC;IAChB,SAAS,EAAE,OAAO,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACjC,CAAC;AAEF,KAAK,uBAAuB,GAAG;IAC3B,gBAAgB,EAAE,CAAC,YAAY,EAAE,MAAM,KAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CAC9D,CAAC;AAEF,KAAK,wBAAwB,GAAG;IAC5B,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,cAAc,KAAG,IAAI,CAAC;IAC7C,OAAO,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,KAAG,IAAI,CAAC;CAChC,CAAC;AAEF,QAAA,MAAM,sBAAsB,GAAI,OAAO,wBAAwB,SAK9D,CAAC;AAmBF,QAAA,MAAM,eAAe,GACjB,OAAO,wBAAwB,EAC/B,MAAM,uBAAuB,EAC7B,QAAO,wBAA6B,KACrC,OAAO,CAAC;IAAC,OAAO,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,IAAI,CAAA;CAAC,CAUxC,CAAC;AAEF,QAAA,MAAM,gBAAgB,GAClB,OAAO,wBAAwB,EAC/B,MAAM,uBAAuB,EAC7B,QAAO,wBAA6B,KACrC,OAAO,CAAC,IAAI,CAwBd,CAAC;AAEF,OAAO,EACH,sBAAsB,EACtB,eAAe,EACf,gBAAgB,GACnB,CAAC;AACF,YAAY,EACR,uBAAuB,EACvB,wBAAwB,EACxB,wBAAwB,GAC3B,CAAC"}
@@ -0,0 +1,55 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ensure_connected = exports.connect_browser = exports.clear_connection_state = void 0;
4
+ const clear_connection_state = (state) => {
5
+ state.browser = null;
6
+ state.page = null;
7
+ state.connected = false;
8
+ state.dom_refs.clear();
9
+ };
10
+ exports.clear_connection_state = clear_connection_state;
11
+ const resolve_page = async (browser, hooks = {}) => {
12
+ const contexts = browser.contexts();
13
+ const context = contexts[0] ?? await browser.newContext();
14
+ for (const existing_context of contexts)
15
+ hooks.on_context?.(existing_context);
16
+ if (!contexts.includes(context))
17
+ hooks.on_context?.(context);
18
+ const page = context.pages()[0] ?? await context.newPage();
19
+ hooks.on_page?.(page);
20
+ return page;
21
+ };
22
+ const connect_browser = async (state, deps, hooks = {}) => {
23
+ const browser = await deps.connect_over_cdp(state.cdp_endpoint);
24
+ browser.on('disconnected', () => {
25
+ if (state.browser && state.browser != browser)
26
+ return;
27
+ clear_connection_state(state);
28
+ });
29
+ const page = await resolve_page(browser, hooks);
30
+ return { browser, page };
31
+ };
32
+ exports.connect_browser = connect_browser;
33
+ const ensure_connected = async (state, deps, hooks = {}) => {
34
+ if (state.browser) {
35
+ try {
36
+ state.browser.contexts();
37
+ state.connected = true;
38
+ }
39
+ catch (_error) {
40
+ clear_connection_state(state);
41
+ }
42
+ }
43
+ if (!state.browser) {
44
+ const { browser, page } = await connect_browser(state, deps, hooks);
45
+ state.browser = browser;
46
+ state.page = page;
47
+ state.connected = true;
48
+ return page;
49
+ }
50
+ if (!state.page || state.page.isClosed())
51
+ state.page = await resolve_page(state.browser, hooks);
52
+ return state.page;
53
+ };
54
+ exports.ensure_connected = ensure_connected;
55
+ //# sourceMappingURL=connection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connection.js","sourceRoot":"","sources":["../../src/browser/connection.ts"],"names":[],"mappings":";;;AAmBA,MAAM,sBAAsB,GAAG,CAAC,KAA+B,EAAC,EAAE;IAC9D,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC;IACrB,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC;IAClB,KAAK,CAAC,SAAS,GAAG,KAAK,CAAC;IACxB,KAAK,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;AAC3B,CAAC,CAAC;AAkEE,wDAAsB;AAhE1B,MAAM,YAAY,GAAG,KAAK,EACtB,OAAgB,EAChB,QAAkC,EAAE,EACxB,EAAE;IACd,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC;IACpC,MAAM,OAAO,GAAG,QAAQ,CAAC,CAAC,CAAC,IAAI,MAAM,OAAO,CAAC,UAAU,EAAE,CAAC;IAE1D,KAAK,MAAM,gBAAgB,IAAI,QAAQ;QACnC,KAAK,CAAC,UAAU,EAAE,CAAC,gBAAgB,CAAC,CAAC;IACzC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC;QAC3B,KAAK,CAAC,UAAU,EAAE,CAAC,OAAO,CAAC,CAAC;IAEhC,MAAM,IAAI,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC;IAC3D,KAAK,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,CAAC;IACtB,OAAO,IAAI,CAAC;AAChB,CAAC,CAAC;AAEF,MAAM,eAAe,GAAG,KAAK,EACzB,KAA+B,EAC/B,IAA6B,EAC7B,QAAkC,EAAE,EACE,EAAE;IACxC,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;IAChE,OAAO,CAAC,EAAE,CAAC,cAAc,EAAE,GAAE,EAAE;QAC3B,IAAI,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,OAAO,IAAI,OAAO;YACzC,OAAO;QACX,sBAAsB,CAAC,KAAK,CAAC,CAAC;IAClC,CAAC,CAAC,CAAC;IAEH,MAAM,IAAI,GAAG,MAAM,YAAY,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IAChD,OAAO,EAAC,OAAO,EAAE,IAAI,EAAC,CAAC;AAC3B,CAAC,CAAC;AAkCE,0CAAe;AAhCnB,MAAM,gBAAgB,GAAG,KAAK,EAC1B,KAA+B,EAC/B,IAA6B,EAC7B,QAAkC,EAAE,EACxB,EAAE;IACd,IAAI,KAAK,CAAC,OAAO,EACjB,CAAC;QACG,IAAI,CAAC;YACD,KAAK,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC;YACzB,KAAK,CAAC,SAAS,GAAG,IAAI,CAAC;QAC3B,CAAC;QAAC,OAAM,MAAM,EAAE,CAAC;YACb,sBAAsB,CAAC,KAAK,CAAC,CAAC;QAClC,CAAC;IACL,CAAC;IAED,IAAI,CAAC,KAAK,CAAC,OAAO,EAClB,CAAC;QACG,MAAM,EAAC,OAAO,EAAE,IAAI,EAAC,GAAG,MAAM,eAAe,CAAC,KAAK,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;QAClE,KAAK,CAAC,OAAO,GAAG,OAAO,CAAC;QACxB,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC;QAClB,KAAK,CAAC,SAAS,GAAG,IAAI,CAAC;QACvB,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,IAAI,CAAC,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,IAAI,CAAC,QAAQ,EAAE;QACpC,KAAK,CAAC,IAAI,GAAG,MAAM,YAAY,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IAE1D,OAAO,KAAK,CAAC,IAAI,CAAC;AACtB,CAAC,CAAC;AAKE,4CAAgB"}