@okrapdf/cli 0.1.0 → 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (115) hide show
  1. package/README.md +163 -0
  2. package/dist/cli.d.ts +19 -0
  3. package/dist/cli.d.ts.map +1 -0
  4. package/dist/cli.js +175 -0
  5. package/dist/cli.js.map +1 -0
  6. package/dist/commands/auth.d.ts +6 -0
  7. package/dist/commands/auth.d.ts.map +1 -0
  8. package/dist/commands/auth.js +154 -0
  9. package/dist/commands/auth.js.map +1 -0
  10. package/dist/commands/chat.d.ts +6 -0
  11. package/dist/commands/chat.d.ts.map +1 -0
  12. package/dist/commands/chat.js +218 -0
  13. package/dist/commands/chat.js.map +1 -0
  14. package/dist/commands/docs.d.ts +6 -0
  15. package/dist/commands/docs.d.ts.map +1 -0
  16. package/dist/commands/docs.js +181 -0
  17. package/dist/commands/docs.js.map +1 -0
  18. package/dist/commands/jobs.d.ts +6 -0
  19. package/dist/commands/jobs.d.ts.map +1 -0
  20. package/dist/commands/jobs.js +348 -0
  21. package/dist/commands/jobs.js.map +1 -0
  22. package/dist/commands/jobs.test.d.ts +5 -0
  23. package/dist/commands/jobs.test.d.ts.map +1 -0
  24. package/dist/commands/jobs.test.js +118 -0
  25. package/dist/commands/jobs.test.js.map +1 -0
  26. package/dist/commands/logs.d.ts +8 -0
  27. package/dist/commands/logs.d.ts.map +1 -0
  28. package/dist/commands/logs.js +186 -0
  29. package/dist/commands/logs.js.map +1 -0
  30. package/dist/commands/processors.d.ts +8 -0
  31. package/dist/commands/processors.d.ts.map +1 -0
  32. package/dist/commands/processors.js +91 -0
  33. package/dist/commands/processors.js.map +1 -0
  34. package/dist/commands/review.d.ts +3 -0
  35. package/dist/commands/review.d.ts.map +1 -0
  36. package/dist/commands/review.js +370 -0
  37. package/dist/commands/review.js.map +1 -0
  38. package/dist/commands/shortcuts.d.ts +20 -0
  39. package/dist/commands/shortcuts.d.ts.map +1 -0
  40. package/dist/commands/shortcuts.js +405 -0
  41. package/dist/commands/shortcuts.js.map +1 -0
  42. package/dist/commands/tables.d.ts +6 -0
  43. package/dist/commands/tables.d.ts.map +1 -0
  44. package/dist/commands/tables.js +189 -0
  45. package/dist/commands/tables.js.map +1 -0
  46. package/dist/commands/templates.d.ts +8 -0
  47. package/dist/commands/templates.d.ts.map +1 -0
  48. package/dist/commands/templates.js +202 -0
  49. package/dist/commands/templates.js.map +1 -0
  50. package/dist/index.d.ts +14 -412
  51. package/dist/index.d.ts.map +1 -0
  52. package/dist/index.js +23 -46
  53. package/dist/index.js.map +1 -1
  54. package/dist/lib/browser.d.ts +11 -0
  55. package/dist/lib/browser.d.ts.map +1 -0
  56. package/dist/lib/browser.js +33 -0
  57. package/dist/lib/browser.js.map +1 -0
  58. package/dist/lib/client.d.ts +57 -0
  59. package/dist/lib/client.d.ts.map +1 -0
  60. package/dist/lib/client.js +176 -0
  61. package/dist/lib/client.js.map +1 -0
  62. package/dist/lib/config.d.ts +56 -0
  63. package/dist/lib/config.d.ts.map +1 -0
  64. package/dist/lib/config.js +110 -0
  65. package/dist/lib/config.js.map +1 -0
  66. package/dist/lib/config.test.d.ts +5 -0
  67. package/dist/lib/config.test.d.ts.map +1 -0
  68. package/dist/lib/config.test.js +81 -0
  69. package/dist/lib/config.test.js.map +1 -0
  70. package/dist/lib/logs.d.ts +89 -0
  71. package/dist/lib/logs.d.ts.map +1 -0
  72. package/dist/lib/logs.js +196 -0
  73. package/dist/lib/logs.js.map +1 -0
  74. package/dist/lib/logs.test.d.ts +5 -0
  75. package/dist/lib/logs.test.d.ts.map +1 -0
  76. package/dist/lib/logs.test.js +183 -0
  77. package/dist/lib/logs.test.js.map +1 -0
  78. package/dist/lib/output.d.ts +73 -0
  79. package/dist/lib/output.d.ts.map +1 -0
  80. package/dist/lib/output.js +204 -0
  81. package/dist/lib/output.js.map +1 -0
  82. package/dist/lib/output.test.d.ts +5 -0
  83. package/dist/lib/output.test.d.ts.map +1 -0
  84. package/dist/lib/output.test.js +174 -0
  85. package/dist/lib/output.test.js.map +1 -0
  86. package/dist/lib/processors.d.ts +73 -0
  87. package/dist/lib/processors.d.ts.map +1 -0
  88. package/dist/lib/processors.js +94 -0
  89. package/dist/lib/processors.js.map +1 -0
  90. package/dist/lib/processors.test.d.ts +5 -0
  91. package/dist/lib/processors.test.d.ts.map +1 -0
  92. package/dist/lib/processors.test.js +83 -0
  93. package/dist/lib/processors.test.js.map +1 -0
  94. package/dist/lib/progress.d.ts +44 -0
  95. package/dist/lib/progress.d.ts.map +1 -0
  96. package/dist/lib/progress.js +102 -0
  97. package/dist/lib/progress.js.map +1 -0
  98. package/dist/lib/templates.d.ts +56 -0
  99. package/dist/lib/templates.d.ts.map +1 -0
  100. package/dist/lib/templates.js +204 -0
  101. package/dist/lib/templates.js.map +1 -0
  102. package/dist/lib/templates.test.d.ts +5 -0
  103. package/dist/lib/templates.test.d.ts.map +1 -0
  104. package/dist/lib/templates.test.js +101 -0
  105. package/dist/lib/templates.test.js.map +1 -0
  106. package/dist/types.d.ts +144 -0
  107. package/dist/types.d.ts.map +1 -0
  108. package/dist/types.js +5 -0
  109. package/dist/types.js.map +1 -0
  110. package/package.json +56 -25
  111. package/dist/bin.d.ts +0 -1
  112. package/dist/bin.js +0 -152
  113. package/dist/bin.js.map +0 -1
  114. package/dist/chunk-A6YTW4WL.js +0 -499
  115. package/dist/chunk-A6YTW4WL.js.map +0 -1
package/dist/index.js CHANGED
@@ -1,47 +1,24 @@
1
- import {
2
- calculateStats,
3
- executeQuery,
4
- filterEntities,
5
- find,
6
- formatFindOutput,
7
- formatHistoryOutput,
8
- formatPageOutput,
9
- formatSearchOutput,
10
- formatStats,
11
- formatTablesOutput,
12
- formatTreeOutput,
13
- formatVersionsOutput,
14
- history,
15
- pageEdit,
16
- pageGet,
17
- pageResolve,
18
- pageVersions,
19
- parseSelector,
20
- search,
21
- tables,
22
- tree
23
- } from "./chunk-A6YTW4WL.js";
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":[],"sourcesContent":[],"mappings":"","names":[]}
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,5 @@
1
+ /**
2
+ * Tests for configuration management
3
+ */
4
+ export {};
5
+ //# sourceMappingURL=config.test.d.ts.map
@@ -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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"}