@xcrawl/cli 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +23 -0
- package/README.md +115 -0
- package/dist/api/client.d.ts +14 -0
- package/dist/api/client.js +92 -0
- package/dist/api/client.js.map +1 -0
- package/dist/api/crawl.d.ts +4 -0
- package/dist/api/crawl.js +63 -0
- package/dist/api/crawl.js.map +1 -0
- package/dist/api/credits.d.ts +2 -0
- package/dist/api/credits.js +7 -0
- package/dist/api/credits.js.map +1 -0
- package/dist/api/map.d.ts +2 -0
- package/dist/api/map.js +29 -0
- package/dist/api/map.js.map +1 -0
- package/dist/api/scrape.d.ts +2 -0
- package/dist/api/scrape.js +75 -0
- package/dist/api/scrape.js.map +1 -0
- package/dist/api/search.d.ts +2 -0
- package/dist/api/search.js +25 -0
- package/dist/api/search.js.map +1 -0
- package/dist/api/whoami.d.ts +2 -0
- package/dist/api/whoami.js +7 -0
- package/dist/api/whoami.js.map +1 -0
- package/dist/commands/config.d.ts +3 -0
- package/dist/commands/config.js +64 -0
- package/dist/commands/config.js.map +1 -0
- package/dist/commands/crawl.d.ts +3 -0
- package/dist/commands/crawl.js +91 -0
- package/dist/commands/crawl.js.map +1 -0
- package/dist/commands/credits.d.ts +3 -0
- package/dist/commands/credits.js +60 -0
- package/dist/commands/credits.js.map +1 -0
- package/dist/commands/doctor.d.ts +3 -0
- package/dist/commands/doctor.js +115 -0
- package/dist/commands/doctor.js.map +1 -0
- package/dist/commands/init.d.ts +2 -0
- package/dist/commands/init.js +9 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/login.d.ts +3 -0
- package/dist/commands/login.js +27 -0
- package/dist/commands/login.js.map +1 -0
- package/dist/commands/map.d.ts +3 -0
- package/dist/commands/map.js +48 -0
- package/dist/commands/map.js.map +1 -0
- package/dist/commands/scrape.d.ts +3 -0
- package/dist/commands/scrape.js +118 -0
- package/dist/commands/scrape.js.map +1 -0
- package/dist/commands/search.d.ts +3 -0
- package/dist/commands/search.js +64 -0
- package/dist/commands/search.js.map +1 -0
- package/dist/commands/shared.d.ts +14 -0
- package/dist/commands/shared.js +41 -0
- package/dist/commands/shared.js.map +1 -0
- package/dist/commands/whoami.d.ts +3 -0
- package/dist/commands/whoami.js +61 -0
- package/dist/commands/whoami.js.map +1 -0
- package/dist/core/auth.d.ts +1 -0
- package/dist/core/auth.js +11 -0
- package/dist/core/auth.js.map +1 -0
- package/dist/core/config.d.ts +20 -0
- package/dist/core/config.js +134 -0
- package/dist/core/config.js.map +1 -0
- package/dist/core/constants.d.ts +3 -0
- package/dist/core/constants.js +12 -0
- package/dist/core/constants.js.map +1 -0
- package/dist/core/env.d.ts +2 -0
- package/dist/core/env.js +34 -0
- package/dist/core/env.js.map +1 -0
- package/dist/core/errors.d.ts +33 -0
- package/dist/core/errors.js +66 -0
- package/dist/core/errors.js.map +1 -0
- package/dist/core/files.d.ts +3 -0
- package/dist/core/files.js +37 -0
- package/dist/core/files.js.map +1 -0
- package/dist/core/logger.d.ts +14 -0
- package/dist/core/logger.js +32 -0
- package/dist/core/logger.js.map +1 -0
- package/dist/core/output.d.ts +17 -0
- package/dist/core/output.js +29 -0
- package/dist/core/output.js.map +1 -0
- package/dist/formatters/json.d.ts +1 -0
- package/dist/formatters/json.js +18 -0
- package/dist/formatters/json.js.map +1 -0
- package/dist/formatters/markdown.d.ts +1 -0
- package/dist/formatters/markdown.js +7 -0
- package/dist/formatters/markdown.js.map +1 -0
- package/dist/formatters/table.d.ts +5 -0
- package/dist/formatters/table.js +23 -0
- package/dist/formatters/table.js.map +1 -0
- package/dist/formatters/text.d.ts +21 -0
- package/dist/formatters/text.js +78 -0
- package/dist/formatters/text.js.map +1 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.js +117 -0
- package/dist/index.js.map +1 -0
- package/dist/types/api.d.ts +159 -0
- package/dist/types/api.js +3 -0
- package/dist/types/api.js.map +1 -0
- package/dist/types/cli.d.ts +12 -0
- package/dist/types/cli.js +3 -0
- package/dist/types/cli.js.map +1 -0
- package/dist/types/config.d.ts +19 -0
- package/dist/types/config.js +3 -0
- package/dist/types/config.js.map +1 -0
- package/dist/utils/concurrency.d.ts +1 -0
- package/dist/utils/concurrency.js +21 -0
- package/dist/utils/concurrency.js.map +1 -0
- package/dist/utils/time.d.ts +1 -0
- package/dist/utils/time.js +7 -0
- package/dist/utils/time.js.map +1 -0
- package/dist/utils/validate.d.ts +3 -0
- package/dist/utils/validate.js +48 -0
- package/dist/utils/validate.js.map +1 -0
- package/package.json +47 -0
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.toStableJson = toStableJson;
|
|
4
|
+
function sortValue(value) {
|
|
5
|
+
if (Array.isArray(value)) {
|
|
6
|
+
return value.map((item) => sortValue(item));
|
|
7
|
+
}
|
|
8
|
+
if (value && typeof value === 'object') {
|
|
9
|
+
const entries = Object.entries(value).sort(([a], [b]) => a.localeCompare(b));
|
|
10
|
+
return Object.fromEntries(entries.map(([key, nested]) => [key, sortValue(nested)]));
|
|
11
|
+
}
|
|
12
|
+
return value;
|
|
13
|
+
}
|
|
14
|
+
function toStableJson(input, pretty = true) {
|
|
15
|
+
const normalized = sortValue(input);
|
|
16
|
+
return `${JSON.stringify(normalized, null, pretty ? 2 : 0)}\n`;
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=json.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"json.js","sourceRoot":"","sources":["../../src/formatters/json.ts"],"names":[],"mappings":";;AAaA,oCAGC;AAhBD,SAAS,SAAS,CAAC,KAAc;IAC/B,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;IAC9C,CAAC;IAED,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QACvC,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,KAAgC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC;QACxG,OAAO,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;IACtF,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAgB,YAAY,CAAC,KAAc,EAAE,MAAM,GAAG,IAAI;IACxD,MAAM,UAAU,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC;IACpC,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,UAAU,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AACjE,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function toMarkdown(title: string, content: string): string;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"markdown.js","sourceRoot":"","sources":["../../src/formatters/markdown.ts"],"names":[],"mappings":";;AAAA,gCAEC;AAFD,SAAgB,UAAU,CAAC,KAAa,EAAE,OAAe;IACvD,OAAO,KAAK,KAAK,OAAO,OAAO,EAAE,CAAC;AACpC,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.renderTable = renderTable;
|
|
4
|
+
function renderTable(rows, columns) {
|
|
5
|
+
if (rows.length === 0) {
|
|
6
|
+
return 'No results.';
|
|
7
|
+
}
|
|
8
|
+
const widths = columns.map((column) => {
|
|
9
|
+
const cellWidth = rows.reduce((max, row) => {
|
|
10
|
+
const value = row[String(column.key)];
|
|
11
|
+
return Math.max(max, String(value ?? '').length);
|
|
12
|
+
}, column.title.length);
|
|
13
|
+
return cellWidth;
|
|
14
|
+
});
|
|
15
|
+
const renderRow = (values) => values.map((value, idx) => value.padEnd(widths[idx])).join(' ');
|
|
16
|
+
const header = renderRow(columns.map((column) => column.title));
|
|
17
|
+
const separator = widths.map((width) => '-'.repeat(width)).join(' ');
|
|
18
|
+
const body = rows
|
|
19
|
+
.map((row) => renderRow(columns.map((column) => String(row[String(column.key)] ?? ''))))
|
|
20
|
+
.join('\n');
|
|
21
|
+
return `${header}\n${separator}\n${body}`;
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=table.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"table.js","sourceRoot":"","sources":["../../src/formatters/table.ts"],"names":[],"mappings":";;AAKA,kCAqBC;AArBD,SAAgB,WAAW,CAAmB,IAAS,EAAE,OAA8B;IACrF,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtB,OAAO,aAAa,CAAC;IACvB,CAAC;IAED,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE;QACpC,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;YACzC,MAAM,KAAK,GAAI,GAA+B,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;YACnE,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC;QACnD,CAAC,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QACxB,OAAO,SAAS,CAAC;IACnB,CAAC,CAAC,CAAC;IAEH,MAAM,SAAS,GAAG,CAAC,MAAgB,EAAU,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACjH,MAAM,MAAM,GAAG,SAAS,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;IAChE,MAAM,SAAS,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACtE,MAAM,IAAI,GAAG,IAAI;SACd,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,SAAS,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAE,GAA+B,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;SACpH,IAAI,CAAC,IAAI,CAAC,CAAC;IAEd,OAAO,GAAG,MAAM,KAAK,SAAS,KAAK,IAAI,EAAE,CAAC;AAC5C,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { CrawlStartResponse, CrawlStatusResponse, CreditsResponse, MapResponse, ScrapeResponse, SearchResponse, WhoAmIResponse } from '../types/api';
|
|
2
|
+
export declare function formatLoginSuccess(configPath: string): string;
|
|
3
|
+
export declare function formatWhoami(data: WhoAmIResponse): string;
|
|
4
|
+
export declare function formatScrape(data: ScrapeResponse): string;
|
|
5
|
+
export declare function formatSearch(data: SearchResponse): string;
|
|
6
|
+
export declare function formatCredits(data: CreditsResponse): string;
|
|
7
|
+
export declare function formatMap(data: MapResponse): string;
|
|
8
|
+
export declare function formatCrawlStart(data: CrawlStartResponse): string;
|
|
9
|
+
export declare function formatCrawlStatus(data: CrawlStatusResponse): string;
|
|
10
|
+
export declare function formatConfigGet(key: string, value: unknown): string;
|
|
11
|
+
export declare function formatConfigSet(key: string, value: unknown, configPath: string): string;
|
|
12
|
+
export interface DoctorCheck {
|
|
13
|
+
name: string;
|
|
14
|
+
ok: boolean;
|
|
15
|
+
detail: string;
|
|
16
|
+
}
|
|
17
|
+
export interface DoctorReport {
|
|
18
|
+
version: string;
|
|
19
|
+
checks: DoctorCheck[];
|
|
20
|
+
}
|
|
21
|
+
export declare function formatDoctorReport(report: DoctorReport): string;
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.formatLoginSuccess = formatLoginSuccess;
|
|
4
|
+
exports.formatWhoami = formatWhoami;
|
|
5
|
+
exports.formatScrape = formatScrape;
|
|
6
|
+
exports.formatSearch = formatSearch;
|
|
7
|
+
exports.formatCredits = formatCredits;
|
|
8
|
+
exports.formatMap = formatMap;
|
|
9
|
+
exports.formatCrawlStart = formatCrawlStart;
|
|
10
|
+
exports.formatCrawlStatus = formatCrawlStatus;
|
|
11
|
+
exports.formatConfigGet = formatConfigGet;
|
|
12
|
+
exports.formatConfigSet = formatConfigSet;
|
|
13
|
+
exports.formatDoctorReport = formatDoctorReport;
|
|
14
|
+
function formatLoginSuccess(configPath) {
|
|
15
|
+
return `API key saved to: ${configPath}`;
|
|
16
|
+
}
|
|
17
|
+
function formatWhoami(data) {
|
|
18
|
+
return [
|
|
19
|
+
`Account: ${data.name ?? 'N/A'}`,
|
|
20
|
+
`Email: ${data.email}`,
|
|
21
|
+
`Plan: ${data.plan ?? 'N/A'}`,
|
|
22
|
+
`ID: ${data.id}`
|
|
23
|
+
].join('\n');
|
|
24
|
+
}
|
|
25
|
+
function formatScrape(data) {
|
|
26
|
+
const metadata = data.metadata ? `\nMetadata: ${JSON.stringify(data.metadata)}` : '';
|
|
27
|
+
return `URL: ${data.url}\nFormat: ${data.format}\n\n${data.content}${metadata}`;
|
|
28
|
+
}
|
|
29
|
+
function formatSearch(data) {
|
|
30
|
+
if (data.results.length === 0) {
|
|
31
|
+
return `Query: ${data.query}\nNo results.`;
|
|
32
|
+
}
|
|
33
|
+
const lines = data.results.map((item, index) => {
|
|
34
|
+
const snippet = item.snippet ? `\n ${item.snippet}` : '';
|
|
35
|
+
return `${index + 1}. ${item.title}\n ${item.url}${snippet}`;
|
|
36
|
+
});
|
|
37
|
+
return `Query: ${data.query}\n\n${lines.join('\n\n')}`;
|
|
38
|
+
}
|
|
39
|
+
function formatCredits(data) {
|
|
40
|
+
return [
|
|
41
|
+
`Remaining: ${data.remaining}`,
|
|
42
|
+
`Used: ${data.used}`,
|
|
43
|
+
`Total: ${data.total}`,
|
|
44
|
+
`Reset At: ${data.resetAt ?? 'N/A'}`
|
|
45
|
+
].join('\n');
|
|
46
|
+
}
|
|
47
|
+
function formatMap(data) {
|
|
48
|
+
if (data.links.length === 0) {
|
|
49
|
+
return `Source URL: ${data.url}\nTotal links: 0`;
|
|
50
|
+
}
|
|
51
|
+
const lines = data.links.map((link, index) => `${index + 1}. ${link.title ?? 'Untitled'}\n ${link.url}`);
|
|
52
|
+
return `Source URL: ${data.url}\nTotal links: ${data.total}\n\n${lines.join('\n\n')}`;
|
|
53
|
+
}
|
|
54
|
+
function formatCrawlStart(data) {
|
|
55
|
+
return [`Job ID: ${data.jobId}`, `URL: ${data.url}`, `Status: ${data.status}`].join('\n');
|
|
56
|
+
}
|
|
57
|
+
function formatCrawlStatus(data) {
|
|
58
|
+
return [
|
|
59
|
+
`Job ID: ${data.jobId}`,
|
|
60
|
+
`URL: ${data.url}`,
|
|
61
|
+
`Status: ${data.status}`,
|
|
62
|
+
`Completed pages: ${data.completedPages ?? 0}`,
|
|
63
|
+
`Failed pages: ${data.failedPages ?? 0}`,
|
|
64
|
+
`Started at: ${data.startedAt ?? 'N/A'}`,
|
|
65
|
+
`Finished at: ${data.finishedAt ?? 'N/A'}`
|
|
66
|
+
].join('\n');
|
|
67
|
+
}
|
|
68
|
+
function formatConfigGet(key, value) {
|
|
69
|
+
return `${key}: ${value === undefined ? 'undefined' : String(value)}`;
|
|
70
|
+
}
|
|
71
|
+
function formatConfigSet(key, value, configPath) {
|
|
72
|
+
return [`Updated ${key}: ${String(value)}`, `Config path: ${configPath}`].join('\n');
|
|
73
|
+
}
|
|
74
|
+
function formatDoctorReport(report) {
|
|
75
|
+
const lines = report.checks.map((check) => `${check.ok ? 'OK' : 'FAIL'} ${check.name}: ${check.detail}`);
|
|
76
|
+
return [`XCrawl CLI ${report.version}`, ...lines].join('\n');
|
|
77
|
+
}
|
|
78
|
+
//# sourceMappingURL=text.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"text.js","sourceRoot":"","sources":["../../src/formatters/text.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { Command } from 'commander';
|
|
3
|
+
import type { CliContext } from './types/cli';
|
|
4
|
+
export declare function createDefaultContext(overrides?: Partial<CliContext>): CliContext;
|
|
5
|
+
export declare function createProgram(context: CliContext): Command;
|
|
6
|
+
export declare function runCli(argv: string[], contextOverrides?: Partial<CliContext>): Promise<number>;
|
|
7
|
+
export declare const projectRoot: string;
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
"use strict";
|
|
3
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
4
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
5
|
+
};
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.projectRoot = void 0;
|
|
8
|
+
exports.createDefaultContext = createDefaultContext;
|
|
9
|
+
exports.createProgram = createProgram;
|
|
10
|
+
exports.runCli = runCli;
|
|
11
|
+
const node_os_1 = __importDefault(require("node:os"));
|
|
12
|
+
const node_path_1 = __importDefault(require("node:path"));
|
|
13
|
+
const commander_1 = require("commander");
|
|
14
|
+
const client_1 = require("./api/client");
|
|
15
|
+
const config_1 = require("./commands/config");
|
|
16
|
+
const crawl_1 = require("./commands/crawl");
|
|
17
|
+
const credits_1 = require("./commands/credits");
|
|
18
|
+
const doctor_1 = require("./commands/doctor");
|
|
19
|
+
const init_1 = require("./commands/init");
|
|
20
|
+
const login_1 = require("./commands/login");
|
|
21
|
+
const map_1 = require("./commands/map");
|
|
22
|
+
const scrape_1 = require("./commands/scrape");
|
|
23
|
+
const search_1 = require("./commands/search");
|
|
24
|
+
const whoami_1 = require("./commands/whoami");
|
|
25
|
+
const errors_1 = require("./core/errors");
|
|
26
|
+
const KNOWN_COMMANDS = new Set([
|
|
27
|
+
'login',
|
|
28
|
+
'whoami',
|
|
29
|
+
'scrape',
|
|
30
|
+
'search',
|
|
31
|
+
'credits',
|
|
32
|
+
'doctor',
|
|
33
|
+
'map',
|
|
34
|
+
'crawl',
|
|
35
|
+
'config',
|
|
36
|
+
'init',
|
|
37
|
+
'help'
|
|
38
|
+
]);
|
|
39
|
+
function normalizeArgv(argv) {
|
|
40
|
+
if (argv.length === 0) {
|
|
41
|
+
return argv;
|
|
42
|
+
}
|
|
43
|
+
if (argv[0] === 'crawl' && argv.length > 1) {
|
|
44
|
+
const second = argv[1];
|
|
45
|
+
if (!second.startsWith('-') && second !== 'start' && second !== 'status' && second !== 'help') {
|
|
46
|
+
return ['crawl', 'start', ...argv.slice(1)];
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
const [first] = argv;
|
|
50
|
+
if (first.startsWith('-') || KNOWN_COMMANDS.has(first)) {
|
|
51
|
+
return argv;
|
|
52
|
+
}
|
|
53
|
+
return ['scrape', ...argv];
|
|
54
|
+
}
|
|
55
|
+
function createDefaultContext(overrides = {}) {
|
|
56
|
+
return {
|
|
57
|
+
stdout: process.stdout,
|
|
58
|
+
stderr: process.stderr,
|
|
59
|
+
env: process.env,
|
|
60
|
+
cwd: process.cwd(),
|
|
61
|
+
homeDir: node_os_1.default.homedir(),
|
|
62
|
+
now: () => new Date(),
|
|
63
|
+
version: process.env.npm_package_version ?? '0.1.0',
|
|
64
|
+
createApiClient: (config) => new client_1.ApiClient({
|
|
65
|
+
baseUrl: config.apiBaseUrl,
|
|
66
|
+
apiKey: config.apiKey,
|
|
67
|
+
timeoutMs: config.timeoutMs,
|
|
68
|
+
debug: config.debug
|
|
69
|
+
}),
|
|
70
|
+
...overrides
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
function createProgram(context) {
|
|
74
|
+
const program = new commander_1.Command();
|
|
75
|
+
program.name('xcrawl').description('XCrawl CLI').version(context.version);
|
|
76
|
+
(0, login_1.registerLoginCommand)(program, context);
|
|
77
|
+
(0, whoami_1.registerWhoamiCommand)(program, context);
|
|
78
|
+
(0, scrape_1.registerScrapeCommand)(program, context);
|
|
79
|
+
(0, search_1.registerSearchCommand)(program, context);
|
|
80
|
+
(0, credits_1.registerCreditsCommand)(program, context);
|
|
81
|
+
(0, doctor_1.registerDoctorCommand)(program, context);
|
|
82
|
+
(0, map_1.registerMapCommand)(program, context);
|
|
83
|
+
(0, crawl_1.registerCrawlCommand)(program, context);
|
|
84
|
+
(0, config_1.registerConfigCommand)(program, context);
|
|
85
|
+
(0, init_1.registerInitCommand)(program);
|
|
86
|
+
program.showHelpAfterError('(Use --help to view command usage)');
|
|
87
|
+
program.exitOverride();
|
|
88
|
+
return program;
|
|
89
|
+
}
|
|
90
|
+
async function runCli(argv, contextOverrides = {}) {
|
|
91
|
+
const context = createDefaultContext(contextOverrides);
|
|
92
|
+
const program = createProgram(context);
|
|
93
|
+
try {
|
|
94
|
+
const normalizedArgv = normalizeArgv(argv);
|
|
95
|
+
await program.parseAsync(normalizedArgv, { from: 'user' });
|
|
96
|
+
return 0;
|
|
97
|
+
}
|
|
98
|
+
catch (error) {
|
|
99
|
+
if (error instanceof commander_1.CommanderError) {
|
|
100
|
+
if (error.code !== 'commander.helpDisplayed') {
|
|
101
|
+
context.stderr.write(`${error.message}\n`);
|
|
102
|
+
}
|
|
103
|
+
return error.exitCode;
|
|
104
|
+
}
|
|
105
|
+
context.stderr.write(`${(0, errors_1.formatErrorForUser)(error)}\n`);
|
|
106
|
+
return 1;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
async function main() {
|
|
110
|
+
const exitCode = await runCli(process.argv.slice(2));
|
|
111
|
+
process.exitCode = exitCode;
|
|
112
|
+
}
|
|
113
|
+
if (require.main === module) {
|
|
114
|
+
void main();
|
|
115
|
+
}
|
|
116
|
+
exports.projectRoot = node_path_1.default.resolve(__dirname, '..');
|
|
117
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
import type { OutputFormat } from './config';
|
|
2
|
+
export interface ApiRequestOptions {
|
|
3
|
+
query?: Record<string, string | number | boolean | undefined>;
|
|
4
|
+
headers?: Record<string, string>;
|
|
5
|
+
body?: unknown;
|
|
6
|
+
timeoutMs?: number;
|
|
7
|
+
}
|
|
8
|
+
export interface ApiTransport {
|
|
9
|
+
get<T>(path: string, options?: ApiRequestOptions): Promise<T>;
|
|
10
|
+
post<T>(path: string, options?: ApiRequestOptions): Promise<T>;
|
|
11
|
+
}
|
|
12
|
+
export interface WhoAmIResponse {
|
|
13
|
+
id: string;
|
|
14
|
+
email: string;
|
|
15
|
+
name?: string;
|
|
16
|
+
plan?: string;
|
|
17
|
+
}
|
|
18
|
+
export interface ScrapeRequest {
|
|
19
|
+
url: string;
|
|
20
|
+
format?: OutputFormat;
|
|
21
|
+
timeoutMs?: number;
|
|
22
|
+
waitFor?: string;
|
|
23
|
+
headers?: Record<string, string>;
|
|
24
|
+
cookies?: string;
|
|
25
|
+
proxy?: string;
|
|
26
|
+
}
|
|
27
|
+
export interface ScrapeResponse {
|
|
28
|
+
url: string;
|
|
29
|
+
format: OutputFormat;
|
|
30
|
+
content: string;
|
|
31
|
+
metadata?: Record<string, unknown>;
|
|
32
|
+
}
|
|
33
|
+
export interface RawScrapeResponse {
|
|
34
|
+
scrape_id?: string;
|
|
35
|
+
endpoint?: string;
|
|
36
|
+
version?: string;
|
|
37
|
+
status?: string;
|
|
38
|
+
url?: string;
|
|
39
|
+
data?: {
|
|
40
|
+
html?: string;
|
|
41
|
+
raw_html?: string;
|
|
42
|
+
markdown?: string;
|
|
43
|
+
summary?: string;
|
|
44
|
+
screenshot?: string;
|
|
45
|
+
json?: unknown;
|
|
46
|
+
metadata?: Record<string, unknown>;
|
|
47
|
+
};
|
|
48
|
+
started_at?: string;
|
|
49
|
+
ended_at?: string;
|
|
50
|
+
total_credits_used?: number;
|
|
51
|
+
}
|
|
52
|
+
export interface SearchRequest {
|
|
53
|
+
query: string;
|
|
54
|
+
limit?: number;
|
|
55
|
+
country?: string;
|
|
56
|
+
language?: string;
|
|
57
|
+
}
|
|
58
|
+
export interface SearchResultItem {
|
|
59
|
+
title: string;
|
|
60
|
+
url: string;
|
|
61
|
+
snippet?: string;
|
|
62
|
+
}
|
|
63
|
+
export interface SearchResponse {
|
|
64
|
+
query: string;
|
|
65
|
+
results: SearchResultItem[];
|
|
66
|
+
}
|
|
67
|
+
export interface RawSearchResultItem {
|
|
68
|
+
title?: string | null;
|
|
69
|
+
url?: string;
|
|
70
|
+
description?: string;
|
|
71
|
+
}
|
|
72
|
+
export interface RawSearchResponse {
|
|
73
|
+
search_id?: string;
|
|
74
|
+
endpoint?: string;
|
|
75
|
+
version?: string;
|
|
76
|
+
status?: string;
|
|
77
|
+
query?: string;
|
|
78
|
+
data?: {
|
|
79
|
+
data?: RawSearchResultItem[];
|
|
80
|
+
};
|
|
81
|
+
started_at?: string;
|
|
82
|
+
ended_at?: string;
|
|
83
|
+
total_credits_used?: number;
|
|
84
|
+
}
|
|
85
|
+
export interface CreditsResponse {
|
|
86
|
+
remaining: number;
|
|
87
|
+
used: number;
|
|
88
|
+
total: number;
|
|
89
|
+
resetAt?: string;
|
|
90
|
+
}
|
|
91
|
+
export interface MapRequest {
|
|
92
|
+
url: string;
|
|
93
|
+
maxDepth?: number;
|
|
94
|
+
limit?: number;
|
|
95
|
+
}
|
|
96
|
+
export interface MapLink {
|
|
97
|
+
url: string;
|
|
98
|
+
title?: string;
|
|
99
|
+
}
|
|
100
|
+
export interface MapResponse {
|
|
101
|
+
url: string;
|
|
102
|
+
links: MapLink[];
|
|
103
|
+
total: number;
|
|
104
|
+
}
|
|
105
|
+
export interface RawMapResponse {
|
|
106
|
+
map_id?: string;
|
|
107
|
+
endpoint?: string;
|
|
108
|
+
version?: string;
|
|
109
|
+
status?: string;
|
|
110
|
+
url?: string;
|
|
111
|
+
data?: {
|
|
112
|
+
links?: Array<string | {
|
|
113
|
+
url?: string;
|
|
114
|
+
title?: string;
|
|
115
|
+
}>;
|
|
116
|
+
total_links?: number;
|
|
117
|
+
};
|
|
118
|
+
started_at?: string;
|
|
119
|
+
ended_at?: string;
|
|
120
|
+
total_credits_used?: number;
|
|
121
|
+
}
|
|
122
|
+
export type CrawlJobStatus = 'pending' | 'crawling' | 'queued' | 'running' | 'completed' | 'failed';
|
|
123
|
+
export interface CrawlStartRequest {
|
|
124
|
+
url: string;
|
|
125
|
+
maxPages?: number;
|
|
126
|
+
}
|
|
127
|
+
export interface CrawlStartResponse {
|
|
128
|
+
jobId: string;
|
|
129
|
+
url: string;
|
|
130
|
+
status: CrawlJobStatus;
|
|
131
|
+
}
|
|
132
|
+
export interface CrawlStatusResponse {
|
|
133
|
+
jobId: string;
|
|
134
|
+
url: string;
|
|
135
|
+
status: CrawlJobStatus;
|
|
136
|
+
completedPages?: number;
|
|
137
|
+
failedPages?: number;
|
|
138
|
+
startedAt?: string;
|
|
139
|
+
finishedAt?: string;
|
|
140
|
+
}
|
|
141
|
+
export interface RawCrawlStartResponse {
|
|
142
|
+
crawl_id?: string;
|
|
143
|
+
endpoint?: string;
|
|
144
|
+
version?: string;
|
|
145
|
+
status?: string;
|
|
146
|
+
url?: string;
|
|
147
|
+
}
|
|
148
|
+
export interface RawCrawlStatusResponse {
|
|
149
|
+
crawl_id?: string;
|
|
150
|
+
endpoint?: string;
|
|
151
|
+
version?: string;
|
|
152
|
+
status?: string;
|
|
153
|
+
url?: string;
|
|
154
|
+
data?: {
|
|
155
|
+
data?: unknown[];
|
|
156
|
+
};
|
|
157
|
+
started_at?: string;
|
|
158
|
+
ended_at?: string;
|
|
159
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api.js","sourceRoot":"","sources":["../../src/types/api.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { ApiTransport } from './api';
|
|
2
|
+
import type { RuntimeConfig } from './config';
|
|
3
|
+
export interface CliContext {
|
|
4
|
+
stdout: NodeJS.WritableStream;
|
|
5
|
+
stderr: NodeJS.WritableStream;
|
|
6
|
+
env: NodeJS.ProcessEnv;
|
|
7
|
+
cwd: string;
|
|
8
|
+
homeDir: string;
|
|
9
|
+
now: () => Date;
|
|
10
|
+
version: string;
|
|
11
|
+
createApiClient: (config: RuntimeConfig) => ApiTransport;
|
|
12
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/types/cli.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
export type OutputFormat = 'markdown' | 'json' | 'html' | 'screenshot' | 'text';
|
|
2
|
+
export interface XCrawlConfig {
|
|
3
|
+
apiKey?: string;
|
|
4
|
+
apiBaseUrl?: string;
|
|
5
|
+
defaultFormat?: OutputFormat;
|
|
6
|
+
outputDir?: string;
|
|
7
|
+
timeoutMs?: number;
|
|
8
|
+
debug?: boolean;
|
|
9
|
+
}
|
|
10
|
+
export interface RuntimeConfig {
|
|
11
|
+
apiKey?: string;
|
|
12
|
+
apiBaseUrl: string;
|
|
13
|
+
defaultFormat: OutputFormat;
|
|
14
|
+
outputDir: string;
|
|
15
|
+
timeoutMs: number;
|
|
16
|
+
debug: boolean;
|
|
17
|
+
}
|
|
18
|
+
export type ConfigField = keyof XCrawlConfig;
|
|
19
|
+
export type ConfigKey = 'api-key' | 'api-base-url' | 'default-format' | 'output-dir' | 'timeout-ms' | 'debug';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/types/config.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function runWithConcurrency<T, R>(items: T[], concurrency: number, worker: (item: T, index: number) => Promise<R>): Promise<R[]>;
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.runWithConcurrency = runWithConcurrency;
|
|
4
|
+
async function runWithConcurrency(items, concurrency, worker) {
|
|
5
|
+
const limit = Math.max(1, concurrency);
|
|
6
|
+
const results = new Array(items.length);
|
|
7
|
+
let nextIndex = 0;
|
|
8
|
+
async function runner() {
|
|
9
|
+
while (true) {
|
|
10
|
+
const currentIndex = nextIndex;
|
|
11
|
+
nextIndex += 1;
|
|
12
|
+
if (currentIndex >= items.length) {
|
|
13
|
+
return;
|
|
14
|
+
}
|
|
15
|
+
results[currentIndex] = await worker(items[currentIndex], currentIndex);
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
await Promise.all(Array.from({ length: Math.min(limit, items.length) }, () => runner()));
|
|
19
|
+
return results;
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=concurrency.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"concurrency.js","sourceRoot":"","sources":["../../src/utils/concurrency.ts"],"names":[],"mappings":";;AAAA,gDAwBC;AAxBM,KAAK,UAAU,kBAAkB,CACtC,KAAU,EACV,WAAmB,EACnB,MAA8C;IAE9C,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC;IACvC,MAAM,OAAO,GAAQ,IAAI,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IAC7C,IAAI,SAAS,GAAG,CAAC,CAAC;IAElB,KAAK,UAAU,MAAM;QACnB,OAAO,IAAI,EAAE,CAAC;YACZ,MAAM,YAAY,GAAG,SAAS,CAAC;YAC/B,SAAS,IAAI,CAAC,CAAC;YAEf,IAAI,YAAY,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;gBACjC,OAAO;YACT,CAAC;YAED,OAAO,CAAC,YAAY,CAAC,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,EAAE,YAAY,CAAC,CAAC;QAC1E,CAAC;IACH,CAAC;IAED,MAAM,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,EAAE,EAAE,GAAG,EAAE,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IACzF,OAAO,OAAO,CAAC;AACjB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function nowIso(now?: () => Date): string;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"time.js","sourceRoot":"","sources":["../../src/utils/time.ts"],"names":[],"mappings":";;AAAA,wBAEC;AAFD,SAAgB,MAAM,CAAC,MAAkB,GAAG,EAAE,CAAC,IAAI,IAAI,EAAE;IACvD,OAAO,GAAG,EAAE,CAAC,WAAW,EAAE,CAAC;AAC7B,CAAC"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.assertHttpUrl = assertHttpUrl;
|
|
4
|
+
exports.parseHeaders = parseHeaders;
|
|
5
|
+
exports.parsePositiveInt = parsePositiveInt;
|
|
6
|
+
const errors_1 = require("../core/errors");
|
|
7
|
+
function assertHttpUrl(value) {
|
|
8
|
+
try {
|
|
9
|
+
const url = new URL(value);
|
|
10
|
+
if (!['http:', 'https:'].includes(url.protocol)) {
|
|
11
|
+
throw new errors_1.ValidationError(`Unsupported URL protocol: ${url.protocol}`, 'Use a URL that starts with http:// or https://.');
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
catch (error) {
|
|
15
|
+
if (error instanceof errors_1.ValidationError) {
|
|
16
|
+
throw error;
|
|
17
|
+
}
|
|
18
|
+
throw new errors_1.ValidationError(`Invalid URL: ${value}`, 'Please verify the URL format.', error);
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
function parseHeaders(value) {
|
|
22
|
+
if (!value) {
|
|
23
|
+
return undefined;
|
|
24
|
+
}
|
|
25
|
+
const result = {};
|
|
26
|
+
const segments = value.split(',').map((item) => item.trim()).filter(Boolean);
|
|
27
|
+
for (const segment of segments) {
|
|
28
|
+
const [rawKey, ...rawValue] = segment.split(':');
|
|
29
|
+
const key = rawKey?.trim();
|
|
30
|
+
const headerValue = rawValue.join(':').trim();
|
|
31
|
+
if (!key || !headerValue) {
|
|
32
|
+
throw new errors_1.ValidationError(`Invalid headers argument: ${segment}`, 'Use the format "Key:Value,Key2:Value2".');
|
|
33
|
+
}
|
|
34
|
+
result[key] = headerValue;
|
|
35
|
+
}
|
|
36
|
+
return result;
|
|
37
|
+
}
|
|
38
|
+
function parsePositiveInt(input, fieldName) {
|
|
39
|
+
if (!input) {
|
|
40
|
+
return undefined;
|
|
41
|
+
}
|
|
42
|
+
const value = Number.parseInt(input, 10);
|
|
43
|
+
if (!Number.isFinite(value) || value <= 0) {
|
|
44
|
+
throw new errors_1.ValidationError(`${fieldName} must be a positive integer.`, `Pass an integer greater than 0 for ${fieldName}.`);
|
|
45
|
+
}
|
|
46
|
+
return value;
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=validate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate.js","sourceRoot":"","sources":["../../src/utils/validate.ts"],"names":[],"mappings":";;AAEA,sCAgBC;AAED,oCAwBC;AAED,4CAWC;AAzDD,2CAAiD;AAEjD,SAAgB,aAAa,CAAC,KAAa;IACzC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC;QAC3B,IAAI,CAAC,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;YAChD,MAAM,IAAI,wBAAe,CACvB,6BAA6B,GAAG,CAAC,QAAQ,EAAE,EAC3C,iDAAiD,CAClD,CAAC;QACJ,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,wBAAe,EAAE,CAAC;YACrC,MAAM,KAAK,CAAC;QACd,CAAC;QAED,MAAM,IAAI,wBAAe,CAAC,gBAAgB,KAAK,EAAE,EAAE,+BAA+B,EAAE,KAAK,CAAC,CAAC;IAC7F,CAAC;AACH,CAAC;AAED,SAAgB,YAAY,CAAC,KAAyB;IACpD,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,MAAM,GAA2B,EAAE,CAAC;IAC1C,MAAM,QAAQ,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAE7E,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,MAAM,CAAC,MAAM,EAAE,GAAG,QAAQ,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACjD,MAAM,GAAG,GAAG,MAAM,EAAE,IAAI,EAAE,CAAC;QAC3B,MAAM,WAAW,GAAG,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;QAE9C,IAAI,CAAC,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;YACzB,MAAM,IAAI,wBAAe,CACvB,6BAA6B,OAAO,EAAE,EACtC,yCAAyC,CAC1C,CAAC;QACJ,CAAC;QAED,MAAM,CAAC,GAAG,CAAC,GAAG,WAAW,CAAC;IAC5B,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAgB,gBAAgB,CAAC,KAAyB,EAAE,SAAiB;IAC3E,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,KAAK,GAAG,MAAM,CAAC,QAAQ,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IACzC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC,EAAE,CAAC;QAC1C,MAAM,IAAI,wBAAe,CAAC,GAAG,SAAS,8BAA8B,EAAE,sCAAsC,SAAS,GAAG,CAAC,CAAC;IAC5H,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC"}
|