firecrawl-cli 0.0.6 → 1.0.0-beta.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,346 @@
1
+ "use strict";
2
+ /**
3
+ * Authentication utilities
4
+ * Provides automatic authentication prompts when credentials are missing
5
+ */
6
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
7
+ if (k2 === undefined) k2 = k;
8
+ var desc = Object.getOwnPropertyDescriptor(m, k);
9
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
10
+ desc = { enumerable: true, get: function() { return m[k]; } };
11
+ }
12
+ Object.defineProperty(o, k2, desc);
13
+ }) : (function(o, m, k, k2) {
14
+ if (k2 === undefined) k2 = k;
15
+ o[k2] = m[k];
16
+ }));
17
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
18
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
19
+ }) : function(o, v) {
20
+ o["default"] = v;
21
+ });
22
+ var __importStar = (this && this.__importStar) || (function () {
23
+ var ownKeys = function(o) {
24
+ ownKeys = Object.getOwnPropertyNames || function (o) {
25
+ var ar = [];
26
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
27
+ return ar;
28
+ };
29
+ return ownKeys(o);
30
+ };
31
+ return function (mod) {
32
+ if (mod && mod.__esModule) return mod;
33
+ var result = {};
34
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
35
+ __setModuleDefault(result, mod);
36
+ return result;
37
+ };
38
+ })();
39
+ Object.defineProperty(exports, "__esModule", { value: true });
40
+ exports.printBanner = printBanner;
41
+ exports.isAuthenticated = isAuthenticated;
42
+ exports.ensureAuthenticated = ensureAuthenticated;
43
+ exports.browserLogin = browserLogin;
44
+ exports.manualLogin = manualLogin;
45
+ exports.interactiveLogin = interactiveLogin;
46
+ const readline = __importStar(require("readline"));
47
+ const crypto = __importStar(require("crypto"));
48
+ const credentials_1 = require("./credentials");
49
+ const config_1 = require("./config");
50
+ const DEFAULT_API_URL = 'https://api.firecrawl.dev';
51
+ const WEB_URL = 'https://firecrawl.dev';
52
+ const AUTH_TIMEOUT_MS = 5 * 60 * 1000; // 5 minutes
53
+ const POLL_INTERVAL_MS = 2000; // 2 seconds
54
+ /**
55
+ * Prompt for input
56
+ */
57
+ function promptInput(question) {
58
+ const rl = readline.createInterface({
59
+ input: process.stdin,
60
+ output: process.stdout,
61
+ });
62
+ return new Promise((resolve) => {
63
+ rl.question(question, (answer) => {
64
+ rl.close();
65
+ resolve(answer.trim());
66
+ });
67
+ });
68
+ }
69
+ /**
70
+ * Open URL in the default browser
71
+ */
72
+ async function openBrowser(url) {
73
+ const { exec } = await Promise.resolve().then(() => __importStar(require('child_process')));
74
+ const platform = process.platform;
75
+ let command;
76
+ switch (platform) {
77
+ case 'darwin':
78
+ command = `open "${url}"`;
79
+ break;
80
+ case 'win32':
81
+ command = `start "" "${url}"`;
82
+ break;
83
+ default:
84
+ command = `xdg-open "${url}"`;
85
+ }
86
+ return new Promise((resolve, reject) => {
87
+ exec(command, (error) => {
88
+ if (error) {
89
+ reject(error);
90
+ }
91
+ else {
92
+ resolve();
93
+ }
94
+ });
95
+ });
96
+ }
97
+ /**
98
+ * Generate a secure random session ID
99
+ */
100
+ function generateSessionId() {
101
+ return crypto.randomBytes(32).toString('hex');
102
+ }
103
+ /**
104
+ * Generate a PKCE code verifier (random string, base64url encoded)
105
+ */
106
+ function generateCodeVerifier() {
107
+ return crypto.randomBytes(32).toString('base64url');
108
+ }
109
+ /**
110
+ * Generate a PKCE code challenge from the verifier (SHA256, base64url encoded)
111
+ */
112
+ function generateCodeChallenge(verifier) {
113
+ return crypto.createHash('sha256').update(verifier).digest('base64url');
114
+ }
115
+ /**
116
+ * Poll the server for authentication status using PKCE verification
117
+ * Uses POST to send the code_verifier securely (not in URL)
118
+ */
119
+ async function pollAuthStatus(sessionId, codeVerifier, webUrl) {
120
+ const statusUrl = `${webUrl}/api/auth/cli/status`;
121
+ try {
122
+ const response = await fetch(statusUrl, {
123
+ method: 'POST',
124
+ headers: {
125
+ 'Content-Type': 'application/json',
126
+ },
127
+ body: JSON.stringify({
128
+ session_id: sessionId,
129
+ code_verifier: codeVerifier,
130
+ }),
131
+ });
132
+ if (!response.ok) {
133
+ return null;
134
+ }
135
+ const data = await response.json();
136
+ if (data.status === 'complete' && data.apiKey) {
137
+ return {
138
+ apiKey: data.apiKey,
139
+ apiUrl: data.apiUrl || DEFAULT_API_URL,
140
+ teamName: data.teamName || undefined,
141
+ };
142
+ }
143
+ return null;
144
+ }
145
+ catch {
146
+ return null;
147
+ }
148
+ }
149
+ /**
150
+ * Wait for authentication with polling
151
+ */
152
+ async function waitForAuth(sessionId, codeVerifier, webUrl, timeoutMs = AUTH_TIMEOUT_MS) {
153
+ const startTime = Date.now();
154
+ let dots = 0;
155
+ return new Promise((resolve, reject) => {
156
+ const poll = async () => {
157
+ if (Date.now() - startTime > timeoutMs) {
158
+ reject(new Error('Authentication timed out. Please try again.'));
159
+ return;
160
+ }
161
+ process.stdout.write(`\rWaiting for browser authentication${'.'.repeat(dots % 4).padEnd(3)} `);
162
+ dots++;
163
+ const result = await pollAuthStatus(sessionId, codeVerifier, webUrl);
164
+ if (result) {
165
+ process.stdout.write('\r' + ' '.repeat(50) + '\r');
166
+ resolve(result);
167
+ return;
168
+ }
169
+ setTimeout(poll, POLL_INTERVAL_MS);
170
+ };
171
+ poll();
172
+ });
173
+ }
174
+ /**
175
+ * Get CLI metadata for telemetry
176
+ */
177
+ function getCliMetadata() {
178
+ // Dynamic import to avoid circular dependencies
179
+ // eslint-disable-next-line @typescript-eslint/no-var-requires
180
+ const packageJson = require('../../package.json');
181
+ return {
182
+ cli_version: packageJson.version || 'unknown',
183
+ os_platform: process.platform,
184
+ node_version: process.version,
185
+ };
186
+ }
187
+ /**
188
+ * Perform browser-based login using PKCE flow
189
+ *
190
+ * Security: Uses PKCE (Proof Key for Code Exchange) pattern:
191
+ * - session_id is passed in URL fragment (not sent to server in HTTP request)
192
+ * - code_challenge (hash of verifier) is in query string (safe to expose)
193
+ * - code_verifier is kept secret and only sent via POST when exchanging for token
194
+ */
195
+ async function browserLogin(webUrl = WEB_URL) {
196
+ const sessionId = generateSessionId();
197
+ const codeVerifier = generateCodeVerifier();
198
+ const codeChallenge = generateCodeChallenge(codeVerifier);
199
+ // Get CLI metadata for telemetry (non-sensitive)
200
+ const metadata = getCliMetadata();
201
+ const telemetryParams = new URLSearchParams({
202
+ cli_version: metadata.cli_version,
203
+ os_platform: metadata.os_platform,
204
+ node_version: metadata.node_version,
205
+ }).toString();
206
+ // code_challenge and telemetry in query (safe - not sensitive)
207
+ // session_id in fragment (not sent to server, read by JS only)
208
+ const loginUrl = `${webUrl}/cli-auth?code_challenge=${codeChallenge}&${telemetryParams}#session_id=${sessionId}`;
209
+ console.log('\nOpening browser for authentication...');
210
+ console.log(`If the browser doesn't open, visit: ${loginUrl}\n`);
211
+ try {
212
+ await openBrowser(loginUrl);
213
+ }
214
+ catch {
215
+ console.log('Could not open browser automatically. Please visit the URL above.');
216
+ }
217
+ const result = await waitForAuth(sessionId, codeVerifier, webUrl);
218
+ return {
219
+ apiKey: result.apiKey,
220
+ apiUrl: result.apiUrl || DEFAULT_API_URL,
221
+ teamName: result.teamName,
222
+ };
223
+ }
224
+ /**
225
+ * Perform manual API key login
226
+ */
227
+ async function manualLogin() {
228
+ console.log('');
229
+ const apiKey = await promptInput('Enter your Firecrawl API key: ');
230
+ if (!apiKey || apiKey.trim().length === 0) {
231
+ throw new Error('API key cannot be empty');
232
+ }
233
+ if (!apiKey.startsWith('fc-')) {
234
+ throw new Error('Invalid API key format. API keys should start with "fc-"');
235
+ }
236
+ return {
237
+ apiKey: apiKey.trim(),
238
+ apiUrl: DEFAULT_API_URL,
239
+ };
240
+ }
241
+ /**
242
+ * Use environment variable for authentication
243
+ */
244
+ function envVarLogin() {
245
+ const apiKey = process.env.FIRECRAWL_API_KEY;
246
+ if (apiKey && apiKey.length > 0) {
247
+ return {
248
+ apiKey,
249
+ apiUrl: process.env.FIRECRAWL_API_URL || DEFAULT_API_URL,
250
+ };
251
+ }
252
+ return null;
253
+ }
254
+ /**
255
+ * Print the Firecrawl CLI banner
256
+ */
257
+ function printBanner() {
258
+ const orange = '\x1b[38;5;208m';
259
+ const reset = '\x1b[0m';
260
+ const dim = '\x1b[2m';
261
+ const bold = '\x1b[1m';
262
+ // Get version from package.json
263
+ // eslint-disable-next-line @typescript-eslint/no-var-requires
264
+ const packageJson = require('../../package.json');
265
+ const version = packageJson.version || 'unknown';
266
+ console.log('');
267
+ console.log(` ${orange}šŸ”„ ${bold}firecrawl${reset} ${dim}cli${reset} ${dim}v${version}${reset}`);
268
+ console.log(` ${dim}Turn websites into LLM-ready data${reset}`);
269
+ console.log('');
270
+ }
271
+ /**
272
+ * Interactive login flow - prompts user to choose method
273
+ */
274
+ async function interactiveLogin(webUrl) {
275
+ // First check if env var is set
276
+ const envResult = envVarLogin();
277
+ if (envResult) {
278
+ printBanner();
279
+ console.log('āœ“ Using FIRECRAWL_API_KEY from environment variable\n');
280
+ return envResult;
281
+ }
282
+ printBanner();
283
+ console.log('Welcome! To get started, authenticate with your Firecrawl account.\n');
284
+ console.log(' \x1b[1m1.\x1b[0m Login with browser \x1b[2m(recommended)\x1b[0m');
285
+ console.log(' \x1b[1m2.\x1b[0m Enter API key manually');
286
+ console.log('');
287
+ printEnvHint();
288
+ const choice = await promptInput('Enter choice [1/2]: ');
289
+ if (choice === '2' || choice.toLowerCase() === 'manual') {
290
+ return manualLogin();
291
+ }
292
+ else {
293
+ return browserLogin(webUrl);
294
+ }
295
+ }
296
+ /**
297
+ * Print hint about environment variable
298
+ */
299
+ function printEnvHint() {
300
+ const dim = '\x1b[2m';
301
+ const reset = '\x1b[0m';
302
+ console.log(`${dim}Tip: You can also set FIRECRAWL_API_KEY environment variable${reset}\n`);
303
+ }
304
+ /**
305
+ * Check if user is authenticated
306
+ */
307
+ function isAuthenticated() {
308
+ const apiKey = (0, config_1.getApiKey)();
309
+ return !!apiKey && apiKey.length > 0;
310
+ }
311
+ /**
312
+ * Ensure user is authenticated before running a command
313
+ * If not authenticated, prompts for login
314
+ * Returns the API key
315
+ */
316
+ async function ensureAuthenticated() {
317
+ // Check if we already have credentials
318
+ const existingKey = (0, config_1.getApiKey)();
319
+ if (existingKey) {
320
+ return existingKey;
321
+ }
322
+ // No credentials found - prompt for login
323
+ try {
324
+ const result = await interactiveLogin();
325
+ // Save credentials
326
+ (0, credentials_1.saveCredentials)({
327
+ apiKey: result.apiKey,
328
+ apiUrl: result.apiUrl,
329
+ });
330
+ // Update global config
331
+ (0, config_1.updateConfig)({
332
+ apiKey: result.apiKey,
333
+ apiUrl: result.apiUrl,
334
+ });
335
+ console.log('\nāœ“ Login successful!');
336
+ if (result.teamName) {
337
+ console.log(` Team: ${result.teamName}`);
338
+ }
339
+ return result.apiKey;
340
+ }
341
+ catch (error) {
342
+ console.error('\nAuthentication failed:', error instanceof Error ? error.message : 'Unknown error');
343
+ process.exit(1);
344
+ }
345
+ }
346
+ //# sourceMappingURL=auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/utils/auth.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "firecrawl-cli",
3
- "version": "0.0.6",
3
+ "version": "1.0.0-beta.1",
4
4
  "description": "Command-line interface for Firecrawl. Scrape, crawl, and extract data from any website directly from your terminal.",
5
5
  "main": "dist/index.js",
6
6
  "bin": {
@@ -10,6 +10,7 @@
10
10
  "build": "tsc",
11
11
  "dev": "tsc --watch",
12
12
  "start": "node dist/index.js",
13
+ "local": "node dist/index.js",
13
14
  "clean": "rm -rf dist",
14
15
  "prepublishOnly": "pnpm run build",
15
16
  "prepare": "husky",
@@ -17,7 +18,8 @@
17
18
  "format:check": "prettier --check \"src/**/*.{ts,json}\" \"*.{json,md}\"",
18
19
  "type-check": "tsc --noEmit",
19
20
  "test:watch": "vitest",
20
- "test": "vitest run"
21
+ "test": "vitest run",
22
+ "publish-beta": "npm publish --tag beta"
21
23
  },
22
24
  "lint-staged": {
23
25
  "*.{ts,json,md}": [