firecrawl-cli 0.0.6 ā 1.0.1-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.
- package/README.md +426 -6
- package/dist/commands/config.d.ts +13 -4
- package/dist/commands/config.d.ts.map +1 -1
- package/dist/commands/config.js +42 -53
- package/dist/commands/config.js.map +1 -1
- package/dist/commands/login.d.ts +15 -0
- package/dist/commands/login.d.ts.map +1 -0
- package/dist/commands/login.js +81 -0
- package/dist/commands/login.js.map +1 -0
- package/dist/commands/logout.d.ts +9 -0
- package/dist/commands/logout.d.ts.map +1 -0
- package/dist/commands/logout.js +33 -0
- package/dist/commands/logout.js.map +1 -0
- package/dist/commands/search.d.ts +13 -0
- package/dist/commands/search.d.ts.map +1 -0
- package/dist/commands/search.js +241 -0
- package/dist/commands/search.js.map +1 -0
- package/dist/index.js +218 -29
- package/dist/index.js.map +1 -1
- package/dist/types/search.d.ts +103 -0
- package/dist/types/search.d.ts.map +1 -0
- package/dist/types/search.js +6 -0
- package/dist/types/search.js.map +1 -0
- package/dist/utils/auth.d.ts +55 -0
- package/dist/utils/auth.d.ts.map +1 -0
- package/dist/utils/auth.js +346 -0
- package/dist/utils/auth.js.map +1 -0
- package/package.json +4 -2
|
@@ -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": "
|
|
3
|
+
"version": "1.0.1-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}": [
|