@okrapdf/cli 0.1.0 → 0.1.2
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 +163 -0
- package/dist/cli.d.ts +19 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +175 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/auth.d.ts +6 -0
- package/dist/commands/auth.d.ts.map +1 -0
- package/dist/commands/auth.js +155 -0
- package/dist/commands/auth.js.map +1 -0
- package/dist/commands/chat.d.ts +6 -0
- package/dist/commands/chat.d.ts.map +1 -0
- package/dist/commands/chat.js +218 -0
- package/dist/commands/chat.js.map +1 -0
- package/dist/commands/docs.d.ts +6 -0
- package/dist/commands/docs.d.ts.map +1 -0
- package/dist/commands/docs.js +181 -0
- package/dist/commands/docs.js.map +1 -0
- package/dist/commands/jobs.d.ts +6 -0
- package/dist/commands/jobs.d.ts.map +1 -0
- package/dist/commands/jobs.js +348 -0
- package/dist/commands/jobs.js.map +1 -0
- package/dist/commands/jobs.test.d.ts +5 -0
- package/dist/commands/jobs.test.d.ts.map +1 -0
- package/dist/commands/jobs.test.js +118 -0
- package/dist/commands/jobs.test.js.map +1 -0
- package/dist/commands/logs.d.ts +8 -0
- package/dist/commands/logs.d.ts.map +1 -0
- package/dist/commands/logs.js +186 -0
- package/dist/commands/logs.js.map +1 -0
- package/dist/commands/processors.d.ts +8 -0
- package/dist/commands/processors.d.ts.map +1 -0
- package/dist/commands/processors.js +91 -0
- package/dist/commands/processors.js.map +1 -0
- package/dist/commands/review.d.ts +3 -0
- package/dist/commands/review.d.ts.map +1 -0
- package/dist/commands/review.js +370 -0
- package/dist/commands/review.js.map +1 -0
- package/dist/commands/shortcuts.d.ts +20 -0
- package/dist/commands/shortcuts.d.ts.map +1 -0
- package/dist/commands/shortcuts.js +405 -0
- package/dist/commands/shortcuts.js.map +1 -0
- package/dist/commands/tables.d.ts +6 -0
- package/dist/commands/tables.d.ts.map +1 -0
- package/dist/commands/tables.js +189 -0
- package/dist/commands/tables.js.map +1 -0
- package/dist/commands/templates.d.ts +8 -0
- package/dist/commands/templates.d.ts.map +1 -0
- package/dist/commands/templates.js +202 -0
- package/dist/commands/templates.js.map +1 -0
- package/dist/index.d.ts +14 -412
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +23 -46
- package/dist/index.js.map +1 -1
- package/dist/lib/browser.d.ts +11 -0
- package/dist/lib/browser.d.ts.map +1 -0
- package/dist/lib/browser.js +33 -0
- package/dist/lib/browser.js.map +1 -0
- package/dist/lib/client.d.ts +57 -0
- package/dist/lib/client.d.ts.map +1 -0
- package/dist/lib/client.js +176 -0
- package/dist/lib/client.js.map +1 -0
- package/dist/lib/config.d.ts +56 -0
- package/dist/lib/config.d.ts.map +1 -0
- package/dist/lib/config.js +110 -0
- package/dist/lib/config.js.map +1 -0
- package/dist/lib/config.test.d.ts +5 -0
- package/dist/lib/config.test.d.ts.map +1 -0
- package/dist/lib/config.test.js +81 -0
- package/dist/lib/config.test.js.map +1 -0
- package/dist/lib/logs.d.ts +89 -0
- package/dist/lib/logs.d.ts.map +1 -0
- package/dist/lib/logs.js +196 -0
- package/dist/lib/logs.js.map +1 -0
- package/dist/lib/logs.test.d.ts +5 -0
- package/dist/lib/logs.test.d.ts.map +1 -0
- package/dist/lib/logs.test.js +183 -0
- package/dist/lib/logs.test.js.map +1 -0
- package/dist/lib/output.d.ts +73 -0
- package/dist/lib/output.d.ts.map +1 -0
- package/dist/lib/output.js +204 -0
- package/dist/lib/output.js.map +1 -0
- package/dist/lib/output.test.d.ts +5 -0
- package/dist/lib/output.test.d.ts.map +1 -0
- package/dist/lib/output.test.js +174 -0
- package/dist/lib/output.test.js.map +1 -0
- package/dist/lib/processors.d.ts +73 -0
- package/dist/lib/processors.d.ts.map +1 -0
- package/dist/lib/processors.js +94 -0
- package/dist/lib/processors.js.map +1 -0
- package/dist/lib/processors.test.d.ts +5 -0
- package/dist/lib/processors.test.d.ts.map +1 -0
- package/dist/lib/processors.test.js +83 -0
- package/dist/lib/processors.test.js.map +1 -0
- package/dist/lib/progress.d.ts +44 -0
- package/dist/lib/progress.d.ts.map +1 -0
- package/dist/lib/progress.js +102 -0
- package/dist/lib/progress.js.map +1 -0
- package/dist/lib/templates.d.ts +56 -0
- package/dist/lib/templates.d.ts.map +1 -0
- package/dist/lib/templates.js +204 -0
- package/dist/lib/templates.js.map +1 -0
- package/dist/lib/templates.test.d.ts +5 -0
- package/dist/lib/templates.test.d.ts.map +1 -0
- package/dist/lib/templates.test.js +101 -0
- package/dist/lib/templates.test.js.map +1 -0
- package/dist/types.d.ts +144 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +5 -0
- package/dist/types.js.map +1 -0
- package/package.json +56 -25
- package/dist/bin.d.ts +0 -1
- package/dist/bin.js +0 -152
- package/dist/bin.js.map +0 -1
- package/dist/chunk-A6YTW4WL.js +0 -499
- package/dist/chunk-A6YTW4WL.js.map +0 -1
package/dist/index.js
CHANGED
|
@@ -1,47 +1,24 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
}
|
|
24
|
-
export {
|
|
25
|
-
calculateStats,
|
|
26
|
-
executeQuery,
|
|
27
|
-
filterEntities,
|
|
28
|
-
find,
|
|
29
|
-
formatFindOutput,
|
|
30
|
-
formatHistoryOutput,
|
|
31
|
-
formatPageOutput,
|
|
32
|
-
formatSearchOutput,
|
|
33
|
-
formatStats,
|
|
34
|
-
formatTablesOutput,
|
|
35
|
-
formatTreeOutput,
|
|
36
|
-
formatVersionsOutput,
|
|
37
|
-
history,
|
|
38
|
-
pageEdit,
|
|
39
|
-
pageGet,
|
|
40
|
-
pageResolve,
|
|
41
|
-
pageVersions,
|
|
42
|
-
parseSelector,
|
|
43
|
-
search,
|
|
44
|
-
tables,
|
|
45
|
-
tree
|
|
46
|
-
};
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* OkraPDF CLI - Entry Point
|
|
4
|
+
*
|
|
5
|
+
* A command-line interface for OkraPDF that provides:
|
|
6
|
+
* - Document management (upload, list, download, delete)
|
|
7
|
+
* - OCR job management (create, status, results, export)
|
|
8
|
+
* - Table extraction and export
|
|
9
|
+
* - Interactive document chat
|
|
10
|
+
*
|
|
11
|
+
* Usage:
|
|
12
|
+
* okra <command> [options]
|
|
13
|
+
*
|
|
14
|
+
* Examples:
|
|
15
|
+
* okra auth login
|
|
16
|
+
* okra extract invoice.pdf
|
|
17
|
+
* okra chat <document-uuid>
|
|
18
|
+
*/
|
|
19
|
+
import { run } from './cli.js';
|
|
20
|
+
run().catch((err) => {
|
|
21
|
+
console.error('Fatal error:', err);
|
|
22
|
+
process.exit(1);
|
|
23
|
+
});
|
|
47
24
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":[],"
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAE/B,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IAClB,OAAO,CAAC,KAAK,CAAC,cAAc,EAAE,GAAG,CAAC,CAAC;IACnC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Browser utilities for opening URLs
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Open a URL in the default browser
|
|
6
|
+
*/
|
|
7
|
+
export declare function openInBrowser(url: string): Promise<void>;
|
|
8
|
+
export declare function getDocumentWebUrl(uuid: string): string;
|
|
9
|
+
export declare function getJobWebUrl(jobId: string): string;
|
|
10
|
+
export declare function getLibraryWebUrl(): string;
|
|
11
|
+
//# sourceMappingURL=browser.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"browser.d.ts","sourceRoot":"","sources":["../../src/lib/browser.ts"],"names":[],"mappings":"AAAA;;GAEG;AAOH;;GAEG;AACH,wBAAsB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAa9D;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEtD;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAElD;AAED,wBAAgB,gBAAgB,IAAI,MAAM,CAEzC"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Browser utilities for opening URLs
|
|
3
|
+
*/
|
|
4
|
+
import { exec } from 'child_process';
|
|
5
|
+
import { promisify } from 'util';
|
|
6
|
+
const execAsync = promisify(exec);
|
|
7
|
+
/**
|
|
8
|
+
* Open a URL in the default browser
|
|
9
|
+
*/
|
|
10
|
+
export async function openInBrowser(url) {
|
|
11
|
+
const platform = process.platform;
|
|
12
|
+
let command;
|
|
13
|
+
if (platform === 'darwin') {
|
|
14
|
+
command = `open "${url}"`;
|
|
15
|
+
}
|
|
16
|
+
else if (platform === 'win32') {
|
|
17
|
+
command = `start "" "${url}"`;
|
|
18
|
+
}
|
|
19
|
+
else {
|
|
20
|
+
command = `xdg-open "${url}"`;
|
|
21
|
+
}
|
|
22
|
+
await execAsync(command);
|
|
23
|
+
}
|
|
24
|
+
export function getDocumentWebUrl(uuid) {
|
|
25
|
+
return `https://app.okrapdf.com/ocr/${uuid}`;
|
|
26
|
+
}
|
|
27
|
+
export function getJobWebUrl(jobId) {
|
|
28
|
+
return `https://app.okrapdf.com/ocr/${jobId}`;
|
|
29
|
+
}
|
|
30
|
+
export function getLibraryWebUrl() {
|
|
31
|
+
return 'https://app.okrapdf.com/ocr';
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=browser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"browser.js","sourceRoot":"","sources":["../../src/lib/browser.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AACrC,OAAO,EAAE,SAAS,EAAE,MAAM,MAAM,CAAC;AAEjC,MAAM,SAAS,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;AAElC;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,GAAW;IAC7C,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC;IAElC,IAAI,OAAe,CAAC;IACpB,IAAI,QAAQ,KAAK,QAAQ,EAAE,CAAC;QAC1B,OAAO,GAAG,SAAS,GAAG,GAAG,CAAC;IAC5B,CAAC;SAAM,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;QAChC,OAAO,GAAG,aAAa,GAAG,GAAG,CAAC;IAChC,CAAC;SAAM,CAAC;QACN,OAAO,GAAG,aAAa,GAAG,GAAG,CAAC;IAChC,CAAC;IAED,MAAM,SAAS,CAAC,OAAO,CAAC,CAAC;AAC3B,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,IAAY;IAC5C,OAAO,+BAA+B,IAAI,EAAE,CAAC;AAC/C,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,KAAa;IACxC,OAAO,+BAA+B,KAAK,EAAE,CAAC;AAChD,CAAC;AAED,MAAM,UAAU,gBAAgB;IAC9B,OAAO,6BAA6B,CAAC;AACvC,CAAC"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* API Client for OkraPDF with retry logic and error handling
|
|
3
|
+
*/
|
|
4
|
+
import { type Got, type Options } from 'got';
|
|
5
|
+
export declare const EXIT_CODES: {
|
|
6
|
+
readonly SUCCESS: 0;
|
|
7
|
+
readonly GENERAL_ERROR: 1;
|
|
8
|
+
readonly INVALID_ARGS: 2;
|
|
9
|
+
readonly AUTH_ERROR: 3;
|
|
10
|
+
readonly NOT_FOUND: 4;
|
|
11
|
+
readonly RATE_LIMITED: 5;
|
|
12
|
+
readonly JOB_FAILED: 6;
|
|
13
|
+
};
|
|
14
|
+
export declare class OkraApiError extends Error {
|
|
15
|
+
readonly code: string;
|
|
16
|
+
readonly statusCode?: number | undefined;
|
|
17
|
+
readonly details?: Record<string, unknown> | undefined;
|
|
18
|
+
constructor(code: string, message: string, statusCode?: number | undefined, details?: Record<string, unknown> | undefined);
|
|
19
|
+
get exitCode(): number;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Create an API client instance
|
|
23
|
+
*/
|
|
24
|
+
export declare function createClient(): Got;
|
|
25
|
+
/**
|
|
26
|
+
* Make an authenticated API request
|
|
27
|
+
*/
|
|
28
|
+
export declare function apiRequest<T>(method: 'GET' | 'POST' | 'PUT' | 'DELETE', endpoint: string, options?: Partial<Options>): Promise<T>;
|
|
29
|
+
/**
|
|
30
|
+
* GET request helper
|
|
31
|
+
*/
|
|
32
|
+
export declare function get<T>(endpoint: string, searchParams?: Record<string, string | number | boolean>): Promise<T>;
|
|
33
|
+
/**
|
|
34
|
+
* POST request helper
|
|
35
|
+
*/
|
|
36
|
+
export declare function post<T>(endpoint: string, json?: unknown): Promise<T>;
|
|
37
|
+
/**
|
|
38
|
+
* PUT request helper
|
|
39
|
+
*/
|
|
40
|
+
export declare function put<T>(endpoint: string, json?: unknown): Promise<T>;
|
|
41
|
+
/**
|
|
42
|
+
* DELETE request helper
|
|
43
|
+
*/
|
|
44
|
+
export declare function del<T>(endpoint: string): Promise<T>;
|
|
45
|
+
/**
|
|
46
|
+
* PATCH request helper
|
|
47
|
+
*/
|
|
48
|
+
export declare function patch<T>(endpoint: string, json?: unknown): Promise<T>;
|
|
49
|
+
/**
|
|
50
|
+
* Upload a file to a signed URL
|
|
51
|
+
*/
|
|
52
|
+
export declare function uploadFile(signedUrl: string, filePath: string, contentType: string): Promise<void>;
|
|
53
|
+
/**
|
|
54
|
+
* Download a file from a URL
|
|
55
|
+
*/
|
|
56
|
+
export declare function downloadFile(url: string, outputPath: string): Promise<void>;
|
|
57
|
+
//# sourceMappingURL=client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/lib/client.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAY,EAAE,KAAK,GAAG,EAAE,KAAK,OAAO,EAAiB,MAAM,KAAK,CAAC;AAKjE,eAAO,MAAM,UAAU;;;;;;;;CAQb,CAAC;AAGX,qBAAa,YAAa,SAAQ,KAAK;aAEnB,IAAI,EAAE,MAAM;aAEZ,UAAU,CAAC,EAAE,MAAM;aACnB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;gBAHjC,IAAI,EAAE,MAAM,EAC5B,OAAO,EAAE,MAAM,EACC,UAAU,CAAC,EAAE,MAAM,YAAA,EACnB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,YAAA;IAMnD,IAAI,QAAQ,IAAI,MAAM,CAWrB;CACF;AAED;;GAEG;AACH,wBAAgB,YAAY,IAAI,GAAG,CAoClC;AAED;;GAEG;AACH,wBAAsB,UAAU,CAAC,CAAC,EAChC,MAAM,EAAE,KAAK,GAAG,MAAM,GAAG,KAAK,GAAG,QAAQ,EACzC,QAAQ,EAAE,MAAM,EAChB,OAAO,GAAE,OAAO,CAAC,OAAO,CAAM,GAC7B,OAAO,CAAC,CAAC,CAAC,CA+DZ;AAED;;GAEG;AACH,wBAAsB,GAAG,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAEnH;AAED;;GAEG;AACH,wBAAsB,IAAI,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC,CAE1E;AAED;;GAEG;AACH,wBAAsB,GAAG,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC,CAEzE;AAED;;GAEG;AACH,wBAAsB,GAAG,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,CAEzD;AAED;;GAEG;AACH,wBAAsB,KAAK,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC,CAE3E;AAED;;GAEG;AACH,wBAAsB,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAexG;AAED;;GAEG;AACH,wBAAsB,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAQjF"}
|
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* API Client for OkraPDF with retry logic and error handling
|
|
3
|
+
*/
|
|
4
|
+
import got from 'got';
|
|
5
|
+
import { getApiKey, getBaseUrl } from './config.js';
|
|
6
|
+
// Exit codes
|
|
7
|
+
export const EXIT_CODES = {
|
|
8
|
+
SUCCESS: 0,
|
|
9
|
+
GENERAL_ERROR: 1,
|
|
10
|
+
INVALID_ARGS: 2,
|
|
11
|
+
AUTH_ERROR: 3,
|
|
12
|
+
NOT_FOUND: 4,
|
|
13
|
+
RATE_LIMITED: 5,
|
|
14
|
+
JOB_FAILED: 6,
|
|
15
|
+
};
|
|
16
|
+
// Custom error class
|
|
17
|
+
export class OkraApiError extends Error {
|
|
18
|
+
code;
|
|
19
|
+
statusCode;
|
|
20
|
+
details;
|
|
21
|
+
constructor(code, message, statusCode, details) {
|
|
22
|
+
super(message);
|
|
23
|
+
this.code = code;
|
|
24
|
+
this.statusCode = statusCode;
|
|
25
|
+
this.details = details;
|
|
26
|
+
this.name = 'OkraApiError';
|
|
27
|
+
}
|
|
28
|
+
get exitCode() {
|
|
29
|
+
if (this.statusCode === 401 || this.statusCode === 403) {
|
|
30
|
+
return EXIT_CODES.AUTH_ERROR;
|
|
31
|
+
}
|
|
32
|
+
if (this.statusCode === 404) {
|
|
33
|
+
return EXIT_CODES.NOT_FOUND;
|
|
34
|
+
}
|
|
35
|
+
if (this.statusCode === 429) {
|
|
36
|
+
return EXIT_CODES.RATE_LIMITED;
|
|
37
|
+
}
|
|
38
|
+
return EXIT_CODES.GENERAL_ERROR;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Create an API client instance
|
|
43
|
+
*/
|
|
44
|
+
export function createClient() {
|
|
45
|
+
const apiKey = getApiKey();
|
|
46
|
+
const baseUrl = getBaseUrl();
|
|
47
|
+
if (!apiKey) {
|
|
48
|
+
throw new OkraApiError('auth_required', 'Not authenticated. Run `okra auth login` first.', 401);
|
|
49
|
+
}
|
|
50
|
+
return got.extend({
|
|
51
|
+
prefixUrl: baseUrl,
|
|
52
|
+
headers: {
|
|
53
|
+
'Authorization': `Bearer ${apiKey}`,
|
|
54
|
+
'Content-Type': 'application/json',
|
|
55
|
+
'User-Agent': 'okrapdf-cli/0.1.0',
|
|
56
|
+
},
|
|
57
|
+
retry: {
|
|
58
|
+
limit: 3,
|
|
59
|
+
methods: ['GET', 'POST', 'PUT', 'DELETE'],
|
|
60
|
+
statusCodes: [408, 429, 500, 502, 503, 504],
|
|
61
|
+
backoffLimit: 8000,
|
|
62
|
+
},
|
|
63
|
+
timeout: {
|
|
64
|
+
request: 60000, // 60 seconds
|
|
65
|
+
},
|
|
66
|
+
hooks: {
|
|
67
|
+
beforeRetry: [
|
|
68
|
+
(error, retryCount) => {
|
|
69
|
+
console.error(`Request failed, retrying (${retryCount}/3)...`);
|
|
70
|
+
},
|
|
71
|
+
],
|
|
72
|
+
},
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Make an authenticated API request
|
|
77
|
+
*/
|
|
78
|
+
export async function apiRequest(method, endpoint, options = {}) {
|
|
79
|
+
const client = createClient();
|
|
80
|
+
try {
|
|
81
|
+
const response = await client(endpoint, {
|
|
82
|
+
method,
|
|
83
|
+
...options,
|
|
84
|
+
responseType: 'json',
|
|
85
|
+
isStream: false,
|
|
86
|
+
});
|
|
87
|
+
const body = response.body;
|
|
88
|
+
// Check if it's a wrapped response with success/error
|
|
89
|
+
if (body && typeof body === 'object' && 'success' in body) {
|
|
90
|
+
const wrapped = body;
|
|
91
|
+
if (!wrapped.success && wrapped.error) {
|
|
92
|
+
throw new OkraApiError(wrapped.error.code, wrapped.error.message, response.statusCode, wrapped.error.details);
|
|
93
|
+
}
|
|
94
|
+
// Return unwrapped data
|
|
95
|
+
if (wrapped.data !== undefined) {
|
|
96
|
+
return wrapped.data;
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
return body;
|
|
100
|
+
}
|
|
101
|
+
catch (error) {
|
|
102
|
+
if (error instanceof OkraApiError) {
|
|
103
|
+
throw error;
|
|
104
|
+
}
|
|
105
|
+
// Handle got errors
|
|
106
|
+
if (error && typeof error === 'object' && 'response' in error) {
|
|
107
|
+
const gotError = error;
|
|
108
|
+
const statusCode = gotError.response?.statusCode;
|
|
109
|
+
const body = gotError.response?.body;
|
|
110
|
+
if (body?.error) {
|
|
111
|
+
throw new OkraApiError(body.error.code, body.error.message, statusCode, body.error.details);
|
|
112
|
+
}
|
|
113
|
+
throw new OkraApiError('request_failed', gotError.message || 'Request failed', statusCode);
|
|
114
|
+
}
|
|
115
|
+
throw new OkraApiError('unknown_error', error instanceof Error ? error.message : 'Unknown error occurred');
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* GET request helper
|
|
120
|
+
*/
|
|
121
|
+
export async function get(endpoint, searchParams) {
|
|
122
|
+
return apiRequest('GET', endpoint, { searchParams });
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* POST request helper
|
|
126
|
+
*/
|
|
127
|
+
export async function post(endpoint, json) {
|
|
128
|
+
return apiRequest('POST', endpoint, { json });
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* PUT request helper
|
|
132
|
+
*/
|
|
133
|
+
export async function put(endpoint, json) {
|
|
134
|
+
return apiRequest('PUT', endpoint, { json });
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* DELETE request helper
|
|
138
|
+
*/
|
|
139
|
+
export async function del(endpoint) {
|
|
140
|
+
return apiRequest('DELETE', endpoint);
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* PATCH request helper
|
|
144
|
+
*/
|
|
145
|
+
export async function patch(endpoint, json) {
|
|
146
|
+
return apiRequest('PATCH', endpoint, { json });
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* Upload a file to a signed URL
|
|
150
|
+
*/
|
|
151
|
+
export async function uploadFile(signedUrl, filePath, contentType) {
|
|
152
|
+
const fs = await import('fs');
|
|
153
|
+
const fileStream = fs.createReadStream(filePath);
|
|
154
|
+
const stats = fs.statSync(filePath);
|
|
155
|
+
await got.put(signedUrl, {
|
|
156
|
+
body: fileStream,
|
|
157
|
+
headers: {
|
|
158
|
+
'Content-Type': contentType,
|
|
159
|
+
'Content-Length': stats.size.toString(),
|
|
160
|
+
},
|
|
161
|
+
retry: {
|
|
162
|
+
limit: 3,
|
|
163
|
+
},
|
|
164
|
+
});
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* Download a file from a URL
|
|
168
|
+
*/
|
|
169
|
+
export async function downloadFile(url, outputPath) {
|
|
170
|
+
const fs = await import('fs');
|
|
171
|
+
const { pipeline } = await import('stream/promises');
|
|
172
|
+
const downloadStream = got.stream(url);
|
|
173
|
+
const writeStream = fs.createWriteStream(outputPath);
|
|
174
|
+
await pipeline(downloadStream, writeStream);
|
|
175
|
+
}
|
|
176
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/lib/client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Configuration management for OkraPDF CLI
|
|
3
|
+
*
|
|
4
|
+
* Config priority (highest to lowest):
|
|
5
|
+
* 1. Environment variables (OKRA_API_KEY, OKRA_BASE_URL)
|
|
6
|
+
* 2. .env file in current directory
|
|
7
|
+
* 3. .okra file in current directory
|
|
8
|
+
* 4. ~/.okra file in home directory
|
|
9
|
+
* 5. Config store (~/.config/okrapdf/config.json)
|
|
10
|
+
*/
|
|
11
|
+
import type { CliConfig, OutputFormat } from '../types.js';
|
|
12
|
+
/**
|
|
13
|
+
* Get the API key from environment or config
|
|
14
|
+
*/
|
|
15
|
+
export declare function getApiKey(): string | undefined;
|
|
16
|
+
/**
|
|
17
|
+
* Set the API key in config
|
|
18
|
+
*/
|
|
19
|
+
export declare function setApiKey(key: string): void;
|
|
20
|
+
/**
|
|
21
|
+
* Remove the API key from config
|
|
22
|
+
*/
|
|
23
|
+
export declare function clearApiKey(): void;
|
|
24
|
+
/**
|
|
25
|
+
* Get the base URL from environment or config
|
|
26
|
+
*/
|
|
27
|
+
export declare function getBaseUrl(): string;
|
|
28
|
+
/**
|
|
29
|
+
* Set the base URL in config
|
|
30
|
+
*/
|
|
31
|
+
export declare function setBaseUrl(url: string): void;
|
|
32
|
+
/**
|
|
33
|
+
* Get the default output format
|
|
34
|
+
*/
|
|
35
|
+
export declare function getDefaultFormat(): OutputFormat;
|
|
36
|
+
/**
|
|
37
|
+
* Set the default output format
|
|
38
|
+
*/
|
|
39
|
+
export declare function setDefaultFormat(format: OutputFormat): void;
|
|
40
|
+
/**
|
|
41
|
+
* Get all config values
|
|
42
|
+
*/
|
|
43
|
+
export declare function getConfig(): CliConfig;
|
|
44
|
+
/**
|
|
45
|
+
* Get the config file path
|
|
46
|
+
*/
|
|
47
|
+
export declare function getConfigPath(): string;
|
|
48
|
+
/**
|
|
49
|
+
* Reset config to defaults
|
|
50
|
+
*/
|
|
51
|
+
export declare function resetConfig(): void;
|
|
52
|
+
/**
|
|
53
|
+
* Check if authenticated
|
|
54
|
+
*/
|
|
55
|
+
export declare function isAuthenticated(): boolean;
|
|
56
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAOH,OAAO,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AA6B3D;;GAEG;AACH,wBAAgB,SAAS,IAAI,MAAM,GAAG,SAAS,CAE9C;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAE3C;AAED;;GAEG;AACH,wBAAgB,WAAW,IAAI,IAAI,CAElC;AAED;;GAEG;AACH,wBAAgB,UAAU,IAAI,MAAM,CAEnC;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAE5C;AAED;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,YAAY,CAG/C;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,YAAY,GAAG,IAAI,CAE3D;AAED;;GAEG;AACH,wBAAgB,SAAS,IAAI,SAAS,CAMrC;AAED;;GAEG;AACH,wBAAgB,aAAa,IAAI,MAAM,CAEtC;AAED;;GAEG;AACH,wBAAgB,WAAW,IAAI,IAAI,CAElC;AAED;;GAEG;AACH,wBAAgB,eAAe,IAAI,OAAO,CAEzC"}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Configuration management for OkraPDF CLI
|
|
3
|
+
*
|
|
4
|
+
* Config priority (highest to lowest):
|
|
5
|
+
* 1. Environment variables (OKRA_API_KEY, OKRA_BASE_URL)
|
|
6
|
+
* 2. .env file in current directory
|
|
7
|
+
* 3. .okra file in current directory
|
|
8
|
+
* 4. ~/.okra file in home directory
|
|
9
|
+
* 5. Config store (~/.config/okrapdf/config.json)
|
|
10
|
+
*/
|
|
11
|
+
import Conf from 'conf';
|
|
12
|
+
import { config as dotenvConfig } from 'dotenv';
|
|
13
|
+
import { existsSync } from 'fs';
|
|
14
|
+
import { join } from 'path';
|
|
15
|
+
import { homedir } from 'os';
|
|
16
|
+
const DEFAULT_BASE_URL = 'https://okrapdf.com';
|
|
17
|
+
const DEFAULT_FORMAT = 'table';
|
|
18
|
+
// Load .env files in priority order (first found wins via dotenv behavior)
|
|
19
|
+
// Mirrors Next.js convention: .env.local for secrets, .env for defaults
|
|
20
|
+
const envFiles = [
|
|
21
|
+
join(process.cwd(), '.env.local'),
|
|
22
|
+
join(process.cwd(), '.env'),
|
|
23
|
+
join(process.cwd(), '.okra'),
|
|
24
|
+
join(homedir(), '.okra'),
|
|
25
|
+
];
|
|
26
|
+
for (const envFile of envFiles) {
|
|
27
|
+
if (existsSync(envFile)) {
|
|
28
|
+
dotenvConfig({ path: envFile });
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
// Create config store
|
|
32
|
+
const config = new Conf({
|
|
33
|
+
projectName: 'okrapdf',
|
|
34
|
+
defaults: {
|
|
35
|
+
base_url: DEFAULT_BASE_URL,
|
|
36
|
+
default_format: DEFAULT_FORMAT,
|
|
37
|
+
},
|
|
38
|
+
});
|
|
39
|
+
/**
|
|
40
|
+
* Get the API key from environment or config
|
|
41
|
+
*/
|
|
42
|
+
export function getApiKey() {
|
|
43
|
+
return process.env.OKRA_API_KEY || config.get('api_key');
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Set the API key in config
|
|
47
|
+
*/
|
|
48
|
+
export function setApiKey(key) {
|
|
49
|
+
config.set('api_key', key);
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Remove the API key from config
|
|
53
|
+
*/
|
|
54
|
+
export function clearApiKey() {
|
|
55
|
+
config.delete('api_key');
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Get the base URL from environment or config
|
|
59
|
+
*/
|
|
60
|
+
export function getBaseUrl() {
|
|
61
|
+
return process.env.OKRA_BASE_URL || config.get('base_url') || DEFAULT_BASE_URL;
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Set the base URL in config
|
|
65
|
+
*/
|
|
66
|
+
export function setBaseUrl(url) {
|
|
67
|
+
config.set('base_url', url);
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Get the default output format
|
|
71
|
+
*/
|
|
72
|
+
export function getDefaultFormat() {
|
|
73
|
+
const envFormat = process.env.OKRA_OUTPUT_FORMAT;
|
|
74
|
+
return envFormat || config.get('default_format') || DEFAULT_FORMAT;
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Set the default output format
|
|
78
|
+
*/
|
|
79
|
+
export function setDefaultFormat(format) {
|
|
80
|
+
config.set('default_format', format);
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Get all config values
|
|
84
|
+
*/
|
|
85
|
+
export function getConfig() {
|
|
86
|
+
return {
|
|
87
|
+
api_key: getApiKey(),
|
|
88
|
+
base_url: getBaseUrl(),
|
|
89
|
+
default_format: getDefaultFormat(),
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Get the config file path
|
|
94
|
+
*/
|
|
95
|
+
export function getConfigPath() {
|
|
96
|
+
return config.path;
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Reset config to defaults
|
|
100
|
+
*/
|
|
101
|
+
export function resetConfig() {
|
|
102
|
+
config.clear();
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Check if authenticated
|
|
106
|
+
*/
|
|
107
|
+
export function isAuthenticated() {
|
|
108
|
+
return !!getApiKey();
|
|
109
|
+
}
|
|
110
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.test.d.ts","sourceRoot":"","sources":["../../src/lib/config.test.ts"],"names":[],"mappings":"AAAA;;GAEG"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tests for configuration management
|
|
3
|
+
*/
|
|
4
|
+
import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest';
|
|
5
|
+
// Mock environment variables
|
|
6
|
+
const originalEnv = process.env;
|
|
7
|
+
describe('config', () => {
|
|
8
|
+
beforeEach(() => {
|
|
9
|
+
vi.resetModules();
|
|
10
|
+
process.env = { ...originalEnv };
|
|
11
|
+
});
|
|
12
|
+
afterEach(() => {
|
|
13
|
+
process.env = originalEnv;
|
|
14
|
+
});
|
|
15
|
+
describe('getApiKey', () => {
|
|
16
|
+
it('should return OKRA_API_KEY from environment', async () => {
|
|
17
|
+
process.env.OKRA_API_KEY = 'okra_test_key';
|
|
18
|
+
const { getApiKey } = await import('./config.js');
|
|
19
|
+
expect(getApiKey()).toBe('okra_test_key');
|
|
20
|
+
});
|
|
21
|
+
it('should prioritize environment over config', async () => {
|
|
22
|
+
process.env.OKRA_API_KEY = 'okra_env_key';
|
|
23
|
+
const { getApiKey, setApiKey } = await import('./config.js');
|
|
24
|
+
setApiKey('okra_config_key');
|
|
25
|
+
// Env should take priority
|
|
26
|
+
expect(getApiKey()).toBe('okra_env_key');
|
|
27
|
+
});
|
|
28
|
+
});
|
|
29
|
+
describe('getBaseUrl', () => {
|
|
30
|
+
it('should return default URL when not configured', async () => {
|
|
31
|
+
delete process.env.OKRA_BASE_URL;
|
|
32
|
+
const { getBaseUrl } = await import('./config.js');
|
|
33
|
+
expect(getBaseUrl()).toBe('https://okrapdf.com');
|
|
34
|
+
});
|
|
35
|
+
it('should return OKRA_BASE_URL from environment', async () => {
|
|
36
|
+
process.env.OKRA_BASE_URL = 'https://custom.example.com';
|
|
37
|
+
const { getBaseUrl } = await import('./config.js');
|
|
38
|
+
expect(getBaseUrl()).toBe('https://custom.example.com');
|
|
39
|
+
});
|
|
40
|
+
});
|
|
41
|
+
describe('getDefaultFormat', () => {
|
|
42
|
+
it('should return table as default', async () => {
|
|
43
|
+
delete process.env.OKRA_OUTPUT_FORMAT;
|
|
44
|
+
const { getDefaultFormat } = await import('./config.js');
|
|
45
|
+
expect(getDefaultFormat()).toBe('table');
|
|
46
|
+
});
|
|
47
|
+
it('should return OKRA_OUTPUT_FORMAT from environment', async () => {
|
|
48
|
+
process.env.OKRA_OUTPUT_FORMAT = 'json';
|
|
49
|
+
const { getDefaultFormat } = await import('./config.js');
|
|
50
|
+
expect(getDefaultFormat()).toBe('json');
|
|
51
|
+
});
|
|
52
|
+
});
|
|
53
|
+
describe('isAuthenticated', () => {
|
|
54
|
+
it('should return false when no API key', async () => {
|
|
55
|
+
delete process.env.OKRA_API_KEY;
|
|
56
|
+
const { isAuthenticated, clearApiKey } = await import('./config.js');
|
|
57
|
+
clearApiKey();
|
|
58
|
+
expect(isAuthenticated()).toBe(false);
|
|
59
|
+
});
|
|
60
|
+
it('should return true when API key is set', async () => {
|
|
61
|
+
process.env.OKRA_API_KEY = 'okra_test';
|
|
62
|
+
const { isAuthenticated } = await import('./config.js');
|
|
63
|
+
expect(isAuthenticated()).toBe(true);
|
|
64
|
+
});
|
|
65
|
+
});
|
|
66
|
+
describe('getConfig', () => {
|
|
67
|
+
it('should return full config object', async () => {
|
|
68
|
+
process.env.OKRA_API_KEY = 'okra_test';
|
|
69
|
+
process.env.OKRA_BASE_URL = 'https://test.com';
|
|
70
|
+
process.env.OKRA_OUTPUT_FORMAT = 'json';
|
|
71
|
+
const { getConfig } = await import('./config.js');
|
|
72
|
+
const config = getConfig();
|
|
73
|
+
expect(config).toEqual({
|
|
74
|
+
api_key: 'okra_test',
|
|
75
|
+
base_url: 'https://test.com',
|
|
76
|
+
default_format: 'json',
|
|
77
|
+
});
|
|
78
|
+
});
|
|
79
|
+
});
|
|
80
|
+
});
|
|
81
|
+
//# sourceMappingURL=config.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.test.js","sourceRoot":"","sources":["../../src/lib/config.test.ts"],"names":[],"mappings":"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"}
|