firecrawl-cli 1.0.1-beta.1 → 1.0.1-beta.3

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 (40) hide show
  1. package/README.md +1 -2
  2. package/dist/__tests__/commands/search.test.d.ts +5 -0
  3. package/dist/__tests__/commands/search.test.d.ts.map +1 -0
  4. package/dist/__tests__/commands/search.test.js +542 -0
  5. package/dist/__tests__/commands/search.test.js.map +1 -0
  6. package/dist/__tests__/utils/auth.test.d.ts +5 -0
  7. package/dist/__tests__/utils/auth.test.d.ts.map +1 -0
  8. package/dist/__tests__/utils/auth.test.js +119 -0
  9. package/dist/__tests__/utils/auth.test.js.map +1 -0
  10. package/dist/__tests__/utils/credentials.test.d.ts +5 -0
  11. package/dist/__tests__/utils/credentials.test.d.ts.map +1 -0
  12. package/dist/__tests__/utils/credentials.test.js +189 -0
  13. package/dist/__tests__/utils/credentials.test.js.map +1 -0
  14. package/dist/__tests__/utils/options.test.d.ts +5 -0
  15. package/dist/__tests__/utils/options.test.d.ts.map +1 -0
  16. package/dist/__tests__/utils/options.test.js +266 -0
  17. package/dist/__tests__/utils/options.test.js.map +1 -0
  18. package/dist/__tests__/utils/output.test.d.ts +5 -0
  19. package/dist/__tests__/utils/output.test.d.ts.map +1 -0
  20. package/dist/__tests__/utils/output.test.js +335 -0
  21. package/dist/__tests__/utils/output.test.js.map +1 -0
  22. package/dist/__tests__/utils/url.test.d.ts +5 -0
  23. package/dist/__tests__/utils/url.test.d.ts.map +1 -0
  24. package/dist/__tests__/utils/url.test.js +118 -0
  25. package/dist/__tests__/utils/url.test.js.map +1 -0
  26. package/dist/commands/scrape.d.ts.map +1 -1
  27. package/dist/commands/scrape.js +1 -1
  28. package/dist/commands/scrape.js.map +1 -1
  29. package/dist/index.js +48 -7
  30. package/dist/index.js.map +1 -1
  31. package/dist/types/scrape.d.ts +2 -0
  32. package/dist/types/scrape.d.ts.map +1 -1
  33. package/dist/utils/options.d.ts.map +1 -1
  34. package/dist/utils/options.js +1 -0
  35. package/dist/utils/options.js.map +1 -1
  36. package/dist/utils/output.d.ts +2 -1
  37. package/dist/utils/output.d.ts.map +1 -1
  38. package/dist/utils/output.js +65 -1
  39. package/dist/utils/output.js.map +1 -1
  40. package/package.json +1 -1
@@ -0,0 +1,335 @@
1
+ "use strict";
2
+ /**
3
+ * Tests for output utilities
4
+ */
5
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
6
+ if (k2 === undefined) k2 = k;
7
+ var desc = Object.getOwnPropertyDescriptor(m, k);
8
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
9
+ desc = { enumerable: true, get: function() { return m[k]; } };
10
+ }
11
+ Object.defineProperty(o, k2, desc);
12
+ }) : (function(o, m, k, k2) {
13
+ if (k2 === undefined) k2 = k;
14
+ o[k2] = m[k];
15
+ }));
16
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
17
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
18
+ }) : function(o, v) {
19
+ o["default"] = v;
20
+ });
21
+ var __importStar = (this && this.__importStar) || (function () {
22
+ var ownKeys = function(o) {
23
+ ownKeys = Object.getOwnPropertyNames || function (o) {
24
+ var ar = [];
25
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
26
+ return ar;
27
+ };
28
+ return ownKeys(o);
29
+ };
30
+ return function (mod) {
31
+ if (mod && mod.__esModule) return mod;
32
+ var result = {};
33
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
34
+ __setModuleDefault(result, mod);
35
+ return result;
36
+ };
37
+ })();
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ const vitest_1 = require("vitest");
40
+ const fs = __importStar(require("fs"));
41
+ const output_1 = require("../../utils/output");
42
+ // Mock fs module
43
+ vitest_1.vi.mock('fs', () => ({
44
+ existsSync: vitest_1.vi.fn(),
45
+ writeFileSync: vitest_1.vi.fn(),
46
+ mkdirSync: vitest_1.vi.fn(),
47
+ }));
48
+ (0, vitest_1.describe)('Output Utilities', () => {
49
+ let consoleErrorSpy;
50
+ let processExitSpy;
51
+ let stdoutWriteSpy;
52
+ (0, vitest_1.beforeEach)(() => {
53
+ vitest_1.vi.clearAllMocks();
54
+ consoleErrorSpy = vitest_1.vi.spyOn(console, 'error').mockImplementation(() => { });
55
+ processExitSpy = vitest_1.vi
56
+ .spyOn(process, 'exit')
57
+ .mockImplementation(() => undefined);
58
+ stdoutWriteSpy = vitest_1.vi
59
+ .spyOn(process.stdout, 'write')
60
+ .mockImplementation(() => true);
61
+ });
62
+ (0, vitest_1.afterEach)(() => {
63
+ vitest_1.vi.restoreAllMocks();
64
+ });
65
+ (0, vitest_1.describe)('writeOutput', () => {
66
+ (0, vitest_1.it)('should write content to stdout when no output path is provided', () => {
67
+ (0, output_1.writeOutput)('Test content');
68
+ (0, vitest_1.expect)(stdoutWriteSpy).toHaveBeenCalledWith('Test content\n');
69
+ });
70
+ (0, vitest_1.it)('should add newline to content if not present', () => {
71
+ (0, output_1.writeOutput)('Test content without newline');
72
+ (0, vitest_1.expect)(stdoutWriteSpy).toHaveBeenCalledWith('Test content without newline\n');
73
+ });
74
+ (0, vitest_1.it)('should not add extra newline if content already ends with newline', () => {
75
+ (0, output_1.writeOutput)('Test content with newline\n');
76
+ (0, vitest_1.expect)(stdoutWriteSpy).toHaveBeenCalledWith('Test content with newline\n');
77
+ });
78
+ (0, vitest_1.it)('should write content to file when output path is provided', () => {
79
+ vitest_1.vi.mocked(fs.existsSync).mockReturnValue(true);
80
+ (0, output_1.writeOutput)('Test content', '/output/test.txt');
81
+ (0, vitest_1.expect)(fs.writeFileSync).toHaveBeenCalledWith('/output/test.txt', 'Test content', 'utf-8');
82
+ });
83
+ (0, vitest_1.it)('should create directory if it does not exist', () => {
84
+ vitest_1.vi.mocked(fs.existsSync).mockReturnValue(false);
85
+ (0, output_1.writeOutput)('Test content', '/output/subdir/test.txt');
86
+ (0, vitest_1.expect)(fs.mkdirSync).toHaveBeenCalledWith('/output/subdir', {
87
+ recursive: true,
88
+ });
89
+ (0, vitest_1.expect)(fs.writeFileSync).toHaveBeenCalledWith('/output/subdir/test.txt', 'Test content', 'utf-8');
90
+ });
91
+ (0, vitest_1.it)('should print file confirmation when not silent', () => {
92
+ vitest_1.vi.mocked(fs.existsSync).mockReturnValue(true);
93
+ (0, output_1.writeOutput)('Test content', '/output/test.txt', false);
94
+ (0, vitest_1.expect)(consoleErrorSpy).toHaveBeenCalledWith('Output written to: /output/test.txt');
95
+ });
96
+ (0, vitest_1.it)('should not print file confirmation when silent', () => {
97
+ vitest_1.vi.mocked(fs.existsSync).mockReturnValue(true);
98
+ (0, output_1.writeOutput)('Test content', '/output/test.txt', true);
99
+ (0, vitest_1.expect)(consoleErrorSpy).not.toHaveBeenCalled();
100
+ });
101
+ });
102
+ (0, vitest_1.describe)('handleScrapeOutput', () => {
103
+ (0, vitest_1.it)('should output error and exit when result is not successful', () => {
104
+ (0, output_1.handleScrapeOutput)({ success: false, error: 'API Error' }, ['markdown']);
105
+ (0, vitest_1.expect)(consoleErrorSpy).toHaveBeenCalledWith('Error:', 'API Error');
106
+ (0, vitest_1.expect)(processExitSpy).toHaveBeenCalledWith(1);
107
+ });
108
+ (0, vitest_1.it)('should output raw markdown for single markdown format', () => {
109
+ vitest_1.vi.mocked(fs.existsSync).mockReturnValue(true);
110
+ (0, output_1.handleScrapeOutput)({
111
+ success: true,
112
+ data: { markdown: '# Test Content\n\nParagraph here.' },
113
+ }, ['markdown']);
114
+ (0, vitest_1.expect)(stdoutWriteSpy).toHaveBeenCalledWith('# Test Content\n\nParagraph here.\n');
115
+ });
116
+ (0, vitest_1.it)('should output raw HTML for single html format', () => {
117
+ vitest_1.vi.mocked(fs.existsSync).mockReturnValue(true);
118
+ (0, output_1.handleScrapeOutput)({
119
+ success: true,
120
+ data: { html: '<html><body>Test</body></html>' },
121
+ }, ['html']);
122
+ (0, vitest_1.expect)(stdoutWriteSpy).toHaveBeenCalledWith('<html><body>Test</body></html>\n');
123
+ });
124
+ (0, vitest_1.it)('should output raw HTML for single rawHtml format', () => {
125
+ vitest_1.vi.mocked(fs.existsSync).mockReturnValue(true);
126
+ (0, output_1.handleScrapeOutput)({
127
+ success: true,
128
+ data: { rawHtml: '<!DOCTYPE html><html><body>Raw</body></html>' },
129
+ }, ['rawHtml']);
130
+ (0, vitest_1.expect)(stdoutWriteSpy).toHaveBeenCalledWith('<!DOCTYPE html><html><body>Raw</body></html>\n');
131
+ });
132
+ (0, vitest_1.it)('should output newline-separated links for single links format', () => {
133
+ vitest_1.vi.mocked(fs.existsSync).mockReturnValue(true);
134
+ (0, output_1.handleScrapeOutput)({
135
+ success: true,
136
+ data: {
137
+ links: [
138
+ 'https://example.com/1',
139
+ 'https://example.com/2',
140
+ 'https://example.com/3',
141
+ ],
142
+ },
143
+ }, ['links']);
144
+ (0, vitest_1.expect)(stdoutWriteSpy).toHaveBeenCalledWith('https://example.com/1\nhttps://example.com/2\nhttps://example.com/3\n');
145
+ });
146
+ (0, vitest_1.it)('should output newline-separated images for single images format', () => {
147
+ vitest_1.vi.mocked(fs.existsSync).mockReturnValue(true);
148
+ (0, output_1.handleScrapeOutput)({
149
+ success: true,
150
+ data: {
151
+ images: [
152
+ 'https://example.com/img1.jpg',
153
+ 'https://example.com/img2.png',
154
+ ],
155
+ },
156
+ }, ['images']);
157
+ (0, vitest_1.expect)(stdoutWriteSpy).toHaveBeenCalledWith('https://example.com/img1.jpg\nhttps://example.com/img2.png\n');
158
+ });
159
+ (0, vitest_1.it)('should output summary for single summary format', () => {
160
+ vitest_1.vi.mocked(fs.existsSync).mockReturnValue(true);
161
+ (0, output_1.handleScrapeOutput)({
162
+ success: true,
163
+ data: { summary: 'This is a summary of the page content.' },
164
+ }, ['summary']);
165
+ (0, vitest_1.expect)(stdoutWriteSpy).toHaveBeenCalledWith('This is a summary of the page content.\n');
166
+ });
167
+ (0, vitest_1.it)('should output formatted screenshot info for single screenshot format', () => {
168
+ vitest_1.vi.mocked(fs.existsSync).mockReturnValue(true);
169
+ (0, output_1.handleScrapeOutput)({
170
+ success: true,
171
+ data: {
172
+ screenshot: 'https://example.com/screenshot.png',
173
+ metadata: {
174
+ title: 'Test Page',
175
+ sourceURL: 'https://example.com',
176
+ description: 'A test page',
177
+ },
178
+ },
179
+ }, ['screenshot']);
180
+ (0, vitest_1.expect)(stdoutWriteSpy).toHaveBeenCalledWith(vitest_1.expect.stringContaining('Screenshot: https://example.com/screenshot.png'));
181
+ });
182
+ (0, vitest_1.it)('should output JSON for multiple formats', () => {
183
+ vitest_1.vi.mocked(fs.existsSync).mockReturnValue(true);
184
+ (0, output_1.handleScrapeOutput)({
185
+ success: true,
186
+ data: {
187
+ markdown: '# Test',
188
+ links: ['https://example.com'],
189
+ metadata: { title: 'Test' },
190
+ },
191
+ }, ['markdown', 'links']);
192
+ const output = stdoutWriteSpy.mock.calls[0][0];
193
+ const parsed = JSON.parse(output);
194
+ (0, vitest_1.expect)(parsed.markdown).toBe('# Test');
195
+ (0, vitest_1.expect)(parsed.links).toEqual(['https://example.com']);
196
+ });
197
+ (0, vitest_1.it)('should output pretty JSON when pretty flag is true', () => {
198
+ vitest_1.vi.mocked(fs.existsSync).mockReturnValue(true);
199
+ (0, output_1.handleScrapeOutput)({
200
+ success: true,
201
+ data: {
202
+ markdown: '# Test',
203
+ links: ['https://example.com'],
204
+ },
205
+ }, ['markdown', 'links'], undefined, true);
206
+ const output = stdoutWriteSpy.mock.calls[0][0];
207
+ (0, vitest_1.expect)(output).toContain('\n'); // Pretty print has newlines
208
+ });
209
+ (0, vitest_1.it)('should write to file when output path is provided', () => {
210
+ vitest_1.vi.mocked(fs.existsSync).mockReturnValue(true);
211
+ (0, output_1.handleScrapeOutput)({
212
+ success: true,
213
+ data: { markdown: '# Test Content' },
214
+ }, ['markdown'], '/output/test.md');
215
+ (0, vitest_1.expect)(fs.writeFileSync).toHaveBeenCalledWith('/output/test.md', '# Test Content', 'utf-8');
216
+ });
217
+ (0, vitest_1.it)('should handle missing data gracefully', () => {
218
+ (0, output_1.handleScrapeOutput)({
219
+ success: true,
220
+ data: undefined,
221
+ }, ['markdown']);
222
+ // Should not throw, just return early
223
+ (0, vitest_1.expect)(stdoutWriteSpy).not.toHaveBeenCalled();
224
+ });
225
+ (0, vitest_1.it)('should fallback to rawHtml when html requested but only rawHtml available', () => {
226
+ vitest_1.vi.mocked(fs.existsSync).mockReturnValue(true);
227
+ (0, output_1.handleScrapeOutput)({
228
+ success: true,
229
+ data: { rawHtml: '<html>Content</html>' },
230
+ }, ['html']);
231
+ (0, vitest_1.expect)(stdoutWriteSpy).toHaveBeenCalledWith('<html>Content</html>\n');
232
+ });
233
+ (0, vitest_1.it)('should include metadata in JSON output when present', () => {
234
+ vitest_1.vi.mocked(fs.existsSync).mockReturnValue(true);
235
+ (0, output_1.handleScrapeOutput)({
236
+ success: true,
237
+ data: {
238
+ markdown: '# Test',
239
+ links: [],
240
+ metadata: {
241
+ title: 'Test Page',
242
+ description: 'A test',
243
+ sourceURL: 'https://example.com',
244
+ },
245
+ },
246
+ }, ['markdown', 'links']);
247
+ const output = stdoutWriteSpy.mock.calls[0][0];
248
+ const parsed = JSON.parse(output);
249
+ (0, vitest_1.expect)(parsed.metadata).toBeDefined();
250
+ (0, vitest_1.expect)(parsed.metadata.title).toBe('Test Page');
251
+ });
252
+ (0, vitest_1.it)('should output JSON when --json flag is true even for single text format', () => {
253
+ vitest_1.vi.mocked(fs.existsSync).mockReturnValue(true);
254
+ (0, output_1.handleScrapeOutput)({
255
+ success: true,
256
+ data: { markdown: '# Test Content' },
257
+ }, ['markdown'], undefined, false, true // json flag
258
+ );
259
+ const output = stdoutWriteSpy.mock.calls[0][0];
260
+ const parsed = JSON.parse(output);
261
+ (0, vitest_1.expect)(parsed.markdown).toBe('# Test Content');
262
+ });
263
+ (0, vitest_1.it)('should output JSON when --json flag is true for screenshot format', () => {
264
+ vitest_1.vi.mocked(fs.existsSync).mockReturnValue(true);
265
+ (0, output_1.handleScrapeOutput)({
266
+ success: true,
267
+ data: {
268
+ screenshot: 'https://example.com/screenshot.png',
269
+ metadata: {
270
+ title: 'Test Page',
271
+ sourceURL: 'https://example.com',
272
+ },
273
+ },
274
+ }, ['screenshot'], undefined, false, true // json flag
275
+ );
276
+ const output = stdoutWriteSpy.mock.calls[0][0];
277
+ const parsed = JSON.parse(output);
278
+ (0, vitest_1.expect)(parsed.screenshot).toBe('https://example.com/screenshot.png');
279
+ (0, vitest_1.expect)(parsed.metadata.title).toBe('Test Page');
280
+ });
281
+ (0, vitest_1.it)('should infer JSON output when output file has .json extension', () => {
282
+ vitest_1.vi.mocked(fs.existsSync).mockReturnValue(true);
283
+ (0, output_1.handleScrapeOutput)({
284
+ success: true,
285
+ data: {
286
+ screenshot: 'https://example.com/screenshot.png',
287
+ metadata: {
288
+ title: 'Test Page',
289
+ },
290
+ },
291
+ }, ['screenshot'], '/output/result.json', // .json extension
292
+ false, false // no explicit json flag
293
+ );
294
+ // Should write JSON to file
295
+ (0, vitest_1.expect)(fs.writeFileSync).toHaveBeenCalled();
296
+ const content = fs.writeFileSync.mock.calls[0][1];
297
+ const parsed = JSON.parse(content);
298
+ (0, vitest_1.expect)(parsed.screenshot).toBe('https://example.com/screenshot.png');
299
+ });
300
+ (0, vitest_1.it)('should NOT infer JSON for non-.json extensions', () => {
301
+ vitest_1.vi.mocked(fs.existsSync).mockReturnValue(true);
302
+ (0, output_1.handleScrapeOutput)({
303
+ success: true,
304
+ data: {
305
+ screenshot: 'https://example.com/screenshot.png',
306
+ metadata: {
307
+ title: 'Test Page',
308
+ sourceURL: 'https://example.com',
309
+ },
310
+ },
311
+ }, ['screenshot'], '/output/result.md', // .md extension
312
+ false, false // no explicit json flag
313
+ );
314
+ // Should write formatted text, not JSON
315
+ (0, vitest_1.expect)(fs.writeFileSync).toHaveBeenCalled();
316
+ const content = fs.writeFileSync.mock.calls[0][1];
317
+ (0, vitest_1.expect)(content).toContain('Screenshot: https://example.com/screenshot.png');
318
+ (0, vitest_1.expect)(() => JSON.parse(content)).toThrow(); // Not valid JSON
319
+ });
320
+ (0, vitest_1.it)('should output pretty JSON when both json and pretty flags are true', () => {
321
+ vitest_1.vi.mocked(fs.existsSync).mockReturnValue(true);
322
+ (0, output_1.handleScrapeOutput)({
323
+ success: true,
324
+ data: { markdown: '# Test' },
325
+ }, ['markdown'], undefined, true, // pretty flag
326
+ true // json flag
327
+ );
328
+ const output = stdoutWriteSpy.mock.calls[0][0];
329
+ (0, vitest_1.expect)(output).toContain('\n'); // Pretty print has newlines
330
+ const parsed = JSON.parse(output);
331
+ (0, vitest_1.expect)(parsed.markdown).toBe('# Test');
332
+ });
333
+ });
334
+ });
335
+ //# sourceMappingURL=output.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"output.test.js","sourceRoot":"","sources":["../../../src/__tests__/utils/output.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Tests for URL utilities
3
+ */
4
+ export {};
5
+ //# sourceMappingURL=url.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"url.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/utils/url.test.ts"],"names":[],"mappings":"AAAA;;GAEG"}
@@ -0,0 +1,118 @@
1
+ "use strict";
2
+ /**
3
+ * Tests for URL utilities
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const vitest_1 = require("vitest");
7
+ const url_1 = require("../../utils/url");
8
+ (0, vitest_1.describe)('URL Utilities', () => {
9
+ (0, vitest_1.describe)('isUrl', () => {
10
+ (0, vitest_1.describe)('URLs with protocol', () => {
11
+ (0, vitest_1.it)('should return true for valid http URLs', () => {
12
+ (0, vitest_1.expect)((0, url_1.isUrl)('http://example.com')).toBe(true);
13
+ (0, vitest_1.expect)((0, url_1.isUrl)('http://www.example.com')).toBe(true);
14
+ (0, vitest_1.expect)((0, url_1.isUrl)('http://example.com/path')).toBe(true);
15
+ (0, vitest_1.expect)((0, url_1.isUrl)('http://example.com/path?query=value')).toBe(true);
16
+ (0, vitest_1.expect)((0, url_1.isUrl)('http://example.com:8080')).toBe(true);
17
+ });
18
+ (0, vitest_1.it)('should return true for valid https URLs', () => {
19
+ (0, vitest_1.expect)((0, url_1.isUrl)('https://example.com')).toBe(true);
20
+ (0, vitest_1.expect)((0, url_1.isUrl)('https://www.example.com')).toBe(true);
21
+ (0, vitest_1.expect)((0, url_1.isUrl)('https://example.com/path')).toBe(true);
22
+ (0, vitest_1.expect)((0, url_1.isUrl)('https://example.com/path?query=value')).toBe(true);
23
+ (0, vitest_1.expect)((0, url_1.isUrl)('https://api.firecrawl.dev')).toBe(true);
24
+ });
25
+ (0, vitest_1.it)('should be case-insensitive for protocol', () => {
26
+ (0, vitest_1.expect)((0, url_1.isUrl)('HTTP://example.com')).toBe(true);
27
+ (0, vitest_1.expect)((0, url_1.isUrl)('HTTPS://example.com')).toBe(true);
28
+ (0, vitest_1.expect)((0, url_1.isUrl)('Http://example.com')).toBe(true);
29
+ });
30
+ });
31
+ (0, vitest_1.describe)('URLs without protocol (domain detection)', () => {
32
+ (0, vitest_1.it)('should return true for domain-like strings', () => {
33
+ (0, vitest_1.expect)((0, url_1.isUrl)('example.com')).toBe(true);
34
+ (0, vitest_1.expect)((0, url_1.isUrl)('www.example.com')).toBe(true);
35
+ (0, vitest_1.expect)((0, url_1.isUrl)('sub.domain.example.com')).toBe(true);
36
+ (0, vitest_1.expect)((0, url_1.isUrl)('firecrawl.dev')).toBe(true);
37
+ });
38
+ (0, vitest_1.it)('should return true for domains with paths', () => {
39
+ (0, vitest_1.expect)((0, url_1.isUrl)('example.com/path')).toBe(true);
40
+ (0, vitest_1.expect)((0, url_1.isUrl)('example.com/path/to/page')).toBe(true);
41
+ (0, vitest_1.expect)((0, url_1.isUrl)('docs.firecrawl.dev/api')).toBe(true);
42
+ });
43
+ (0, vitest_1.it)('should return true for domains with various TLDs', () => {
44
+ (0, vitest_1.expect)((0, url_1.isUrl)('example.co.uk')).toBe(true);
45
+ (0, vitest_1.expect)((0, url_1.isUrl)('example.io')).toBe(true);
46
+ (0, vitest_1.expect)((0, url_1.isUrl)('example.org')).toBe(true);
47
+ (0, vitest_1.expect)((0, url_1.isUrl)('example.net')).toBe(true);
48
+ });
49
+ });
50
+ (0, vitest_1.describe)('Non-URLs', () => {
51
+ (0, vitest_1.it)('should return false for plain text without dots', () => {
52
+ (0, vitest_1.expect)((0, url_1.isUrl)('hello')).toBe(false);
53
+ (0, vitest_1.expect)((0, url_1.isUrl)('test')).toBe(false);
54
+ (0, vitest_1.expect)((0, url_1.isUrl)('search query')).toBe(false);
55
+ });
56
+ (0, vitest_1.it)('should return false for flags and options', () => {
57
+ (0, vitest_1.expect)((0, url_1.isUrl)('--help')).toBe(false);
58
+ (0, vitest_1.expect)((0, url_1.isUrl)('-h')).toBe(false);
59
+ (0, vitest_1.expect)((0, url_1.isUrl)('--format')).toBe(false);
60
+ (0, vitest_1.expect)((0, url_1.isUrl)('-o.txt')).toBe(false);
61
+ });
62
+ (0, vitest_1.it)('should return false for strings with spaces', () => {
63
+ (0, vitest_1.expect)((0, url_1.isUrl)('hello world')).toBe(false);
64
+ (0, vitest_1.expect)((0, url_1.isUrl)('example .com')).toBe(false);
65
+ (0, vitest_1.expect)((0, url_1.isUrl)('www. example.com')).toBe(false);
66
+ });
67
+ (0, vitest_1.it)('should return false for empty string', () => {
68
+ (0, vitest_1.expect)((0, url_1.isUrl)('')).toBe(false);
69
+ });
70
+ (0, vitest_1.it)('should return false for just dots', () => {
71
+ (0, vitest_1.expect)((0, url_1.isUrl)('.')).toBe(false);
72
+ (0, vitest_1.expect)((0, url_1.isUrl)('..')).toBe(false);
73
+ });
74
+ });
75
+ (0, vitest_1.describe)('Edge cases', () => {
76
+ (0, vitest_1.it)('should handle localhost-like strings', () => {
77
+ // localhost without TLD is not detected as URL without protocol
78
+ (0, vitest_1.expect)((0, url_1.isUrl)('localhost')).toBe(false);
79
+ (0, vitest_1.expect)((0, url_1.isUrl)('http://localhost')).toBe(true);
80
+ (0, vitest_1.expect)((0, url_1.isUrl)('http://localhost:3000')).toBe(true);
81
+ });
82
+ (0, vitest_1.it)('should handle subdomains', () => {
83
+ (0, vitest_1.expect)((0, url_1.isUrl)('api.example.com')).toBe(true);
84
+ (0, vitest_1.expect)((0, url_1.isUrl)('v2.api.example.com')).toBe(true);
85
+ (0, vitest_1.expect)((0, url_1.isUrl)('https://api.firecrawl.dev/v2')).toBe(true);
86
+ });
87
+ });
88
+ });
89
+ (0, vitest_1.describe)('normalizeUrl', () => {
90
+ (0, vitest_1.it)('should add https:// to URLs without protocol', () => {
91
+ (0, vitest_1.expect)((0, url_1.normalizeUrl)('example.com')).toBe('https://example.com');
92
+ (0, vitest_1.expect)((0, url_1.normalizeUrl)('www.example.com')).toBe('https://www.example.com');
93
+ (0, vitest_1.expect)((0, url_1.normalizeUrl)('firecrawl.dev')).toBe('https://firecrawl.dev');
94
+ });
95
+ (0, vitest_1.it)('should add https:// to URLs with paths', () => {
96
+ (0, vitest_1.expect)((0, url_1.normalizeUrl)('example.com/path')).toBe('https://example.com/path');
97
+ (0, vitest_1.expect)((0, url_1.normalizeUrl)('example.com/path?query=value')).toBe('https://example.com/path?query=value');
98
+ });
99
+ (0, vitest_1.it)('should not modify URLs that already have http://', () => {
100
+ (0, vitest_1.expect)((0, url_1.normalizeUrl)('http://example.com')).toBe('http://example.com');
101
+ (0, vitest_1.expect)((0, url_1.normalizeUrl)('http://www.example.com/path')).toBe('http://www.example.com/path');
102
+ });
103
+ (0, vitest_1.it)('should not modify URLs that already have https://', () => {
104
+ (0, vitest_1.expect)((0, url_1.normalizeUrl)('https://example.com')).toBe('https://example.com');
105
+ (0, vitest_1.expect)((0, url_1.normalizeUrl)('https://www.example.com/path')).toBe('https://www.example.com/path');
106
+ });
107
+ (0, vitest_1.it)('should be case-insensitive for existing protocols', () => {
108
+ (0, vitest_1.expect)((0, url_1.normalizeUrl)('HTTP://example.com')).toBe('HTTP://example.com');
109
+ (0, vitest_1.expect)((0, url_1.normalizeUrl)('HTTPS://example.com')).toBe('HTTPS://example.com');
110
+ (0, vitest_1.expect)((0, url_1.normalizeUrl)('Http://example.com')).toBe('Http://example.com');
111
+ });
112
+ (0, vitest_1.it)('should handle complex URLs', () => {
113
+ (0, vitest_1.expect)((0, url_1.normalizeUrl)('api.firecrawl.dev/v2/scrape?url=test')).toBe('https://api.firecrawl.dev/v2/scrape?url=test');
114
+ (0, vitest_1.expect)((0, url_1.normalizeUrl)('example.com:8080/api')).toBe('https://example.com:8080/api');
115
+ });
116
+ });
117
+ });
118
+ //# sourceMappingURL=url.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"url.test.js","sourceRoot":"","sources":["../../../src/__tests__/utils/url.test.ts"],"names":[],"mappings":";AAAA;;GAEG;;AAEH,mCAA8C;AAC9C,yCAAsD;AAEtD,IAAA,iBAAQ,EAAC,eAAe,EAAE,GAAG,EAAE;IAC7B,IAAA,iBAAQ,EAAC,OAAO,EAAE,GAAG,EAAE;QACrB,IAAA,iBAAQ,EAAC,oBAAoB,EAAE,GAAG,EAAE;YAClC,IAAA,WAAE,EAAC,wCAAwC,EAAE,GAAG,EAAE;gBAChD,IAAA,eAAM,EAAC,IAAA,WAAK,EAAC,oBAAoB,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBAC/C,IAAA,eAAM,EAAC,IAAA,WAAK,EAAC,wBAAwB,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBACnD,IAAA,eAAM,EAAC,IAAA,WAAK,EAAC,yBAAyB,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBACpD,IAAA,eAAM,EAAC,IAAA,WAAK,EAAC,qCAAqC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBAChE,IAAA,eAAM,EAAC,IAAA,WAAK,EAAC,yBAAyB,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACtD,CAAC,CAAC,CAAC;YAEH,IAAA,WAAE,EAAC,yCAAyC,EAAE,GAAG,EAAE;gBACjD,IAAA,eAAM,EAAC,IAAA,WAAK,EAAC,qBAAqB,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBAChD,IAAA,eAAM,EAAC,IAAA,WAAK,EAAC,yBAAyB,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBACpD,IAAA,eAAM,EAAC,IAAA,WAAK,EAAC,0BAA0B,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBACrD,IAAA,eAAM,EAAC,IAAA,WAAK,EAAC,sCAAsC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBACjE,IAAA,eAAM,EAAC,IAAA,WAAK,EAAC,2BAA2B,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACxD,CAAC,CAAC,CAAC;YAEH,IAAA,WAAE,EAAC,yCAAyC,EAAE,GAAG,EAAE;gBACjD,IAAA,eAAM,EAAC,IAAA,WAAK,EAAC,oBAAoB,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBAC/C,IAAA,eAAM,EAAC,IAAA,WAAK,EAAC,qBAAqB,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBAChD,IAAA,eAAM,EAAC,IAAA,WAAK,EAAC,oBAAoB,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACjD,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,IAAA,iBAAQ,EAAC,0CAA0C,EAAE,GAAG,EAAE;YACxD,IAAA,WAAE,EAAC,4CAA4C,EAAE,GAAG,EAAE;gBACpD,IAAA,eAAM,EAAC,IAAA,WAAK,EAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBACxC,IAAA,eAAM,EAAC,IAAA,WAAK,EAAC,iBAAiB,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBAC5C,IAAA,eAAM,EAAC,IAAA,WAAK,EAAC,wBAAwB,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBACnD,IAAA,eAAM,EAAC,IAAA,WAAK,EAAC,eAAe,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC5C,CAAC,CAAC,CAAC;YAEH,IAAA,WAAE,EAAC,2CAA2C,EAAE,GAAG,EAAE;gBACnD,IAAA,eAAM,EAAC,IAAA,WAAK,EAAC,kBAAkB,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBAC7C,IAAA,eAAM,EAAC,IAAA,WAAK,EAAC,0BAA0B,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBACrD,IAAA,eAAM,EAAC,IAAA,WAAK,EAAC,wBAAwB,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACrD,CAAC,CAAC,CAAC;YAEH,IAAA,WAAE,EAAC,kDAAkD,EAAE,GAAG,EAAE;gBAC1D,IAAA,eAAM,EAAC,IAAA,WAAK,EAAC,eAAe,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBAC1C,IAAA,eAAM,EAAC,IAAA,WAAK,EAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBACvC,IAAA,eAAM,EAAC,IAAA,WAAK,EAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBACxC,IAAA,eAAM,EAAC,IAAA,WAAK,EAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC1C,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,IAAA,iBAAQ,EAAC,UAAU,EAAE,GAAG,EAAE;YACxB,IAAA,WAAE,EAAC,iDAAiD,EAAE,GAAG,EAAE;gBACzD,IAAA,eAAM,EAAC,IAAA,WAAK,EAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBACnC,IAAA,eAAM,EAAC,IAAA,WAAK,EAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBAClC,IAAA,eAAM,EAAC,IAAA,WAAK,EAAC,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAC5C,CAAC,CAAC,CAAC;YAEH,IAAA,WAAE,EAAC,2CAA2C,EAAE,GAAG,EAAE;gBACnD,IAAA,eAAM,EAAC,IAAA,WAAK,EAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBACpC,IAAA,eAAM,EAAC,IAAA,WAAK,EAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBAChC,IAAA,eAAM,EAAC,IAAA,WAAK,EAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBACtC,IAAA,eAAM,EAAC,IAAA,WAAK,EAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACtC,CAAC,CAAC,CAAC;YAEH,IAAA,WAAE,EAAC,6CAA6C,EAAE,GAAG,EAAE;gBACrD,IAAA,eAAM,EAAC,IAAA,WAAK,EAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBACzC,IAAA,eAAM,EAAC,IAAA,WAAK,EAAC,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBAC1C,IAAA,eAAM,EAAC,IAAA,WAAK,EAAC,kBAAkB,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAChD,CAAC,CAAC,CAAC;YAEH,IAAA,WAAE,EAAC,sCAAsC,EAAE,GAAG,EAAE;gBAC9C,IAAA,eAAM,EAAC,IAAA,WAAK,EAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAChC,CAAC,CAAC,CAAC;YAEH,IAAA,WAAE,EAAC,mCAAmC,EAAE,GAAG,EAAE;gBAC3C,IAAA,eAAM,EAAC,IAAA,WAAK,EAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBAC/B,IAAA,eAAM,EAAC,IAAA,WAAK,EAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAClC,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,IAAA,iBAAQ,EAAC,YAAY,EAAE,GAAG,EAAE;YAC1B,IAAA,WAAE,EAAC,sCAAsC,EAAE,GAAG,EAAE;gBAC9C,gEAAgE;gBAChE,IAAA,eAAM,EAAC,IAAA,WAAK,EAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBACvC,IAAA,eAAM,EAAC,IAAA,WAAK,EAAC,kBAAkB,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBAC7C,IAAA,eAAM,EAAC,IAAA,WAAK,EAAC,uBAAuB,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACpD,CAAC,CAAC,CAAC;YAEH,IAAA,WAAE,EAAC,0BAA0B,EAAE,GAAG,EAAE;gBAClC,IAAA,eAAM,EAAC,IAAA,WAAK,EAAC,iBAAiB,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBAC5C,IAAA,eAAM,EAAC,IAAA,WAAK,EAAC,oBAAoB,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBAC/C,IAAA,eAAM,EAAC,IAAA,WAAK,EAAC,8BAA8B,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC3D,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,IAAA,iBAAQ,EAAC,cAAc,EAAE,GAAG,EAAE;QAC5B,IAAA,WAAE,EAAC,8CAA8C,EAAE,GAAG,EAAE;YACtD,IAAA,eAAM,EAAC,IAAA,kBAAY,EAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;YAChE,IAAA,eAAM,EAAC,IAAA,kBAAY,EAAC,iBAAiB,CAAC,CAAC,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC;YACxE,IAAA,eAAM,EAAC,IAAA,kBAAY,EAAC,eAAe,CAAC,CAAC,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;QACtE,CAAC,CAAC,CAAC;QAEH,IAAA,WAAE,EAAC,wCAAwC,EAAE,GAAG,EAAE;YAChD,IAAA,eAAM,EAAC,IAAA,kBAAY,EAAC,kBAAkB,CAAC,CAAC,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC;YAC1E,IAAA,eAAM,EAAC,IAAA,kBAAY,EAAC,8BAA8B,CAAC,CAAC,CAAC,IAAI,CACvD,sCAAsC,CACvC,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,IAAA,WAAE,EAAC,kDAAkD,EAAE,GAAG,EAAE;YAC1D,IAAA,eAAM,EAAC,IAAA,kBAAY,EAAC,oBAAoB,CAAC,CAAC,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;YACtE,IAAA,eAAM,EAAC,IAAA,kBAAY,EAAC,6BAA6B,CAAC,CAAC,CAAC,IAAI,CACtD,6BAA6B,CAC9B,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,IAAA,WAAE,EAAC,mDAAmD,EAAE,GAAG,EAAE;YAC3D,IAAA,eAAM,EAAC,IAAA,kBAAY,EAAC,qBAAqB,CAAC,CAAC,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;YACxE,IAAA,eAAM,EAAC,IAAA,kBAAY,EAAC,8BAA8B,CAAC,CAAC,CAAC,IAAI,CACvD,8BAA8B,CAC/B,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,IAAA,WAAE,EAAC,mDAAmD,EAAE,GAAG,EAAE;YAC3D,IAAA,eAAM,EAAC,IAAA,kBAAY,EAAC,oBAAoB,CAAC,CAAC,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;YACtE,IAAA,eAAM,EAAC,IAAA,kBAAY,EAAC,qBAAqB,CAAC,CAAC,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;YACxE,IAAA,eAAM,EAAC,IAAA,kBAAY,EAAC,oBAAoB,CAAC,CAAC,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;QACxE,CAAC,CAAC,CAAC;QAEH,IAAA,WAAE,EAAC,4BAA4B,EAAE,GAAG,EAAE;YACpC,IAAA,eAAM,EAAC,IAAA,kBAAY,EAAC,sCAAsC,CAAC,CAAC,CAAC,IAAI,CAC/D,8CAA8C,CAC/C,CAAC;YACF,IAAA,eAAM,EAAC,IAAA,kBAAY,EAAC,sBAAsB,CAAC,CAAC,CAAC,IAAI,CAC/C,8BAA8B,CAC/B,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"scrape.d.ts","sourceRoot":"","sources":["../../src/commands/scrape.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,KAAK,EACV,aAAa,EACb,YAAY,EAEb,MAAM,iBAAiB,CAAC;AAoCzB;;GAEG;AACH,wBAAsB,aAAa,CACjC,OAAO,EAAE,aAAa,GACrB,OAAO,CAAC,YAAY,CAAC,CAqEvB;AAED;;GAEG;AACH,wBAAsB,mBAAmB,CACvC,OAAO,EAAE,aAAa,GACrB,OAAO,CAAC,IAAI,CAAC,CAef"}
1
+ {"version":3,"file":"scrape.d.ts","sourceRoot":"","sources":["../../src/commands/scrape.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,KAAK,EACV,aAAa,EACb,YAAY,EAEb,MAAM,iBAAiB,CAAC;AAoCzB;;GAEG;AACH,wBAAsB,aAAa,CACjC,OAAO,EAAE,aAAa,GACrB,OAAO,CAAC,YAAY,CAAC,CAqEvB;AAED;;GAEG;AACH,wBAAsB,mBAAmB,CACvC,OAAO,EAAE,aAAa,GACrB,OAAO,CAAC,IAAI,CAAC,CAqBf"}
@@ -93,6 +93,6 @@ async function handleScrapeCommand(options) {
93
93
  if (options.screenshot && !effectiveFormats.includes('screenshot')) {
94
94
  effectiveFormats.push('screenshot');
95
95
  }
96
- (0, output_1.handleScrapeOutput)(result, effectiveFormats, options.output, options.pretty);
96
+ (0, output_1.handleScrapeOutput)(result, effectiveFormats, options.output, options.pretty, options.json);
97
97
  }
98
98
  //# sourceMappingURL=scrape.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"scrape.js","sourceRoot":"","sources":["../../src/commands/scrape.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"scrape.js","sourceRoot":"","sources":["../../src/commands/scrape.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -94,9 +94,10 @@ function createScrapeCommand() {
94
94
  const scrapeCmd = new commander_1.Command('scrape')
95
95
  .description('Scrape a URL using Firecrawl')
96
96
  .argument('[url]', 'URL to scrape')
97
+ .argument('[formats...]', 'Output format(s) as positional args (e.g., markdown screenshot links)')
97
98
  .option('-u, --url <url>', 'URL to scrape (alternative to positional argument)')
98
99
  .option('-H, --html', 'Output raw HTML (shortcut for --format html)')
99
- .option('-f, --format <formats>', 'Output format(s). Multiple formats can be specified with commas (e.g., "markdown,links,images"). Available: markdown, html, rawHtml, links, images, screenshot, summary, changeTracking, json, attributes, branding. Single format outputs raw content; multiple formats output JSON.', 'markdown')
100
+ .option('-f, --format <formats>', 'Output format(s). Multiple formats can be specified with commas (e.g., "markdown,links,images"). Available: markdown, html, rawHtml, links, images, screenshot, summary, changeTracking, json, attributes, branding. Single format outputs raw content; multiple formats output JSON.')
100
101
  .option('--only-main-content', 'Include only main content', false)
101
102
  .option('--wait-for <ms>', 'Wait time before scraping in milliseconds', parseInt)
102
103
  .option('--screenshot', 'Take a screenshot', false)
@@ -104,17 +105,34 @@ function createScrapeCommand() {
104
105
  .option('--exclude-tags <tags>', 'Comma-separated list of tags to exclude')
105
106
  .option('-k, --api-key <key>', 'Firecrawl API key (overrides global --api-key)')
106
107
  .option('-o, --output <path>', 'Output file path (default: stdout)')
108
+ .option('--json', 'Output as JSON format', false)
107
109
  .option('--pretty', 'Pretty print JSON output', false)
108
110
  .option('--timing', 'Show request timing and other useful information', false)
109
- .action(async (positionalUrl, options) => {
111
+ .action(async (positionalUrl, positionalFormats, options) => {
110
112
  // Use positional URL if provided, otherwise use --url option
111
113
  const url = positionalUrl || options.url;
112
114
  if (!url) {
113
115
  console.error('Error: URL is required. Provide it as argument or use --url option.');
114
116
  process.exit(1);
115
117
  }
116
- // Handle --html shortcut flag
117
- const format = options.html ? 'html' : options.format;
118
+ // Merge formats: positional formats take precedence, then --format flag, then default to markdown
119
+ let format;
120
+ if (positionalFormats && positionalFormats.length > 0) {
121
+ // Positional formats: join them with commas for parseFormats
122
+ format = positionalFormats.join(',');
123
+ }
124
+ else if (options.html) {
125
+ // Handle --html shortcut flag
126
+ format = 'html';
127
+ }
128
+ else if (options.format) {
129
+ // Use --format option
130
+ format = options.format;
131
+ }
132
+ else {
133
+ // Default to markdown
134
+ format = 'markdown';
135
+ }
118
136
  const scrapeOptions = (0, options_1.parseScrapeOptions)({ ...options, url, format });
119
137
  await (0, scrape_1.handleScrapeCommand)(scrapeOptions);
120
138
  });
@@ -252,7 +270,11 @@ function createSearchCommand() {
252
270
  .option('--only-main-content', 'Include only main content when scraping', true)
253
271
  .option('-k, --api-key <key>', 'Firecrawl API key (overrides global --api-key)')
254
272
  .option('-o, --output <path>', 'Output file path (default: stdout)')
255
- .option('-p, --pretty', 'Output as pretty JSON (default: human-readable)', false)
273
+ // .option(
274
+ // '-p, --pretty',
275
+ // 'Output as pretty JSON (default: human-readable)',
276
+ // false
277
+ // )
256
278
  .option('--json', 'Output as compact JSON', false)
257
279
  .action(async (query, options) => {
258
280
  // Parse sources
@@ -400,14 +422,33 @@ async function main() {
400
422
  if (!args[0].startsWith('-') && (0, url_1.isUrl)(args[0])) {
401
423
  // Treat as scrape command with URL - reuse commander's parsing
402
424
  const url = (0, url_1.normalizeUrl)(args[0]);
403
- // Modify argv to include scrape command with URL as positional argument
425
+ // Collect any positional format arguments (non-flag arguments after the URL)
426
+ const remainingArgs = args.slice(1);
427
+ const positionalFormats = [];
428
+ const otherArgs = [];
429
+ for (const arg of remainingArgs) {
430
+ // If it starts with a dash, it's a flag (and everything after goes to otherArgs)
431
+ if (arg.startsWith('-')) {
432
+ otherArgs.push(arg);
433
+ }
434
+ else if (otherArgs.length === 0) {
435
+ // Only treat as positional format if we haven't hit a flag yet
436
+ positionalFormats.push(arg);
437
+ }
438
+ else {
439
+ // This is an argument to a flag
440
+ otherArgs.push(arg);
441
+ }
442
+ }
443
+ // Modify argv to include scrape command with URL and formats as positional arguments
404
444
  // This allows commander to parse it normally with all hooks and options
405
445
  const modifiedArgv = [
406
446
  process.argv[0],
407
447
  process.argv[1],
408
448
  'scrape',
409
449
  url,
410
- ...args.slice(1),
450
+ ...positionalFormats,
451
+ ...otherArgs,
411
452
  ];
412
453
  // Parse using the main program (which includes hooks and global options)
413
454
  await program.parseAsync(modifiedArgv);