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.
- package/README.md +1 -2
- package/dist/__tests__/commands/search.test.d.ts +5 -0
- package/dist/__tests__/commands/search.test.d.ts.map +1 -0
- package/dist/__tests__/commands/search.test.js +542 -0
- package/dist/__tests__/commands/search.test.js.map +1 -0
- package/dist/__tests__/utils/auth.test.d.ts +5 -0
- package/dist/__tests__/utils/auth.test.d.ts.map +1 -0
- package/dist/__tests__/utils/auth.test.js +119 -0
- package/dist/__tests__/utils/auth.test.js.map +1 -0
- package/dist/__tests__/utils/credentials.test.d.ts +5 -0
- package/dist/__tests__/utils/credentials.test.d.ts.map +1 -0
- package/dist/__tests__/utils/credentials.test.js +189 -0
- package/dist/__tests__/utils/credentials.test.js.map +1 -0
- package/dist/__tests__/utils/options.test.d.ts +5 -0
- package/dist/__tests__/utils/options.test.d.ts.map +1 -0
- package/dist/__tests__/utils/options.test.js +266 -0
- package/dist/__tests__/utils/options.test.js.map +1 -0
- package/dist/__tests__/utils/output.test.d.ts +5 -0
- package/dist/__tests__/utils/output.test.d.ts.map +1 -0
- package/dist/__tests__/utils/output.test.js +335 -0
- package/dist/__tests__/utils/output.test.js.map +1 -0
- package/dist/__tests__/utils/url.test.d.ts +5 -0
- package/dist/__tests__/utils/url.test.d.ts.map +1 -0
- package/dist/__tests__/utils/url.test.js +118 -0
- package/dist/__tests__/utils/url.test.js.map +1 -0
- package/dist/commands/scrape.d.ts.map +1 -1
- package/dist/commands/scrape.js +1 -1
- package/dist/commands/scrape.js.map +1 -1
- package/dist/index.js +48 -7
- package/dist/index.js.map +1 -1
- package/dist/types/scrape.d.ts +2 -0
- package/dist/types/scrape.d.ts.map +1 -1
- package/dist/utils/options.d.ts.map +1 -1
- package/dist/utils/options.js +1 -0
- package/dist/utils/options.js.map +1 -1
- package/dist/utils/output.d.ts +2 -1
- package/dist/utils/output.d.ts.map +1 -1
- package/dist/utils/output.js +65 -1
- package/dist/utils/output.js.map +1 -1
- 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 @@
|
|
|
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":"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"}
|
|
@@ -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,
|
|
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"}
|
package/dist/commands/scrape.js
CHANGED
|
@@ -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":";AAAA;;GAEG;;AA8CH,sCAuEC;AAKD,
|
|
1
|
+
{"version":3,"file":"scrape.js","sourceRoot":"","sources":["../../src/commands/scrape.ts"],"names":[],"mappings":";AAAA;;GAEG;;AA8CH,sCAuEC;AAKD,kDAuBC;AAzID,4CAA4C;AAC5C,4CAAqD;AAErD;;GAEG;AACH,SAAS,YAAY,CACnB,OAAsB,EACtB,gBAAwB,EACxB,cAAsB,EACtB,KAAuB;IAEvB,IAAI,CAAC,OAAO,CAAC,MAAM;QAAE,OAAO;IAE5B,MAAM,eAAe,GAAG,cAAc,GAAG,gBAAgB,CAAC;IAC1D,MAAM,UAAU,GAMZ;QACF,GAAG,EAAE,OAAO,CAAC,GAAG;QAChB,WAAW,EAAE,IAAI,IAAI,CAAC,gBAAgB,CAAC,CAAC,WAAW,EAAE;QACrD,QAAQ,EAAE,GAAG,eAAe,IAAI;QAChC,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS;KACpC,CAAC;IAEF,IAAI,KAAK,EAAE,CAAC;QACV,UAAU,CAAC,KAAK,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC;IAC9E,CAAC;IAED,OAAO,CAAC,KAAK,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AAChE,CAAC;AAED;;GAEG;AACI,KAAK,UAAU,aAAa,CACjC,OAAsB;IAEtB,iEAAiE;IACjE,MAAM,GAAG,GAAG,IAAA,kBAAS,EAAC,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAElD,uBAAuB;IACvB,MAAM,OAAO,GAAmB,EAAE,CAAC;IAEnC,wBAAwB;IACxB,IAAI,OAAO,CAAC,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAClD,OAAO,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACnC,CAAC;IAED,8DAA8D;IAC9D,IAAI,OAAO,CAAC,UAAU,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC;QAC1D,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IAC7B,CAAC;IAED,+CAA+C;IAC/C,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAC3B,CAAC;IAED,MAAM,YAAY,GAMd;QACF,OAAO;KACR,CAAC;IAEF,IAAI,OAAO,CAAC,eAAe,KAAK,SAAS,EAAE,CAAC;QAC1C,YAAY,CAAC,eAAe,GAAG,OAAO,CAAC,eAAe,CAAC;IACzD,CAAC;IAED,IAAI,OAAO,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;QAClC,YAAY,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;IACzC,CAAC;IAED,IAAI,OAAO,CAAC,WAAW,IAAI,OAAO,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC1D,YAAY,CAAC,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC;IACjD,CAAC;IAED,IAAI,OAAO,CAAC,WAAW,IAAI,OAAO,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC1D,YAAY,CAAC,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC;IACjD,CAAC;IAED,sEAAsE;IACtE,MAAM,gBAAgB,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAEpC,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;QAC3D,MAAM,cAAc,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAClC,YAAY,CAAC,OAAO,EAAE,gBAAgB,EAAE,cAAc,CAAC,CAAC;QAExD,OAAO;YACL,OAAO,EAAE,IAAI;YACb,IAAI,EAAE,MAAM;SACb,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,cAAc,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAClC,YAAY,CAAC,OAAO,EAAE,gBAAgB,EAAE,cAAc,EAAE,KAAK,CAAC,CAAC;QAE/D,OAAO;YACL,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,wBAAwB;SACzE,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;GAEG;AACI,KAAK,UAAU,mBAAmB,CACvC,OAAsB;IAEtB,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,OAAO,CAAC,CAAC;IAE5C,kDAAkD;IAClD,MAAM,gBAAgB,GACpB,OAAO,CAAC,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC;QAC3C,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC;QACtB,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;IAEnB,qEAAqE;IACrE,IAAI,OAAO,CAAC,UAAU,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC;QACnE,gBAAgB,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IACtC,CAAC;IAED,IAAA,2BAAkB,EAChB,MAAM,EACN,gBAAgB,EAChB,OAAO,CAAC,MAAM,EACd,OAAO,CAAC,MAAM,EACd,OAAO,CAAC,IAAI,CACb,CAAC;AACJ,CAAC"}
|
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.'
|
|
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
|
-
//
|
|
117
|
-
|
|
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(
|
|
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
|
-
//
|
|
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
|
-
...
|
|
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);
|