@brightdata/cli 0.1.0

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 (170) hide show
  1. package/README.md +624 -0
  2. package/dist/__tests__/commands/budget.test.d.ts +2 -0
  3. package/dist/__tests__/commands/budget.test.d.ts.map +1 -0
  4. package/dist/__tests__/commands/budget.test.js +199 -0
  5. package/dist/__tests__/commands/budget.test.js.map +1 -0
  6. package/dist/__tests__/commands/dataset.test.d.ts +2 -0
  7. package/dist/__tests__/commands/dataset.test.d.ts.map +1 -0
  8. package/dist/__tests__/commands/dataset.test.js +22 -0
  9. package/dist/__tests__/commands/dataset.test.js.map +1 -0
  10. package/dist/__tests__/commands/login.test.d.ts +2 -0
  11. package/dist/__tests__/commands/login.test.d.ts.map +1 -0
  12. package/dist/__tests__/commands/login.test.js +123 -0
  13. package/dist/__tests__/commands/login.test.js.map +1 -0
  14. package/dist/__tests__/commands/scrape.test.d.ts +2 -0
  15. package/dist/__tests__/commands/scrape.test.d.ts.map +1 -0
  16. package/dist/__tests__/commands/scrape.test.js +73 -0
  17. package/dist/__tests__/commands/scrape.test.js.map +1 -0
  18. package/dist/__tests__/commands/search.test.d.ts +2 -0
  19. package/dist/__tests__/commands/search.test.d.ts.map +1 -0
  20. package/dist/__tests__/commands/search.test.js +95 -0
  21. package/dist/__tests__/commands/search.test.js.map +1 -0
  22. package/dist/__tests__/commands/skill-add.test.d.ts +2 -0
  23. package/dist/__tests__/commands/skill-add.test.d.ts.map +1 -0
  24. package/dist/__tests__/commands/skill-add.test.js +177 -0
  25. package/dist/__tests__/commands/skill-add.test.js.map +1 -0
  26. package/dist/__tests__/commands/skill.test.d.ts +2 -0
  27. package/dist/__tests__/commands/skill.test.d.ts.map +1 -0
  28. package/dist/__tests__/commands/skill.test.js +58 -0
  29. package/dist/__tests__/commands/skill.test.js.map +1 -0
  30. package/dist/__tests__/commands/status.test.d.ts +2 -0
  31. package/dist/__tests__/commands/status.test.d.ts.map +1 -0
  32. package/dist/__tests__/commands/status.test.js +71 -0
  33. package/dist/__tests__/commands/status.test.js.map +1 -0
  34. package/dist/__tests__/commands/version.test.d.ts +2 -0
  35. package/dist/__tests__/commands/version.test.d.ts.map +1 -0
  36. package/dist/__tests__/commands/version.test.js +41 -0
  37. package/dist/__tests__/commands/version.test.js.map +1 -0
  38. package/dist/__tests__/utils/browser_auth.test.d.ts +2 -0
  39. package/dist/__tests__/utils/browser_auth.test.d.ts.map +1 -0
  40. package/dist/__tests__/utils/browser_auth.test.js +38 -0
  41. package/dist/__tests__/utils/browser_auth.test.js.map +1 -0
  42. package/dist/__tests__/utils/config.test.d.ts +2 -0
  43. package/dist/__tests__/utils/config.test.d.ts.map +1 -0
  44. package/dist/__tests__/utils/config.test.js +58 -0
  45. package/dist/__tests__/utils/config.test.js.map +1 -0
  46. package/dist/__tests__/utils/polling.test.d.ts +2 -0
  47. package/dist/__tests__/utils/polling.test.d.ts.map +1 -0
  48. package/dist/__tests__/utils/polling.test.js +65 -0
  49. package/dist/__tests__/utils/polling.test.js.map +1 -0
  50. package/dist/commands/budget.d.ts +15 -0
  51. package/dist/commands/budget.d.ts.map +1 -0
  52. package/dist/commands/budget.js +217 -0
  53. package/dist/commands/budget.js.map +1 -0
  54. package/dist/commands/config.d.ts +12 -0
  55. package/dist/commands/config.d.ts.map +1 -0
  56. package/dist/commands/config.js +60 -0
  57. package/dist/commands/config.js.map +1 -0
  58. package/dist/commands/dataset.d.ts +6 -0
  59. package/dist/commands/dataset.d.ts.map +1 -0
  60. package/dist/commands/dataset.js +250 -0
  61. package/dist/commands/dataset.js.map +1 -0
  62. package/dist/commands/init.d.ts +9 -0
  63. package/dist/commands/init.d.ts.map +1 -0
  64. package/dist/commands/init.js +247 -0
  65. package/dist/commands/init.js.map +1 -0
  66. package/dist/commands/login.d.ts +10 -0
  67. package/dist/commands/login.d.ts.map +1 -0
  68. package/dist/commands/login.js +98 -0
  69. package/dist/commands/login.js.map +1 -0
  70. package/dist/commands/logout.d.ts +5 -0
  71. package/dist/commands/logout.d.ts.map +1 -0
  72. package/dist/commands/logout.js +20 -0
  73. package/dist/commands/logout.js.map +1 -0
  74. package/dist/commands/scrape.d.ts +6 -0
  75. package/dist/commands/scrape.d.ts.map +1 -0
  76. package/dist/commands/scrape.js +79 -0
  77. package/dist/commands/scrape.js.map +1 -0
  78. package/dist/commands/search.d.ts +6 -0
  79. package/dist/commands/search.d.ts.map +1 -0
  80. package/dist/commands/search.js +179 -0
  81. package/dist/commands/search.js.map +1 -0
  82. package/dist/commands/skill-add.d.ts +3 -0
  83. package/dist/commands/skill-add.d.ts.map +1 -0
  84. package/dist/commands/skill-add.js +285 -0
  85. package/dist/commands/skill-add.js.map +1 -0
  86. package/dist/commands/skill.d.ts +5 -0
  87. package/dist/commands/skill.d.ts.map +1 -0
  88. package/dist/commands/skill.js +31 -0
  89. package/dist/commands/skill.js.map +1 -0
  90. package/dist/commands/status.d.ts +14 -0
  91. package/dist/commands/status.d.ts.map +1 -0
  92. package/dist/commands/status.js +99 -0
  93. package/dist/commands/status.js.map +1 -0
  94. package/dist/commands/version.d.ts +18 -0
  95. package/dist/commands/version.d.ts.map +1 -0
  96. package/dist/commands/version.js +35 -0
  97. package/dist/commands/version.js.map +1 -0
  98. package/dist/commands/zones.d.ts +13 -0
  99. package/dist/commands/zones.d.ts.map +1 -0
  100. package/dist/commands/zones.js +70 -0
  101. package/dist/commands/zones.js.map +1 -0
  102. package/dist/index.d.ts +3 -0
  103. package/dist/index.d.ts.map +1 -0
  104. package/dist/index.js +42 -0
  105. package/dist/index.js.map +1 -0
  106. package/dist/types/dataset.d.ts +19 -0
  107. package/dist/types/dataset.d.ts.map +1 -0
  108. package/dist/types/dataset.js +3 -0
  109. package/dist/types/dataset.js.map +1 -0
  110. package/dist/types/scrape.d.ts +31 -0
  111. package/dist/types/scrape.d.ts.map +1 -0
  112. package/dist/types/scrape.js +3 -0
  113. package/dist/types/scrape.js.map +1 -0
  114. package/dist/types/search.d.ts +47 -0
  115. package/dist/types/search.d.ts.map +1 -0
  116. package/dist/types/search.js +3 -0
  117. package/dist/types/search.js.map +1 -0
  118. package/dist/utils/auth.d.ts +6 -0
  119. package/dist/utils/auth.d.ts.map +1 -0
  120. package/dist/utils/auth.js +44 -0
  121. package/dist/utils/auth.js.map +1 -0
  122. package/dist/utils/auth_pages.d.ts +3 -0
  123. package/dist/utils/auth_pages.d.ts.map +1 -0
  124. package/dist/utils/auth_pages.js +316 -0
  125. package/dist/utils/auth_pages.js.map +1 -0
  126. package/dist/utils/browser_auth.d.ts +21 -0
  127. package/dist/utils/browser_auth.d.ts.map +1 -0
  128. package/dist/utils/browser_auth.js +290 -0
  129. package/dist/utils/browser_auth.js.map +1 -0
  130. package/dist/utils/client.d.ts +17 -0
  131. package/dist/utils/client.d.ts.map +1 -0
  132. package/dist/utils/client.js +95 -0
  133. package/dist/utils/client.js.map +1 -0
  134. package/dist/utils/config.d.ts +16 -0
  135. package/dist/utils/config.d.ts.map +1 -0
  136. package/dist/utils/config.js +65 -0
  137. package/dist/utils/config.js.map +1 -0
  138. package/dist/utils/credentials.d.ts +11 -0
  139. package/dist/utils/credentials.d.ts.map +1 -0
  140. package/dist/utils/credentials.js +52 -0
  141. package/dist/utils/credentials.js.map +1 -0
  142. package/dist/utils/output.d.ts +23 -0
  143. package/dist/utils/output.d.ts.map +1 -0
  144. package/dist/utils/output.js +89 -0
  145. package/dist/utils/output.js.map +1 -0
  146. package/dist/utils/polling.d.ts +26 -0
  147. package/dist/utils/polling.d.ts.map +1 -0
  148. package/dist/utils/polling.js +46 -0
  149. package/dist/utils/polling.js.map +1 -0
  150. package/dist/utils/skill-installer/agents.d.ts +19 -0
  151. package/dist/utils/skill-installer/agents.d.ts.map +1 -0
  152. package/dist/utils/skill-installer/agents.js +345 -0
  153. package/dist/utils/skill-installer/agents.js.map +1 -0
  154. package/dist/utils/skill-installer/brightdata-skills.d.ts +11 -0
  155. package/dist/utils/skill-installer/brightdata-skills.d.ts.map +1 -0
  156. package/dist/utils/skill-installer/brightdata-skills.js +52 -0
  157. package/dist/utils/skill-installer/brightdata-skills.js.map +1 -0
  158. package/dist/utils/skill-installer/installer.d.ts +34 -0
  159. package/dist/utils/skill-installer/installer.d.ts.map +1 -0
  160. package/dist/utils/skill-installer/installer.js +240 -0
  161. package/dist/utils/skill-installer/installer.js.map +1 -0
  162. package/dist/utils/skill-installer/prompts/search-multiselect.d.ts +22 -0
  163. package/dist/utils/skill-installer/prompts/search-multiselect.d.ts.map +1 -0
  164. package/dist/utils/skill-installer/prompts/search-multiselect.js +251 -0
  165. package/dist/utils/skill-installer/prompts/search-multiselect.js.map +1 -0
  166. package/dist/utils/spinner.d.ts +7 -0
  167. package/dist/utils/spinner.d.ts.map +1 -0
  168. package/dist/utils/spinner.js +27 -0
  169. package/dist/utils/spinner.js.map +1 -0
  170. package/package.json +65 -0
@@ -0,0 +1,247 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.handle_init = exports.init_command = void 0;
4
+ const commander_1 = require("commander");
5
+ const prompts_1 = require("@inquirer/prompts");
6
+ const auth_1 = require("../utils/auth");
7
+ const credentials_1 = require("../utils/credentials");
8
+ const config_1 = require("../utils/config");
9
+ const client_1 = require("../utils/client");
10
+ const output_1 = require("../utils/output");
11
+ const spinner_1 = require("../utils/spinner");
12
+ const white = (text) => output_1.is_tty ? `\x1b[37m${text}\x1b[0m` : text;
13
+ const blue = (text) => output_1.is_tty ? `\x1b[34m${text}\x1b[0m` : text;
14
+ const BANNER_SPLIT_COL = 62;
15
+ const BANNER = [
16
+ '███████████ ███ █████ █████ ██████████ █████ ',
17
+ '░░███░░░░░███ ░░░ ░░███ ░░███ ░░███░░░░███ ░░███ ',
18
+ ' ░███ ░███ ████████ ████ ███████ ░███████ ███████ ░███ ░░███ ██████ ███████ ██████ ',
19
+ ' ░██████████ ░░███░░███░░███ ███░░███ ░███░░███ ░░░███░ ░███ ░███ ░░░░░███ ░░░███░ ░░░░░███ ',
20
+ ' ░███░░░░░███ ░███ ░░░ ░███ ░███ ░███ ░███ ░███ ░███ ░███ ░███ ███████ ░███ ███████ ',
21
+ ' ░███ ░███ ░███ ░███ ░███ ░███ ░███ ░███ ░███ ███ ░███ ███ ███░░███ ░███ ███ ███░░███ ',
22
+ ' ███████████ █████ █████░░███████ ████ █████ ░░█████ ██████████ ░░████████ ░░█████ ░░████████',
23
+ '░░░░░░░░░░░ ░░░░░ ░░░░░ ░░░░░███░░░░ ░░░░░ ░░░░░ ░░░░░░░░░░ ░░░░░░░░ ░░░░░ ░░░░░░░░ ',
24
+ ' ███ ░███ ',
25
+ ' ░░██████ ',
26
+ ' ░░░░░░ ',
27
+ ];
28
+ const sleep = (ms) => new Promise(resolve => setTimeout(resolve, ms));
29
+ const print_banner = () => {
30
+ process.stderr.write('\n');
31
+ for (let i = 0; i < BANNER.length; i++) {
32
+ const left = BANNER[i].slice(0, BANNER_SPLIT_COL);
33
+ const right = BANNER[i].slice(BANNER_SPLIT_COL);
34
+ process.stderr.write(white(left) + blue(right) + '\n');
35
+ }
36
+ process.stderr.write('\n');
37
+ process.stderr.write((0, output_1.dim)('Bright Data CLI setup wizard') + '\n');
38
+ process.stderr.write((0, output_1.dim)('This configures authentication and defaults') + '\n\n');
39
+ };
40
+ const fetch_active_zones = async (api_key) => {
41
+ const spinner = (0, spinner_1.start)('Loading active zones...');
42
+ try {
43
+ const zones = await (0, client_1.get)(api_key, '/zone/get_active_zones');
44
+ spinner.stop();
45
+ if (!zones.length) {
46
+ (0, output_1.warn)('No active zones were found in your account.');
47
+ return [];
48
+ }
49
+ (0, output_1.success)(`Found ${zones.length} active zone(s).`);
50
+ return zones;
51
+ }
52
+ catch (e) {
53
+ spinner.stop();
54
+ (0, output_1.warn)(`Could not load zones: ${e.message}`);
55
+ return [];
56
+ }
57
+ };
58
+ const pick_best_zone = (zone_names, preferred) => {
59
+ if (preferred && zone_names.includes(preferred))
60
+ return preferred;
61
+ if (zone_names.includes('cli_unlocker'))
62
+ return 'cli_unlocker';
63
+ if (zone_names.length)
64
+ return zone_names[0];
65
+ return preferred;
66
+ };
67
+ const prompt_zone = async (title, zone_names, suggested) => {
68
+ if (!output_1.is_tty)
69
+ return suggested;
70
+ if (!zone_names.length) {
71
+ const typed = (await (0, prompts_1.input)({
72
+ message: `${title}:`,
73
+ default: suggested ?? '',
74
+ })).trim();
75
+ if (typed)
76
+ return typed;
77
+ return suggested;
78
+ }
79
+ const choices = zone_names.map(name => ({ name, value: name }));
80
+ choices.push({ name: 'Enter custom zone name', value: '__custom__' });
81
+ const selected = await (0, prompts_1.select)({
82
+ message: title,
83
+ choices,
84
+ default: suggested && zone_names.includes(suggested)
85
+ ? suggested
86
+ : zone_names[0],
87
+ });
88
+ if (selected != '__custom__')
89
+ return selected;
90
+ const custom = (await (0, prompts_1.input)({
91
+ message: 'Zone name:',
92
+ default: suggested ?? '',
93
+ })).trim();
94
+ if (custom)
95
+ return custom;
96
+ return suggested;
97
+ };
98
+ const prompt_default_format = async (current) => {
99
+ if (!output_1.is_tty)
100
+ return current ?? 'markdown';
101
+ const selected = await (0, prompts_1.select)({
102
+ message: 'Choose default output format',
103
+ choices: [
104
+ {
105
+ name: 'markdown (best for reading)',
106
+ value: 'markdown',
107
+ },
108
+ {
109
+ name: 'json (best for pipelines)',
110
+ value: 'json',
111
+ },
112
+ ],
113
+ default: current == 'json' ? 'json' : 'markdown',
114
+ });
115
+ return selected;
116
+ };
117
+ const resolve_initial_api_key = (flag_key) => {
118
+ if (flag_key)
119
+ return flag_key;
120
+ const stored = (0, credentials_1.get_api_key)();
121
+ if (stored)
122
+ return stored;
123
+ return (0, auth_1.resolve_key)(undefined);
124
+ };
125
+ const prompt_api_key = async (initial) => {
126
+ if (!output_1.is_tty)
127
+ return initial;
128
+ if (initial) {
129
+ const reuse = await (0, prompts_1.confirm)({
130
+ message: `Use detected API key ${(0, auth_1.mask_key)(initial)}?`,
131
+ default: true,
132
+ });
133
+ if (reuse)
134
+ return initial;
135
+ }
136
+ process.stderr.write((0, output_1.dim)('Get your API key at: https://brightdata.com/cp/setting/users') +
137
+ '\n');
138
+ const typed = (await (0, prompts_1.password)({
139
+ message: 'Enter your Bright Data API key:',
140
+ mask: '*',
141
+ })).trim();
142
+ if (typed)
143
+ return typed;
144
+ return undefined;
145
+ };
146
+ const validate_and_save_key = async (api_key) => {
147
+ const spinner = (0, spinner_1.start)('Validating API key...');
148
+ const valid = await (0, auth_1.validate_key)(api_key);
149
+ spinner.stop();
150
+ if (!valid) {
151
+ (0, output_1.fail)('Invalid API key.\n'
152
+ + ' Check your key at https://brightdata.com/cp/setting/users');
153
+ return;
154
+ }
155
+ (0, credentials_1.save)({ api_key });
156
+ (0, output_1.success)(`Authenticated. Saved key ${(0, auth_1.mask_key)(api_key)}.`);
157
+ };
158
+ const show_summary = (authenticated, unlocker_zone, serp_zone, default_format) => {
159
+ process.stderr.write('\n');
160
+ process.stderr.write((0, output_1.green)('Setup Complete') + '\n');
161
+ process.stderr.write(` Authenticated: ${authenticated ? 'yes' : 'no'}\n`);
162
+ process.stderr.write(` Unlocker zone: ${unlocker_zone ?? '(not set)'}\n`);
163
+ process.stderr.write(` SERP zone: ${serp_zone ?? '(not set)'}\n`);
164
+ process.stderr.write(` Default format: ${default_format}\n`);
165
+ process.stderr.write('\n');
166
+ };
167
+ const show_quick_start = (unlocker_zone, serp_zone) => {
168
+ process.stderr.write((0, output_1.dim)('Quick start examples:') + '\n');
169
+ const unlocker_flag = unlocker_zone ? '' : ' --zone <unlocker_zone>';
170
+ const serp_flag = serp_zone ? '' : ' --zone <serp_zone>';
171
+ process.stderr.write(` brightdata scrape https://example.com${unlocker_flag}\n`);
172
+ process.stderr.write(` brightdata search "best proxy practices"${serp_flag}\n`);
173
+ process.stderr.write(' brightdata pipelines linkedin_person_profile '
174
+ + '"https://www.linkedin.com/in/hello-agents"\n');
175
+ };
176
+ const maybe_show_install_hint = async () => {
177
+ if (!output_1.is_tty)
178
+ return;
179
+ const show = await (0, prompts_1.confirm)({
180
+ message: 'Show global install command?',
181
+ default: false,
182
+ });
183
+ if (!show)
184
+ return;
185
+ process.stderr.write('\n');
186
+ process.stderr.write((0, output_1.yellow)('Install globally:') + '\n');
187
+ process.stderr.write(' npm install -g brightdata-cli\n\n');
188
+ };
189
+ const handle_init = async (opts) => {
190
+ print_banner();
191
+ let api_key = resolve_initial_api_key(opts.apiKey);
192
+ let authenticated = false;
193
+ let zones = [];
194
+ if (opts.skipAuth) {
195
+ (0, output_1.warn)('Skipping authentication (--skip-auth).');
196
+ }
197
+ else {
198
+ api_key = await prompt_api_key(api_key);
199
+ if (!api_key) {
200
+ (0, output_1.fail)('No API key provided.\n'
201
+ + ' Pass --api-key, run interactively, or use --skip-auth.');
202
+ return;
203
+ }
204
+ await validate_and_save_key(api_key);
205
+ authenticated = true;
206
+ zones = await fetch_active_zones(api_key);
207
+ }
208
+ const zone_names = zones
209
+ .map(zone => zone.name?.trim() ?? '')
210
+ .filter(name => name.length > 0)
211
+ .sort();
212
+ let unlocker_zone = (0, config_1.resolve)(undefined, 'BRIGHTDATA_UNLOCKER_ZONE', 'default_zone_unlocker');
213
+ let serp_zone = (0, config_1.resolve)(undefined, 'BRIGHTDATA_SERP_ZONE', 'default_zone_serp');
214
+ unlocker_zone = pick_best_zone(zone_names, unlocker_zone);
215
+ serp_zone = pick_best_zone(zone_names, serp_zone ?? unlocker_zone);
216
+ if (output_1.is_tty) {
217
+ unlocker_zone = await prompt_zone('Select default Web Unlocker zone', zone_names, unlocker_zone);
218
+ const same_serp = await (0, prompts_1.confirm)({
219
+ message: 'Use the same zone as default for SERP API?',
220
+ default: true,
221
+ });
222
+ if (same_serp)
223
+ serp_zone = unlocker_zone;
224
+ else {
225
+ serp_zone = await prompt_zone('Select default SERP zone', zone_names, serp_zone ?? unlocker_zone);
226
+ }
227
+ }
228
+ let default_format = (0, config_1.get)('default_format') ?? 'markdown';
229
+ default_format = await prompt_default_format(default_format);
230
+ if (unlocker_zone)
231
+ (0, config_1.set)('default_zone_unlocker', unlocker_zone);
232
+ if (serp_zone)
233
+ (0, config_1.set)('default_zone_serp', serp_zone);
234
+ (0, config_1.set)('default_format', default_format);
235
+ await sleep(120);
236
+ show_summary(authenticated, unlocker_zone, serp_zone, default_format);
237
+ show_quick_start(unlocker_zone, serp_zone);
238
+ await maybe_show_install_hint();
239
+ };
240
+ exports.handle_init = handle_init;
241
+ const init_command = new commander_1.Command('init')
242
+ .description('Interactive setup wizard for authentication and defaults')
243
+ .option('--skip-auth', 'Skip authentication step')
244
+ .option('-k, --api-key <key>', 'Provide API key directly')
245
+ .action(handle_init);
246
+ exports.init_command = init_command;
247
+ //# sourceMappingURL=init.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import { Command } from 'commander';
2
+ type Login_opts = {
3
+ apiKey?: string;
4
+ device?: boolean;
5
+ customerId?: string;
6
+ };
7
+ declare const handle_login: (opts: Login_opts) => Promise<void>;
8
+ declare const login_command: Command;
9
+ export { login_command, handle_login };
10
+ //# sourceMappingURL=login.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"login.d.ts","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,OAAO,EAAC,MAAM,WAAW,CAAC;AAelC,KAAK,UAAU,GAAG;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;CACvB,CAAC;AAyDF,QAAA,MAAM,YAAY,GAAS,MAAM,UAAU,kBAoC1C,CAAC;AAEF,QAAA,MAAM,aAAa,SAKM,CAAC;AAE1B,OAAO,EAAC,aAAa,EAAE,YAAY,EAAC,CAAC"}
@@ -0,0 +1,98 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.handle_login = exports.login_command = void 0;
4
+ const commander_1 = require("commander");
5
+ const credentials_1 = require("../utils/credentials");
6
+ const auth_1 = require("../utils/auth");
7
+ const config_1 = require("../utils/config");
8
+ const client_1 = require("../utils/client");
9
+ const browser_auth_1 = require("../utils/browser_auth");
10
+ const UNLOCKER_ZONE = 'cli_unlocker';
11
+ const BROWSER_ZONE = 'cli_browser';
12
+ const ensure_zones = async (api_key) => {
13
+ console.error('Checking for required zones...');
14
+ let zones = [];
15
+ try {
16
+ zones = await (0, client_1.get)(api_key, '/zone/get_active_zones');
17
+ }
18
+ catch (e) {
19
+ console.error('Warning: Could not fetch zones —', e.message);
20
+ return;
21
+ }
22
+ const has_unlocker = zones.some(z => z.name == UNLOCKER_ZONE);
23
+ const has_browser = zones.some(z => z.name == BROWSER_ZONE);
24
+ if (!has_unlocker) {
25
+ console.error(`Zone "${UNLOCKER_ZONE}" not found, creating...`);
26
+ try {
27
+ await (0, client_1.post)(api_key, '/zone', {
28
+ zone: { name: UNLOCKER_ZONE, type: 'unblocker' },
29
+ plan: { type: 'unblocker' },
30
+ });
31
+ console.error(`Zone "${UNLOCKER_ZONE}" created successfully.`);
32
+ }
33
+ catch (e) {
34
+ console.error(`Warning: Could not create zone "${UNLOCKER_ZONE}" —`, e.message);
35
+ }
36
+ }
37
+ else
38
+ console.error(`Zone "${UNLOCKER_ZONE}" already exists.`);
39
+ if (!has_browser) {
40
+ console.error(`Zone "${BROWSER_ZONE}" not found, creating...`);
41
+ try {
42
+ await (0, client_1.post)(api_key, '/zone', {
43
+ zone: { name: BROWSER_ZONE, type: 'browser_api' },
44
+ plan: { type: 'browser_api' },
45
+ });
46
+ console.error(`Zone "${BROWSER_ZONE}" created successfully.`);
47
+ }
48
+ catch (e) {
49
+ console.error(`Warning: Could not create zone "${BROWSER_ZONE}" —`, e.message);
50
+ }
51
+ }
52
+ else
53
+ console.error(`Zone "${BROWSER_ZONE}" already exists.`);
54
+ // persist unlocker zone as default if not already configured
55
+ if (!(0, config_1.get)('default_zone_unlocker'))
56
+ (0, config_1.set)('default_zone_unlocker', UNLOCKER_ZONE);
57
+ };
58
+ const resolve_customer_id = async (cli_customer_id) => {
59
+ const resolved = cli_customer_id ?? process.env['BRIGHTDATA_CUSTOMER_ID'];
60
+ return resolved?.trim() || undefined;
61
+ };
62
+ const handle_login = async (opts) => {
63
+ let api_key;
64
+ if (opts.apiKey) {
65
+ api_key = opts.apiKey.trim();
66
+ if (!api_key) {
67
+ console.error('Error: API key cannot be empty.');
68
+ process.exit(1);
69
+ }
70
+ console.error('Validating API key...');
71
+ const valid = await (0, auth_1.validate_key)(api_key);
72
+ if (!valid) {
73
+ console.error('Error: Invalid API key. Check your key at '
74
+ + 'https://brightdata.com/cp/setting/users');
75
+ process.exit(1);
76
+ }
77
+ }
78
+ else if (opts.device) {
79
+ const customer_id = await resolve_customer_id(opts.customerId);
80
+ api_key = (await (0, browser_auth_1.device_flow)({ customer_id })).trim();
81
+ }
82
+ else {
83
+ const customer_id = await resolve_customer_id(opts.customerId);
84
+ api_key = (await (0, browser_auth_1.loopback_flow)({ customer_id })).trim();
85
+ }
86
+ (0, credentials_1.save)({ api_key });
87
+ console.error(`Logged in successfully. Key: ${(0, auth_1.mask_key)(api_key)}`);
88
+ await ensure_zones(api_key);
89
+ };
90
+ exports.handle_login = handle_login;
91
+ const login_command = new commander_1.Command('login')
92
+ .description('Authenticate with Bright Data (opens browser)')
93
+ .option('-k, --api-key <key>', 'Use API key directly (skips browser)')
94
+ .option('-c, --customer-id <id>', 'Optional Bright Data account ID')
95
+ .option('-d, --device', 'Use device flow for SSH/headless environments')
96
+ .action(handle_login);
97
+ exports.login_command = login_command;
98
+ //# sourceMappingURL=login.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"login.js","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import { Command } from 'commander';
2
+ declare const handle_logout: () => void;
3
+ declare const logout_command: Command;
4
+ export { logout_command, handle_logout };
5
+ //# sourceMappingURL=logout.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logout.d.ts","sourceRoot":"","sources":["../../src/commands/logout.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,OAAO,EAAC,MAAM,WAAW,CAAC;AAGlC,QAAA,MAAM,aAAa,YASlB,CAAC;AAEF,QAAA,MAAM,cAAc,SAEM,CAAC;AAE3B,OAAO,EAAC,cAAc,EAAE,aAAa,EAAC,CAAC"}
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.handle_logout = exports.logout_command = void 0;
4
+ const commander_1 = require("commander");
5
+ const credentials_1 = require("../utils/credentials");
6
+ const handle_logout = () => {
7
+ const key = (0, credentials_1.get_api_key)();
8
+ if (!key) {
9
+ console.log('Not logged in.');
10
+ return;
11
+ }
12
+ (0, credentials_1.clear)();
13
+ console.log('Logged out. Credentials cleared.');
14
+ };
15
+ exports.handle_logout = handle_logout;
16
+ const logout_command = new commander_1.Command('logout')
17
+ .description('Clear stored Bright Data credentials')
18
+ .action(handle_logout);
19
+ exports.logout_command = logout_command;
20
+ //# sourceMappingURL=logout.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logout.js","sourceRoot":"","sources":["../../src/commands/logout.ts"],"names":[],"mappings":";;;AAAA,yCAAkC;AAClC,sDAAwD;AAExD,MAAM,aAAa,GAAG,GAAE,EAAE;IACtB,MAAM,GAAG,GAAG,IAAA,yBAAW,GAAE,CAAC;IAC1B,IAAI,CAAC,GAAG,EACR,CAAC;QACG,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;QAC9B,OAAO;IACX,CAAC;IACD,IAAA,mBAAK,GAAE,CAAC;IACR,OAAO,CAAC,GAAG,CAAC,kCAAkC,CAAC,CAAC;AACpD,CAAC,CAAC;AAMsB,sCAAa;AAJrC,MAAM,cAAc,GAAG,IAAI,mBAAO,CAAC,QAAQ,CAAC;KACvC,WAAW,CAAC,sCAAsC,CAAC;KACnD,MAAM,CAAC,aAAa,CAAC,CAAC;AAEnB,wCAAc"}
@@ -0,0 +1,6 @@
1
+ import { Command } from 'commander';
2
+ import type { Scrape_opts } from '../types/scrape';
3
+ declare const handle_scrape: (url: string, opts: Scrape_opts) => Promise<void>;
4
+ declare const scrape_command: Command;
5
+ export { scrape_command, handle_scrape };
6
+ //# sourceMappingURL=scrape.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scrape.d.ts","sourceRoot":"","sources":["../../src/commands/scrape.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,OAAO,EAAC,MAAM,WAAW,CAAC;AAMlC,OAAO,KAAK,EAKR,WAAW,EACd,MAAM,iBAAiB,CAAC;AA4BzB,QAAA,MAAM,aAAa,GAAS,KAAK,MAAM,EAAE,MAAM,WAAW,kBA0CzD,CAAC;AAEF,QAAA,MAAM,cAAc,SAcM,CAAC;AAE3B,OAAO,EAAC,cAAc,EAAE,aAAa,EAAC,CAAC"}
@@ -0,0 +1,79 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.handle_scrape = exports.scrape_command = void 0;
4
+ const commander_1 = require("commander");
5
+ const client_1 = require("../utils/client");
6
+ const auth_1 = require("../utils/auth");
7
+ const config_1 = require("../utils/config");
8
+ const spinner_1 = require("../utils/spinner");
9
+ const output_1 = require("../utils/output");
10
+ const ENDPOINT = '/request';
11
+ const build_request = (url, zone, fmt, opts) => {
12
+ const req = {
13
+ zone,
14
+ url,
15
+ format: 'raw',
16
+ };
17
+ if (fmt == 'markdown')
18
+ req.data_format = 'markdown';
19
+ else if (fmt == 'screenshot')
20
+ req.data_format = 'screenshot';
21
+ else if (fmt == 'json')
22
+ req.format = 'json';
23
+ if (opts.country)
24
+ req.country = opts.country;
25
+ if (opts.async)
26
+ req.async = true;
27
+ return req;
28
+ };
29
+ const handle_scrape = async (url, opts) => {
30
+ const api_key = (0, auth_1.ensure_authenticated)(opts.apiKey);
31
+ const zone = (0, config_1.resolve)(opts.zone, 'BRIGHTDATA_UNLOCKER_ZONE', 'default_zone_unlocker');
32
+ if (!zone) {
33
+ (0, output_1.fail)('No Web Unlocker zone specified.\n'
34
+ + ' Use --zone <name> or set BRIGHTDATA_UNLOCKER_ZONE env variable.\n'
35
+ + ' Run \'brightdata config set default_zone_unlocker <name>\' to set a default.');
36
+ return;
37
+ }
38
+ const fmt = opts.format ?? 'markdown';
39
+ const req = build_request(url, zone, fmt, opts);
40
+ const spinner = (0, spinner_1.start)(`Scraping ${url}...`);
41
+ try {
42
+ const result = await (0, client_1.post)(api_key, ENDPOINT, req, { timing: opts.timing });
43
+ spinner.stop();
44
+ if (opts.async) {
45
+ const async_res = result;
46
+ (0, output_1.success)(`Async job submitted. Response ID: ${async_res.response_id}`);
47
+ return;
48
+ }
49
+ const print_opts = { json: opts.json, pretty: opts.pretty, output: opts.output };
50
+ if (fmt == 'json') {
51
+ const json_res = result;
52
+ (0, output_1.print)(json_res, print_opts);
53
+ return;
54
+ }
55
+ (0, output_1.print)(result, print_opts);
56
+ }
57
+ catch (e) {
58
+ spinner.stop();
59
+ console.error(e.message);
60
+ process.exit(1);
61
+ }
62
+ };
63
+ exports.handle_scrape = handle_scrape;
64
+ const scrape_command = new commander_1.Command('scrape')
65
+ .description('Scrape a URL using the Web Unlocker API')
66
+ .argument('<url>', 'URL to scrape')
67
+ .option('-f, --format <format>', 'Output format: markdown, html, screenshot, json (default: markdown)')
68
+ .option('--country <code>', 'ISO country code for geo-targeting (e.g. us, de)')
69
+ .option('--zone <name>', 'Web Unlocker zone name')
70
+ .option('--mobile', 'Use mobile user agent')
71
+ .option('--async', 'Submit asynchronously and return job ID')
72
+ .option('-o, --output <path>', 'Write output to file')
73
+ .option('--json', 'Force JSON output')
74
+ .option('--pretty', 'Pretty-print JSON output')
75
+ .option('--timing', 'Show request timing')
76
+ .option('-k, --api-key <key>', 'Override API key')
77
+ .action(handle_scrape);
78
+ exports.scrape_command = scrape_command;
79
+ //# sourceMappingURL=scrape.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scrape.js","sourceRoot":"","sources":["../../src/commands/scrape.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import { Command } from 'commander';
2
+ import type { Search_opts } from '../types/search';
3
+ declare const handle_search: (query: string, opts: Search_opts) => Promise<void>;
4
+ declare const search_command: Command;
5
+ export { search_command, handle_search };
6
+ //# sourceMappingURL=search.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../../src/commands/search.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,OAAO,EAAC,MAAM,WAAW,CAAC;AAMlC,OAAO,KAAK,EAIR,WAAW,EACd,MAAM,iBAAiB,CAAC;AA+HzB,QAAA,MAAM,aAAa,GAAS,OAAO,MAAM,EAAE,MAAM,WAAW,kBA8D3D,CAAC;AAEF,QAAA,MAAM,cAAc,SAoBM,CAAC;AAE3B,OAAO,EAAC,cAAc,EAAE,aAAa,EAAC,CAAC"}