@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,316 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ERROR_HTML = exports.SUCCESS_HTML = void 0;
4
+ const BASE_STYLES = `
5
+ <meta charset="utf-8" />
6
+ <meta name="viewport" content="width=device-width, initial-scale=1" />
7
+ <link rel="preconnect" href="https://fonts.googleapis.com" />
8
+ <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
9
+ <link href="https://fonts.googleapis.com/css2?family=DM+Sans:wght@400;500;600;700&family=JetBrains+Mono:wght@400;500&display=swap" rel="stylesheet" />
10
+ <style>
11
+ *, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
12
+
13
+ :root {
14
+ --bg-deep: #070b14;
15
+ --bg-surface: #111827;
16
+ --surface-card: rgba(15, 23, 42, 0.6);
17
+ --border-subtle: rgba(255, 255, 255, 0.06);
18
+ --border-default: rgba(255, 255, 255, 0.10);
19
+ --border-accent: rgba(61, 127, 252, 0.30);
20
+ --text-primary: #ffffff;
21
+ --text-secondary: rgba(255, 255, 255, 0.70);
22
+ --text-tertiary: rgba(255, 255, 255, 0.50);
23
+ --accent: #3D7FFC;
24
+ --accent-muted: rgba(61, 127, 252, 0.15);
25
+ --success: #10b981;
26
+ --success-muted: rgba(16, 185, 129, 0.15);
27
+ --error: #ef4444;
28
+ --error-muted: rgba(239, 68, 68, 0.15);
29
+ --gradient: linear-gradient(135deg, #9D97F4 0%, #3D7FFC 50%, #15C1E6 100%);
30
+ --font-sans: 'DM Sans', system-ui, sans-serif;
31
+ --font-mono: 'JetBrains Mono', monospace;
32
+ }
33
+
34
+ html, body {
35
+ min-height: 100vh;
36
+ background-color: var(--bg-deep);
37
+ color: var(--text-primary);
38
+ font-family: var(--font-sans);
39
+ }
40
+
41
+ body {
42
+ display: flex;
43
+ align-items: center;
44
+ justify-content: center;
45
+ padding: 24px;
46
+ background-image:
47
+ radial-gradient(ellipse at 50% 0%, rgba(61,127,252,0.08) 0%, transparent 55%),
48
+ radial-gradient(ellipse at 80% 80%, rgba(157,151,244,0.05) 0%, transparent 50%);
49
+ }
50
+
51
+ /* Dot-grid background */
52
+ body::before {
53
+ content: '';
54
+ position: fixed;
55
+ inset: 0;
56
+ background-image: radial-gradient(rgba(255,255,255,0.06) 1px, transparent 1px);
57
+ background-size: 28px 28px;
58
+ pointer-events: none;
59
+ z-index: 0;
60
+ }
61
+
62
+ .card {
63
+ position: relative;
64
+ z-index: 1;
65
+ width: 100%;
66
+ max-width: 420px;
67
+ background: var(--surface-card);
68
+ border: 1px solid var(--border-default);
69
+ border-radius: 20px;
70
+ padding: 40px 36px;
71
+ backdrop-filter: blur(16px);
72
+ box-shadow:
73
+ 0 20px 25px -5px rgba(0,0,0,0.5),
74
+ 0 10px 10px -5px rgba(0,0,0,0.3);
75
+ text-align: center;
76
+ }
77
+
78
+ /* Subtle shine */
79
+ .card::before {
80
+ content: '';
81
+ position: absolute;
82
+ inset: 0;
83
+ border-radius: 20px;
84
+ background: linear-gradient(135deg, rgba(255,255,255,0.04) 0%, transparent 60%);
85
+ pointer-events: none;
86
+ }
87
+
88
+ .logo {
89
+ display: flex;
90
+ flex-direction: column;
91
+ align-items: center;
92
+ gap: 10px;
93
+ margin-bottom: 32px;
94
+ }
95
+
96
+ .logo svg {
97
+ width: 180px;
98
+ height: auto;
99
+ }
100
+
101
+ .logo-cli-badge {
102
+ padding: 2px 10px;
103
+ font-size: 0.65rem;
104
+ font-weight: 600;
105
+ letter-spacing: 0.10em;
106
+ text-transform: uppercase;
107
+ color: rgba(255,255,255,0.45);
108
+ border: 1px solid var(--border-subtle);
109
+ border-radius: 9999px;
110
+ font-family: var(--font-mono);
111
+ }
112
+
113
+ .icon-ring {
114
+ width: 72px;
115
+ height: 72px;
116
+ border-radius: 50%;
117
+ display: flex;
118
+ align-items: center;
119
+ justify-content: center;
120
+ margin: 0 auto 24px;
121
+ font-size: 2rem;
122
+ }
123
+
124
+ .icon-ring.success {
125
+ background: var(--success-muted);
126
+ border: 1px solid rgba(16, 185, 129, 0.30);
127
+ box-shadow: 0 0 24px rgba(16, 185, 129, 0.20);
128
+ }
129
+
130
+ .icon-ring.error {
131
+ background: var(--error-muted);
132
+ border: 1px solid rgba(239, 68, 68, 0.30);
133
+ box-shadow: 0 0 24px rgba(239, 68, 68, 0.20);
134
+ }
135
+
136
+ h1 {
137
+ font-size: 1.5rem;
138
+ font-weight: 700;
139
+ color: var(--text-primary);
140
+ margin-bottom: 10px;
141
+ letter-spacing: -0.02em;
142
+ }
143
+
144
+ .subtitle {
145
+ font-size: 0.9rem;
146
+ color: var(--text-secondary);
147
+ line-height: 1.6;
148
+ margin-bottom: 28px;
149
+ }
150
+
151
+ .status-pill {
152
+ display: inline-flex;
153
+ align-items: center;
154
+ gap: 7px;
155
+ padding: 6px 16px;
156
+ border-radius: 9999px;
157
+ font-size: 0.8rem;
158
+ font-weight: 600;
159
+ letter-spacing: 0.02em;
160
+ margin-bottom: 28px;
161
+ }
162
+
163
+ .status-pill.success {
164
+ background: var(--success-muted);
165
+ border: 1px solid rgba(16, 185, 129, 0.30);
166
+ color: var(--success);
167
+ }
168
+
169
+ .status-pill.error {
170
+ background: var(--error-muted);
171
+ border: 1px solid rgba(239, 68, 68, 0.30);
172
+ color: var(--error);
173
+ }
174
+
175
+ .dot {
176
+ width: 7px;
177
+ height: 7px;
178
+ border-radius: 50%;
179
+ }
180
+
181
+ .dot.success { background: var(--success); }
182
+ .dot.error { background: var(--error); }
183
+
184
+ .divider {
185
+ height: 1px;
186
+ background: var(--border-subtle);
187
+ margin: 24px 0;
188
+ }
189
+
190
+ .hint {
191
+ font-size: 0.78rem;
192
+ color: var(--text-tertiary);
193
+ line-height: 1.5;
194
+ }
195
+
196
+ .error-box {
197
+ background: var(--error-muted);
198
+ border: 1px solid rgba(239, 68, 68, 0.20);
199
+ border-radius: 10px;
200
+ padding: 14px 16px;
201
+ margin-top: 20px;
202
+ text-align: left;
203
+ }
204
+
205
+ .error-box-label {
206
+ font-size: 0.7rem;
207
+ font-weight: 600;
208
+ letter-spacing: 0.08em;
209
+ text-transform: uppercase;
210
+ color: var(--error);
211
+ margin-bottom: 5px;
212
+ font-family: var(--font-mono);
213
+ }
214
+
215
+ .error-box-message {
216
+ font-size: 0.82rem;
217
+ color: rgba(255,255,255,0.70);
218
+ font-family: var(--font-mono);
219
+ word-break: break-word;
220
+ }
221
+
222
+ @keyframes fade-up {
223
+ from { opacity: 0; transform: translateY(12px); }
224
+ to { opacity: 1; transform: translateY(0); }
225
+ }
226
+
227
+ .card { animation: fade-up 0.35s ease both; }
228
+ </style>
229
+ `;
230
+ const PAGE_SHELL = (body) => `<!DOCTYPE html>
231
+ <html lang="en">
232
+ <head>${BASE_STYLES}</head>
233
+ <body>${body}</body>
234
+ </html>`;
235
+ const LOGO_HTML = `
236
+ <div class="logo">
237
+ <svg width="498" height="128" viewBox="0 0 498 128" fill="none" xmlns="http://www.w3.org/2000/svg" aria-label="Bright Data">
238
+ <path fill-rule="evenodd" clip-rule="evenodd" d="M348.347 87.0571H353.308L353.324 90.9468C352.141 91.2617 350.805 91.5767 349.23 91.9678C347.656 92.3588 346 92.5161 344.269 92.5161C343.558 92.5161 342.852 92.4401 342.298 92.3589C341.745 92.2827 341.273 92.0438 340.882 91.729C340.491 91.4142 340.176 90.9419 340.018 90.3935C339.861 89.8451 339.703 89.0578 339.703 88.1133V86.3056C338.992 87.0927 338.129 87.7984 337.185 88.5855C336.24 89.3726 335.214 89.9973 334.036 90.5508C332.853 91.0992 331.593 91.5714 330.176 91.9624C328.836 92.196 327.343 92.435 325.687 92.435L325.682 92.4399C323.239 92.4399 320.878 91.9678 318.597 91.0283C316.312 90.0838 314.347 88.5956 312.691 86.7066C310.959 84.7414 309.619 82.309 308.598 79.3994C307.572 76.4947 307.1 73.0364 307.1 69.0298C307.1 65.338 307.654 61.9612 308.756 58.8178C309.858 55.6745 311.513 52.927 313.56 50.5708C315.687 48.2146 318.207 46.4068 321.198 45.0713C324.189 43.7358 327.576 43.106 331.354 43.106C332.695 43.106 333.955 43.182 335.29 43.3394C336.55 43.4968 337.809 43.6546 338.992 43.8882V34.7271L330.806 33.4931V29.5678L348.362 27.5161L348.347 87.0571ZM330.877 47.7524C328.988 47.7525 327.256 48.0672 325.682 48.773C324.026 49.4788 322.609 50.5808 321.35 52.1499C320.09 53.719 319.146 55.7657 318.435 58.2793C317.724 60.793 317.333 63.8551 317.252 67.4707C317.175 70.6902 317.49 73.5188 318.12 75.875C318.75 78.2313 319.618 80.1152 320.715 81.6895C321.817 83.1824 323.158 84.3606 324.651 85.0664C326.149 85.6961 327.8 86.0874 329.531 86.0874L329.536 86.0771C330.638 86.0771 331.664 85.9196 332.685 85.686C333.63 85.3712 334.574 85.0565 335.361 84.6655C336.148 84.2745 336.86 83.8019 337.489 83.3296C338.119 82.8574 338.667 82.3851 339.064 81.918V50.3423C338.906 50.0275 338.51 49.7127 338.038 49.3979C337.489 49.0831 336.936 48.7682 336.148 48.5346C335.443 48.301 334.574 48.062 333.711 47.9859C332.842 47.8285 331.898 47.7524 330.877 47.7524Z" fill="#9FC0FF"/>
239
+ <path fill-rule="evenodd" clip-rule="evenodd" d="M378.573 43.0322C381.502 43.0322 383.954 43.3484 386.011 43.8992C387.991 44.5317 389.653 45.4754 390.92 46.7352C392.187 48.0765 393.059 49.7291 393.613 51.8559C394.167 53.9828 394.403 56.5024 394.403 59.5779V86.9924H399.548V91.0115C398.994 91.1696 398.363 91.3276 397.65 91.4857C396.937 91.6438 396.147 91.8019 395.357 91.96C394.567 92.1181 393.695 92.2762 392.905 92.3527C392.115 92.4292 391.243 92.5112 390.53 92.5112C389.74 92.5112 389.104 92.5111 388.473 92.4346C387.919 92.3581 387.442 92.2 387.047 91.8838C386.652 91.5676 386.416 91.1748 386.257 90.5475C386.098 89.9967 386.021 89.2059 386.021 88.1858V86.6099C385.626 86.9261 385.072 87.3953 384.282 88.1043C383.492 88.7367 382.461 89.4455 381.277 90.0729C380.092 90.7053 378.742 91.3329 377.163 91.8072C375.66 92.2815 373.998 92.5161 372.254 92.5161C370.356 92.5161 368.535 92.2815 366.791 91.7306C365.052 91.1798 363.544 90.3944 362.2 89.3693C360.856 88.2677 359.825 86.9262 359.035 85.1921C358.245 83.458 358.004 81.4889 358.004 79.1275L357.989 79.1172C357.989 77.1486 358.383 75.3378 359.096 73.7619C359.809 72.1859 360.836 70.8496 362.185 69.5847C363.528 68.4015 365.031 67.3764 366.775 66.5145C368.514 65.6474 370.417 65.0199 372.474 64.464C374.531 63.9131 376.67 63.5206 378.886 63.2809C381.102 63.0462 383.318 62.8878 385.457 62.8062V60.603C385.457 58.6343 385.298 56.9766 385.062 55.6403C384.744 54.2989 384.272 53.1972 383.636 52.3301C382.923 51.4631 382.051 50.8358 380.866 50.5196C379.758 50.1269 378.255 49.9688 376.511 49.9688C375.008 49.9688 373.505 50.1269 372.002 50.3615C370.5 50.6778 369.073 50.9939 367.647 51.3866C366.304 51.7793 365.037 52.2536 363.847 52.6463C362.662 53.1206 361.707 53.5137 360.917 53.9064H360.841L358.943 49.8873C359.497 49.413 360.369 48.7854 361.712 47.9949C363.056 47.2094 364.642 46.5007 366.463 45.7101C368.284 45.0012 370.264 44.3686 372.321 43.8177C374.454 43.2669 376.516 43.0323 378.573 43.0322ZM385.452 67.5395C382.128 67.5395 379.358 67.8557 377.065 68.4065C374.849 68.9573 373.028 69.743 371.684 70.6916C370.34 71.6352 369.392 72.742 368.838 74.0018C368.284 75.2616 367.965 76.5215 367.965 77.8629C367.966 79.3572 368.201 80.6987 368.596 81.7239C368.991 82.7489 369.545 83.6159 370.258 84.3248C370.971 84.9572 371.843 85.5083 372.792 85.743C373.9 86.0592 374.931 86.2172 376.039 86.2172L376.034 86.207C376.588 86.207 377.301 86.1304 378.091 85.9723C378.881 85.8142 379.753 85.5797 380.625 85.34C381.497 85.0238 382.364 84.7072 383.159 84.3145C384.031 83.9218 384.744 83.4475 385.452 82.9782V67.5395Z" fill="#9FC0FF"/>
240
+ <path d="M416.142 44.0442H429.225V50.0929H416.142V74.9937C416.142 77.4294 416.143 79.3932 416.219 80.809C416.301 82.2248 416.454 83.245 416.77 83.8743C417.087 84.5035 417.562 84.9755 418.195 85.1328C418.827 85.29 419.695 85.3662 420.797 85.3662H420.879C421.67 85.3662 422.089 85.2901 422.957 85.2089C423.824 85.1328 424.692 84.9753 425.483 84.8129C426.351 84.6556 427.06 84.4985 427.775 84.3411C428.484 84.1838 429.041 84.0262 429.434 83.7928H429.51L430.929 87.8778C430.296 88.3498 429.352 88.8981 428.168 89.4512C426.984 89.9992 425.718 90.4712 424.375 90.9431C423.033 91.415 422.063 91.7297 420.563 92.0443C419.062 92.3589 417.72 92.5161 416.377 92.5161H416.301C414.8 92.5161 413.534 92.3589 412.35 92.0443C411.166 91.7297 410.217 91.1813 409.349 90.3948C408.558 89.6082 407.925 88.5883 407.455 87.3299C407.062 85.9141 406.822 84.3461 406.822 82.5396V50.0978H400.82V46.3936C401.882 46.4342 402.846 46.2464 403.816 45.8506C404.827 45.3838 405.776 44.6429 406.654 43.6281C407.511 42.4356 408.277 41.0398 408.905 39.3449L411.559 32.129H416.142V44.0442Z" fill="#9FC0FF"/>
241
+ <path fill-rule="evenodd" clip-rule="evenodd" d="M457.027 43.0322C459.955 43.0322 462.408 43.3484 464.464 43.8992C466.444 44.5317 468.107 45.4754 469.374 46.7352C470.64 48.0765 471.512 49.7291 472.066 51.8559C472.62 53.9828 472.856 56.5024 472.856 59.5779V86.9924H478.001V91.0115C477.447 91.1696 476.816 91.3276 476.103 91.4857C475.39 91.6438 474.6 91.8019 473.811 91.96C473.021 92.1181 472.148 92.2762 471.359 92.3527C470.569 92.4292 469.696 92.5112 468.983 92.5112C468.194 92.5112 467.557 92.5111 466.926 92.4346C466.373 92.3581 465.896 92.2 465.501 91.8838C465.106 91.5676 464.87 91.1748 464.711 90.5475C464.552 89.9967 464.475 89.2059 464.475 88.1858V86.6099C464.08 86.9261 463.526 87.3953 462.736 88.1043C461.946 88.7367 460.915 89.4455 459.73 90.0729C458.545 90.7053 457.196 91.3329 455.616 91.8072C454.113 92.2815 452.451 92.5161 450.707 92.5161C448.809 92.5161 446.988 92.2815 445.244 91.7306C443.505 91.1798 441.997 90.3944 440.653 89.3693C439.31 88.2677 438.279 86.9262 437.489 85.1921C436.699 83.458 436.457 81.4889 436.457 79.1275L436.442 79.1172C436.442 77.1486 436.837 75.3378 437.55 73.7619C438.263 72.1859 439.289 70.8496 440.638 69.5847C441.982 68.4015 443.485 67.3764 445.229 66.5145C446.968 65.6474 448.871 65.0199 450.928 64.464C452.985 63.9131 455.124 63.5206 457.34 63.2809C459.556 63.0462 461.771 62.8878 463.91 62.8062V60.603C463.91 58.6343 463.752 56.9766 463.516 55.6403C463.198 54.2989 462.725 53.1972 462.089 52.3301C461.376 51.4631 460.504 50.8358 459.32 50.5196C458.212 50.1269 456.709 49.9688 454.965 49.9688C453.462 49.9688 451.959 50.1269 450.456 50.3615C448.953 50.6778 447.527 50.9939 446.101 51.3866C444.757 51.7793 443.49 52.2536 442.3 52.6463C441.115 53.1206 440.161 53.5137 439.371 53.9064H439.294L437.396 49.8873C437.95 49.413 438.822 48.7854 440.166 47.9949C441.51 47.2094 443.095 46.5007 444.916 45.7101C446.737 45.0012 448.717 44.3686 450.774 43.8177C452.908 43.2669 454.97 43.0323 457.027 43.0322ZM463.905 67.5395C460.581 67.5395 457.812 67.8557 455.519 68.4065C453.303 68.9573 451.482 69.743 450.138 70.6916C448.794 71.6352 447.845 72.742 447.291 74.0018C446.737 75.2616 446.419 76.5215 446.419 77.8629C446.419 79.3572 446.655 80.6987 447.05 81.7239C447.445 82.7489 447.999 83.6159 448.712 84.3248C449.425 84.9572 450.297 85.5083 451.246 85.743C452.354 86.0592 453.385 86.2172 454.493 86.2172L454.488 86.207C455.042 86.207 455.755 86.1304 456.545 85.9723C457.334 85.8142 458.207 85.5797 459.079 85.34C459.951 85.0238 460.817 84.7072 461.612 84.3145C462.484 83.9218 463.197 83.4475 463.905 82.9782V67.5395Z" fill="#9FC0FF"/>
242
+ <path fill-rule="evenodd" clip-rule="evenodd" d="M198.111 51.7752H189.565C189.892 52.6702 190.137 53.6411 190.306 54.6169C190.47 55.5927 190.552 56.7303 190.552 57.8628C190.552 60.4618 189.979 62.8183 188.91 64.9268C187.841 67.0402 186.281 68.9061 184.312 70.5291C182.338 72.0712 179.96 73.2896 177.249 74.1845C174.457 75.0794 171.501 75.4839 168.131 75.4839L168.136 75.4688C165.752 75.4688 163.538 75.3071 161.564 74.9835C161.073 75.4689 160.659 76.0403 160.331 76.6875C160.004 77.3347 159.84 78.0679 159.84 78.9629C159.84 79.9387 160.004 80.7477 160.413 81.3999C160.822 81.9662 161.4 82.4569 162.218 82.7805C163.042 83.104 164.024 83.3465 165.338 83.4324C166.652 83.5184 168.13 83.5942 169.854 83.5942H178.482C184.726 83.5942 189.324 84.6512 192.449 86.6787C195.487 88.7922 197.047 92.2 197.047 96.9124C197.047 99.754 196.305 102.434 194.745 104.79C193.267 107.146 191.211 109.093 188.583 110.802C186.036 112.425 182.998 113.725 179.627 114.619C176.257 115.514 172.728 116 169.031 116H168.949C164.842 116 161.39 115.677 158.516 114.943C155.641 114.21 153.258 113.239 151.371 112.021C149.484 110.802 148.169 109.26 147.264 107.556C146.359 105.852 145.95 103.9 145.95 101.873C145.95 100.573 146.195 99.3546 146.691 98.1361C147.182 96.9985 147.842 95.9416 148.66 94.9708C149.484 93.995 150.384 93.1862 151.535 92.4531C152.604 91.7199 153.754 91.1535 154.905 90.749C153.263 89.8541 151.949 88.8022 151.043 87.5027C150.138 86.2033 149.729 84.6611 149.729 82.8763C149.729 80.6819 150.302 78.8972 151.453 77.3551C152.603 75.8938 154.081 74.5133 155.887 73.3757C152.931 72.0763 150.793 70.2104 149.397 67.7734C148.001 65.3362 147.259 62.4944 147.259 59.2483C147.259 56.6495 147.832 54.3742 148.982 52.2658C150.133 50.1523 151.775 48.3672 153.749 46.906C155.805 45.4447 158.101 44.307 160.812 43.493C163.522 42.6789 166.397 42.2746 169.44 42.2746H169.522C176.748 42.2747 182.093 43.6546 185.622 46.4154C186.031 45.93 186.609 45.4395 187.263 44.9542C187.918 44.4688 188.741 43.9785 189.647 43.5741C190.552 43.1696 191.539 42.8409 192.603 42.5982C193.671 42.3555 194.822 42.1935 196.055 42.1935H198.111V51.7752ZM160.74 92.3617C160.168 93.014 159.589 93.8234 159.098 94.7992C158.607 95.7751 158.357 97.2362 158.357 98.94C158.357 100.887 158.602 102.515 159.098 103.815C159.589 105.114 160.413 106.251 161.4 107.06C162.387 107.874 163.701 108.522 165.18 108.846C166.658 109.25 168.381 109.412 170.355 109.412H170.437C172.16 109.412 173.889 109.25 175.613 108.846C177.254 108.441 178.819 107.869 180.128 107.06C181.443 106.246 182.512 105.195 183.249 103.976C184.072 102.758 184.481 101.296 184.481 99.6734C184.481 98.4549 184.317 97.317 184.072 96.4271C183.826 95.5322 183.33 94.8042 182.594 94.2329C181.852 93.6666 180.952 93.2568 179.719 93.0141C178.487 92.7714 176.927 92.6095 175.035 92.6095H165.916V92.6046C165.895 92.6046 162.296 92.6037 160.74 92.3617ZM168.713 47.9376C166.003 47.9376 164.034 48.8325 162.796 50.5364C161.564 52.2404 160.909 54.7584 160.909 58.2523C160.909 59.9562 161.073 61.4983 161.318 62.8836C161.564 64.264 162.06 65.4827 162.633 66.5395C163.292 67.5153 164.111 68.3245 165.18 68.8959C166.248 69.4622 167.563 69.7907 169.204 69.7907V69.7858C170.682 69.7858 171.915 69.4619 172.902 68.8906C173.889 68.3243 174.626 67.5103 175.204 66.5346C175.776 65.5587 176.109 64.3401 176.354 62.9598C176.6 61.5795 176.682 60.1181 176.682 58.6569C176.682 54.9203 176.109 52.1593 174.876 50.4553C173.643 48.7515 171.675 47.9376 168.795 47.9376H168.713Z" fill="white"/>
243
+ <path d="M275.752 44.3169L275.757 44.3223H287.985V51.3497H275.757V74.1579C275.757 76.3448 275.757 78.0652 275.833 79.3896C275.91 80.7189 276.068 81.6525 276.308 82.2817C276.543 82.9057 277.018 83.3777 277.569 83.5299C278.12 83.6821 278.911 83.8444 279.855 83.8444H279.932C280.565 83.8444 281.274 83.7683 282.06 83.6871C282.769 83.611 283.479 83.4538 284.188 83.2965C284.898 83.1392 285.531 82.9818 286.158 82.8296C286.791 82.6723 287.261 82.515 287.659 82.3627H287.74L289.71 87.2033C288.843 87.8275 287.893 88.4518 286.633 89.081C285.372 89.7051 284.107 90.253 282.611 90.801C281.111 91.349 279.615 91.7397 277.956 92.0493C276.298 92.3588 274.721 92.5161 273.067 92.5161H272.991C271.174 92.5161 269.597 92.2828 268.336 91.8109C267.075 91.3441 265.968 90.6385 265.182 89.6998C264.396 88.7611 263.839 87.6702 263.446 86.2647C263.053 84.8593 262.895 83.3726 262.895 81.5765V51.2686H257.057V46.58C257.21 46.5292 259.67 46.2704 260.645 45.8797C261.655 45.4179 262.599 44.6873 263.477 43.6777C264.334 42.4954 265.095 41.1153 265.718 39.4358L268.418 32.129H275.593L275.752 44.3169Z" fill="white"/>
244
+ <path fill-rule="evenodd" clip-rule="evenodd" d="M39.0932 47.9105C39.7252 47.2843 40.5203 46.5766 41.4683 46.0267C42.3398 45.4004 43.3695 44.8503 44.3991 44.3767C45.5102 43.9083 46.6162 43.5112 47.8853 43.2006C49.1544 42.8849 50.5001 42.7321 51.9272 42.7321C54.4604 42.7321 56.8406 43.1241 59.0578 43.9897C61.2749 44.8553 63.2574 46.1896 64.919 47.992C66.5806 49.876 67.9314 52.2283 68.9609 55.212C69.9141 58.1957 70.4647 61.7245 70.4647 66.0423C70.4647 69.7287 69.9092 73.1047 68.8032 76.3226C67.692 79.5406 66.0302 82.2087 63.8895 84.5611C61.7488 86.9134 59.1341 88.7209 56.1269 90.0549C53.0382 91.3889 49.6334 92.0968 45.7496 92.0968C43.0584 92.0968 40.6017 91.9391 38.303 91.7049C36.0859 91.4706 34.103 91.1546 32.4414 90.7625C30.78 90.3705 29.4294 90.055 28.3999 89.663C27.3704 89.2709 26.5804 89.0365 26.2592 88.7972V36.2505L20 35.232V30.3644L39.0932 27.9355V47.9105ZM46.616 50.3394C44.8729 50.3395 43.3693 50.6551 42.1002 51.2813C40.8311 51.9076 39.8014 52.6153 39.0878 53.3994V84.4743C39.4854 85.1005 40.1991 85.6505 41.3051 85.9662C42.4162 86.3582 43.7618 86.5161 45.1889 86.5162C47.09 86.5162 48.7519 86.0426 50.1025 85.0243C51.5296 84.0059 52.6356 82.6719 53.5887 80.9458C54.5367 79.2197 55.1738 77.178 55.6478 74.902C56.1218 72.626 56.3613 70.1157 56.3613 67.524C56.3613 64.9323 56.2036 62.422 55.806 60.2274C55.4084 58.1093 54.8579 56.3015 53.9863 54.8147C53.1963 53.3229 52.1668 52.2231 50.8977 51.439C49.7866 50.7313 48.2829 50.3394 46.6213 50.3394H46.616Z" fill="white"/>
245
+ <path d="M92.0713 54.3127H92.229C92.5445 53.4386 93.1754 52.3293 94.0454 50.9799C94.9155 49.6306 96.0196 48.2864 97.2864 47.0137C98.5534 45.7461 100.054 44.6369 101.713 43.7629C103.372 42.8888 105.188 42.4135 107.168 42.4135C108.038 42.4135 108.669 42.4132 109.142 42.495C109.615 42.5767 110.012 42.6536 110.328 42.7354V57.2465C110.012 57.0063 109.223 56.7713 107.957 56.5311C106.69 56.2908 105.112 56.1326 103.372 56.1326C102.426 56.1326 101.398 56.214 100.446 56.2907C99.4999 56.3725 98.5483 56.531 97.6782 56.7661C96.8083 56.9246 96.0961 57.165 95.3889 57.4001C94.6767 57.6403 94.2033 57.8753 93.8065 58.1155V84.7564L104.161 85.7888V91.2581H75.1531V85.6304L80.9485 84.8228V52.6311L74.7054 51.1487V44.4578L92.1475 42.1935L92.0713 54.3127Z" fill="white"/>
246
+ <path d="M136.88 84.7568L142.981 85.6312V91.2581H117.537V85.6312L123.716 84.8387V52.2056L118.02 50.8362V44.5754L136.88 42.1935V84.7568Z" fill="white"/>
247
+ <path d="M220.415 49.1813C221.126 48.4773 221.586 48.4265 222.772 47.6464C223.958 46.8663 225.144 46.162 226.565 45.539C227.987 44.9159 229.572 44.369 231.228 43.9029C232.89 43.5128 234.705 43.2796 236.525 43.2796C239.214 43.2796 241.505 43.6697 243.243 44.3739C244.981 45.078 246.402 46.2484 247.512 47.8086C248.621 49.3688 249.25 51.3191 249.726 53.6595C250.119 55.9999 250.36 58.8065 250.36 62.0081V84.7892L256.209 85.6451V91.1819H232.89V85.797L237.553 84.86V61.9221C237.553 60.0477 237.476 58.4114 237.235 57.0082C237.077 55.6049 236.683 54.5106 236.126 53.5735C235.574 52.6364 234.863 52.0134 233.912 51.6233C232.961 51.2332 231.698 51 230.195 51C229.326 51 228.457 51.076 227.506 51.3141C226.555 51.5471 225.686 51.7804 224.899 52.0185C224.03 52.3326 223.237 52.6416 222.526 53.0317C221.816 53.4217 221.182 53.8116 220.63 54.2017V84.865L226.32 85.7213V91.2581H202.602V91.1819H202.608V85.6451L207.746 84.7892V36.1522L201.503 35.139V30.3013L220.415 27.9355V49.1813Z" fill="white"/>
248
+ <path d="M128.874 12C127.226 15.1881 132.986 19.8202 134.335 21.1627C135.268 19.6373 136.122 18.6832 136.895 18.3002C135.613 20.8221 137.012 23.1153 137.358 25.4034C138.056 30.2136 135.379 34.5663 130.732 35.5985C127.363 36.285 124.111 35.9443 121.785 33.1934C119.459 30.5595 119.113 27.468 120.391 24.2596C121.205 22.3121 121.785 20.4814 120.625 18.3051L120.62 18.3002C122.131 18.8747 122.828 19.7899 123.526 21.0509C124.686 20.3645 125.266 19.3324 125.5 18.1884C125.734 17.0392 125.969 15.8949 126.315 14.7508C126.783 13.6017 127.48 12.6864 128.874 12Z" fill="white"/>
249
+ </svg>
250
+ <span class="logo-cli-badge">CLI</span>
251
+ </div>
252
+ `;
253
+ exports.SUCCESS_HTML = PAGE_SHELL(`
254
+ <div class="card">
255
+ ${LOGO_HTML}
256
+ <div class="icon-ring success">✓</div>
257
+ <div class="status-pill success">
258
+ <span class="dot success"></span>
259
+ Authentication successful
260
+ </div>
261
+ <h1>You're logged in</h1>
262
+ <p class="subtitle">
263
+ Your API key has been saved. You can close this tab<br />
264
+ and return to the terminal.
265
+ </p>
266
+ <div class="divider"></div>
267
+ <p class="hint">
268
+ Bright Data CLI is now configured and ready to use.<br />
269
+ Run <code style="font-family:var(--font-mono);color:rgba(255,255,255,0.8)">brightdata --help</code> to get started.
270
+ </p>
271
+ <p class="hint" style="margin-top:12px">
272
+ This tab will close automatically in <span id="countdown" style="color:rgba(255,255,255,0.7);font-family:var(--font-mono)">10</span>s
273
+ </p>
274
+ </div>
275
+ <script>
276
+ (function() {
277
+ var remaining = 10;
278
+ var el = document.getElementById('countdown');
279
+ var iv = setInterval(function() {
280
+ remaining -= 1;
281
+ if (el) el.textContent = remaining;
282
+ if (remaining <= 0) {
283
+ clearInterval(iv);
284
+ window.close();
285
+ }
286
+ }, 1000);
287
+ })();
288
+ </script>
289
+ `);
290
+ const ERROR_HTML = (message) => PAGE_SHELL(`
291
+ <div class="card">
292
+ ${LOGO_HTML}
293
+ <div class="icon-ring error">✕</div>
294
+ <div class="status-pill error">
295
+ <span class="dot error"></span>
296
+ Authentication failed
297
+ </div>
298
+ <h1>Something went wrong</h1>
299
+ <p class="subtitle">
300
+ The login flow could not be completed.<br />
301
+ Please close this tab and try again.
302
+ </p>
303
+ <div class="error-box">
304
+ <div class="error-box-label">Error details</div>
305
+ <div class="error-box-message">${message}</div>
306
+ </div>
307
+ <div class="divider"></div>
308
+ <p class="hint">
309
+ If this keeps happening, try
310
+ <code style="font-family:var(--font-mono);color:rgba(255,255,255,0.8)">brightdata login --api-key &lt;key&gt;</code>
311
+ to authenticate manually.
312
+ </p>
313
+ </div>
314
+ `);
315
+ exports.ERROR_HTML = ERROR_HTML;
316
+ //# sourceMappingURL=auth_pages.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth_pages.js","sourceRoot":"","sources":["../../src/utils/auth_pages.ts"],"names":[],"mappings":";;;AAAA,MAAM,WAAW,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAiOnB,CAAC;AAEF,MAAM,UAAU,GAAG,CAAC,IAAY,EAAU,EAAE,CAAC;;QAErC,WAAW;QACX,IAAI;QACJ,CAAC;AAET,MAAM,SAAS,GAAG;;;;;;;;;;;;;;;;;CAiBjB,CAAC;AAEW,QAAA,YAAY,GAAW,UAAU,CAAC;;MAEzC,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAkCd,CAAC,CAAC;AAEI,MAAM,UAAU,GAAG,CAAC,OAAe,EAAU,EAAE,CAAC,UAAU,CAAC;;MAE5D,SAAS;;;;;;;;;;;;;uCAawB,OAAO;;;;;;;;;CAS7C,CAAC,CAAC;AAxBU,QAAA,UAAU,cAwBpB"}
@@ -0,0 +1,21 @@
1
+ type Browser_auth_opts = {
2
+ customer_id?: string;
3
+ };
4
+ type Json_value = string | number | boolean | null | Json_value[] | {
5
+ [key: string]: Json_value;
6
+ };
7
+ type Json_object = {
8
+ [key: string]: Json_value;
9
+ };
10
+ type Authorize_url_opts = {
11
+ redirect_uri: string;
12
+ state: string;
13
+ code_challenge: string;
14
+ customer_id?: string;
15
+ };
16
+ declare const build_authorize_url: (opts: Authorize_url_opts) => URL;
17
+ declare const build_device_start_body: (customer_id: string | undefined) => Json_object;
18
+ declare function loopback_flow(opts: Browser_auth_opts): Promise<string>;
19
+ declare function device_flow(opts: Browser_auth_opts): Promise<string>;
20
+ export { loopback_flow, device_flow, build_authorize_url, build_device_start_body };
21
+ //# sourceMappingURL=browser_auth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"browser_auth.d.ts","sourceRoot":"","sources":["../../src/utils/browser_auth.ts"],"names":[],"mappings":"AAUA,KAAK,iBAAiB,GAAG;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;CACxB,CAAC;AAEF,KAAK,UAAU,GACT,MAAM,GACN,MAAM,GACN,OAAO,GACP,IAAI,GACJ,UAAU,EAAE,GACZ;IAAC,CAAC,GAAG,EAAE,MAAM,GAAG,UAAU,CAAA;CAAC,CAAC;AAElC,KAAK,WAAW,GAAG;IAAC,CAAC,GAAG,EAAE,MAAM,GAAG,UAAU,CAAA;CAAC,CAAC;AAuF/C,KAAK,kBAAkB,GAAG;IACtB,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC;CACxB,CAAC;AAEF,QAAA,MAAM,mBAAmB,GAAI,MAAM,kBAAkB,KAAG,GAUvD,CAAC;AAEF,QAAA,MAAM,uBAAuB,GACzB,aAAa,MAAM,GAAC,SAAS,KAC9B,WAKF,CAAC;AAgGF,iBAAe,aAAa,CAAC,IAAI,EAAE,iBAAiB,GAAG,OAAO,CAAC,MAAM,CAAC,CAkHrE;AAED,iBAAe,WAAW,CAAC,IAAI,EAAE,iBAAiB,GAAG,OAAO,CAAC,MAAM,CAAC,CAiEnE;AAED,OAAO,EAAC,aAAa,EAAE,WAAW,EAAE,mBAAmB,EAAE,uBAAuB,EAAC,CAAC"}
@@ -0,0 +1,290 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.build_device_start_body = exports.build_authorize_url = void 0;
7
+ exports.loopback_flow = loopback_flow;
8
+ exports.device_flow = device_flow;
9
+ const http_1 = __importDefault(require("http"));
10
+ const crypto_1 = __importDefault(require("crypto"));
11
+ const auth_pages_1 = require("./auth_pages");
12
+ const BASE = process.env.BD_BASE || 'https://brightdata.com/users';
13
+ const AUTHORIZE_URL = `${BASE}/auth/cli/authorize`;
14
+ const TOKEN_URL = `${BASE}/auth/cli/token`;
15
+ const DEVICE_START = `${BASE}/auth/cli/device/start`;
16
+ const DEVICE_TOKEN = `${BASE}/auth/cli/device/token`;
17
+ const sleep = (ms) => new Promise(resolve => setTimeout(resolve, ms));
18
+ const base64url = (buf) => Buffer.from(buf).toString('base64')
19
+ .replace(/\+/g, '-')
20
+ .replace(/\//g, '_')
21
+ .replace(/=+$/g, '');
22
+ const random_b64url = (bytes = 32) => base64url(crypto_1.default.randomBytes(bytes));
23
+ const sha256_b64url = (input) => base64url(crypto_1.default.createHash('sha256').update(input).digest());
24
+ const once = (fn) => {
25
+ let called = false;
26
+ return ((...args) => {
27
+ if (called)
28
+ return;
29
+ called = true;
30
+ fn(...args);
31
+ });
32
+ };
33
+ let open_promise;
34
+ const load_open = () => {
35
+ if (!open_promise) {
36
+ const dynamic_import = new Function('specifier', 'return import(specifier);');
37
+ open_promise = dynamic_import('open').then(mod => mod.default);
38
+ }
39
+ return open_promise;
40
+ };
41
+ const format_remote_error = (fallback, payload) => {
42
+ if (!payload)
43
+ return fallback;
44
+ const error = typeof payload.error == 'string' ? payload.error : undefined;
45
+ const desc = typeof payload.error_description == 'string'
46
+ ? payload.error_description
47
+ : undefined;
48
+ if (error && desc)
49
+ return `${fallback}: ${error} ${desc}`;
50
+ if (error)
51
+ return `${fallback}: ${error}`;
52
+ if (desc)
53
+ return `${fallback}: ${desc}`;
54
+ return fallback;
55
+ };
56
+ const normalize_customer_id = (customer_id) => {
57
+ return customer_id?.trim() || undefined;
58
+ };
59
+ const build_authorize_url = (opts) => {
60
+ const authorize_url = new URL(AUTHORIZE_URL);
61
+ authorize_url.searchParams.set('redirect_uri', opts.redirect_uri);
62
+ authorize_url.searchParams.set('state', opts.state);
63
+ authorize_url.searchParams.set('code_challenge', opts.code_challenge);
64
+ authorize_url.searchParams.set('code_challenge_method', 'S256');
65
+ const customer_id = normalize_customer_id(opts.customer_id);
66
+ if (customer_id)
67
+ authorize_url.searchParams.set('customer_id', customer_id);
68
+ return authorize_url;
69
+ };
70
+ exports.build_authorize_url = build_authorize_url;
71
+ const build_device_start_body = (customer_id) => {
72
+ const normalized = normalize_customer_id(customer_id);
73
+ if (!normalized)
74
+ return {};
75
+ return { customer_id: normalized };
76
+ };
77
+ exports.build_device_start_body = build_device_start_body;
78
+ const read_json = async (res) => {
79
+ const text = await res.text();
80
+ if (!text)
81
+ return undefined;
82
+ try {
83
+ const parsed = JSON.parse(text);
84
+ if (parsed && typeof parsed == 'object' && !Array.isArray(parsed))
85
+ return parsed;
86
+ }
87
+ catch (_e) { }
88
+ return { raw: text };
89
+ };
90
+ const post_json = async (url, body) => {
91
+ const res = await fetch(url, {
92
+ method: 'POST',
93
+ headers: { 'content-type': 'application/json', 'User-Agent': 'brightdata-cli' },
94
+ body: JSON.stringify(body),
95
+ redirect: 'manual',
96
+ });
97
+ return { status: res.status, json: await read_json(res) };
98
+ };
99
+ const ensure_api_key = (payload, context) => {
100
+ const api_key = payload?.api_key;
101
+ if (typeof api_key == 'string' && api_key.trim())
102
+ return api_key;
103
+ throw new Error(format_remote_error(`${context}: missing api_key in response`, payload));
104
+ };
105
+ const open_browser = async (url) => {
106
+ try {
107
+ const open = await load_open();
108
+ await open(url, { wait: false });
109
+ }
110
+ catch (_e) {
111
+ console.error('Could not open a browser automatically.');
112
+ console.error(`Open this URL manually:\n${url}`);
113
+ }
114
+ };
115
+ const close_server = async (server) => {
116
+ if (!server.listening)
117
+ return;
118
+ await new Promise((resolve, reject) => {
119
+ server.close(err => err ? reject(err) : resolve());
120
+ });
121
+ };
122
+ const listen = async (server) => {
123
+ await new Promise((resolve, reject) => {
124
+ const on_error = (err) => {
125
+ server.off('listening', on_listening);
126
+ reject(err);
127
+ };
128
+ const on_listening = () => {
129
+ server.off('error', on_error);
130
+ resolve();
131
+ };
132
+ server.once('error', on_error);
133
+ server.once('listening', on_listening);
134
+ server.listen(0, '127.0.0.1');
135
+ });
136
+ const address = server.address();
137
+ if (!address || typeof address == 'string')
138
+ throw new Error('Failed to determine loopback port');
139
+ return address.port;
140
+ };
141
+ const send_html = (res, status, html) => {
142
+ res.writeHead(status, { 'content-type': 'text/html; charset=utf-8' });
143
+ res.end(html);
144
+ };
145
+ const send_text = (res, status, text) => {
146
+ res.writeHead(status, { 'content-type': 'text/plain; charset=utf-8' });
147
+ res.end(text);
148
+ };
149
+ async function loopback_flow(opts) {
150
+ const customer_id = normalize_customer_id(opts.customer_id);
151
+ const state = random_b64url(24);
152
+ const code_verifier = random_b64url(32);
153
+ const code_challenge = sha256_b64url(code_verifier);
154
+ let resolve_code;
155
+ let reject_code;
156
+ const code_promise = new Promise((resolve, reject) => {
157
+ resolve_code = resolve;
158
+ reject_code = reject;
159
+ });
160
+ const server = http_1.default.createServer();
161
+ const finish = once((error, code) => {
162
+ void close_server(server).catch(() => undefined);
163
+ if (error)
164
+ reject_code?.(error);
165
+ else if (code)
166
+ resolve_code?.(code);
167
+ else
168
+ reject_code?.(new Error('Authorization flow finished without a code'));
169
+ });
170
+ server.on('request', (req, res) => {
171
+ try {
172
+ const req_url = new URL(req.url ?? '/', 'http://127.0.0.1');
173
+ if (req_url.pathname != '/callback') {
174
+ send_text(res, 404, 'Not found');
175
+ return;
176
+ }
177
+ const error = req_url.searchParams.get('error');
178
+ const error_description = req_url.searchParams.get('error_description');
179
+ const code = req_url.searchParams.get('code');
180
+ const returned_state = req_url.searchParams.get('state');
181
+ if (error) {
182
+ const message = error_description
183
+ ? `${error} ${error_description}`
184
+ : error;
185
+ send_html(res, 200, (0, auth_pages_1.ERROR_HTML)(message));
186
+ finish(new Error(`Authorization failed: ${message}`));
187
+ return;
188
+ }
189
+ if (!code) {
190
+ send_html(res, 400, (0, auth_pages_1.ERROR_HTML)('Missing "code" in callback'));
191
+ finish(new Error('Missing "code" in callback'));
192
+ return;
193
+ }
194
+ if (!returned_state) {
195
+ send_html(res, 400, (0, auth_pages_1.ERROR_HTML)('Missing "state" in callback'));
196
+ finish(new Error('Missing "state" in callback'));
197
+ return;
198
+ }
199
+ if (returned_state != state) {
200
+ send_html(res, 400, (0, auth_pages_1.ERROR_HTML)('State mismatch'));
201
+ finish(new Error('State mismatch'));
202
+ return;
203
+ }
204
+ send_html(res, 200, auth_pages_1.SUCCESS_HTML);
205
+ finish(undefined, code);
206
+ }
207
+ catch (e) {
208
+ try {
209
+ send_text(res, 500, 'Internal error');
210
+ }
211
+ catch (_ignored) { }
212
+ finish(e);
213
+ }
214
+ });
215
+ const port = await listen(server);
216
+ const redirect_uri = `http://127.0.0.1:${port}/callback`;
217
+ const authorize_url = build_authorize_url({
218
+ redirect_uri,
219
+ state,
220
+ code_challenge,
221
+ customer_id,
222
+ });
223
+ console.error('Opening browser for Bright Data authentication...');
224
+ console.error(`If it does not open, visit:\n${authorize_url.toString()}`);
225
+ await open_browser(authorize_url.toString());
226
+ const timeout = setTimeout(() => {
227
+ finish(new Error('Timed out waiting for callback'));
228
+ }, 2 * 60 * 1000);
229
+ timeout.unref();
230
+ try {
231
+ const code = await code_promise;
232
+ const { status, json } = await post_json(TOKEN_URL, {
233
+ code,
234
+ code_verifier,
235
+ redirect_uri,
236
+ });
237
+ if (status >= 400) {
238
+ throw new Error(format_remote_error(`Token exchange failed (HTTP ${status})`, json));
239
+ }
240
+ return ensure_api_key(json, 'Token exchange failed');
241
+ }
242
+ finally {
243
+ clearTimeout(timeout);
244
+ await close_server(server).catch(() => undefined);
245
+ }
246
+ }
247
+ async function device_flow(opts) {
248
+ const { status, json } = await post_json(DEVICE_START, build_device_start_body(opts.customer_id));
249
+ if (status >= 400) {
250
+ throw new Error(format_remote_error(`Device flow start failed (HTTP ${status})`, json));
251
+ }
252
+ const device_code = json?.device_code;
253
+ const user_code = json?.user_code;
254
+ const verification_uri = json?.verification_uri;
255
+ if (typeof device_code != 'string' || !device_code)
256
+ throw new Error('Device flow start failed: missing device_code');
257
+ if (typeof user_code != 'string' || !user_code)
258
+ throw new Error('Device flow start failed: missing user_code');
259
+ if (typeof verification_uri != 'string' || !verification_uri) {
260
+ throw new Error('Device flow start failed: missing verification_uri');
261
+ }
262
+ let interval_seconds = typeof json?.interval == 'number' && json.interval > 0
263
+ ? json.interval
264
+ : 5;
265
+ const expires_in = typeof json?.expires_in == 'number' && json.expires_in > 0
266
+ ? json.expires_in
267
+ : 15 * 60;
268
+ const deadline = Date.now() + expires_in * 1000;
269
+ console.error('Approve login in your browser:');
270
+ console.error(` Code: ${user_code}`);
271
+ console.error(` URL: ${verification_uri}`);
272
+ while (Date.now() < deadline) {
273
+ await sleep(interval_seconds * 1000);
274
+ const response = await post_json(DEVICE_TOKEN, {
275
+ device_code,
276
+ });
277
+ if (response.status < 400)
278
+ return ensure_api_key(response.json, 'Device flow failed');
279
+ const error = response.json?.error;
280
+ if (error == 'authorization_pending')
281
+ continue;
282
+ if (error == 'slow_down') {
283
+ interval_seconds += 5;
284
+ continue;
285
+ }
286
+ throw new Error(format_remote_error(`Device flow failed (HTTP ${response.status})`, response.json));
287
+ }
288
+ throw new Error('Timed out waiting for approval');
289
+ }
290
+ //# sourceMappingURL=browser_auth.js.map