oxpdf 0.1.1 → 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 CHANGED
@@ -1,6 +1,6 @@
1
1
  # oxpdf
2
2
 
3
- TypeScript/JavaScript SDK for the [0xPdf](https://0xpdf.com) PDF-to-JSON API.
3
+ TypeScript/JavaScript SDK for the [0xPdf](https://0xpdf.io) PDF-to-JSON API.
4
4
 
5
5
  Works in **Node.js 18+**, **Bun**, **Deno**, and the **browser** — zero dependencies, uses native `fetch`.
6
6
 
@@ -77,7 +77,7 @@ new OxPDFClient({ apiKey, baseUrl?, timeout? })
77
77
  | Option | Type | Default | Description |
78
78
  | --------- | -------- | ------------------------------------ | -------------------- |
79
79
  | `apiKey` | `string` | — | Your 0xPdf API key |
80
- | `baseUrl` | `string` | `https://api.0xpdf.com/api/v1` | API base URL |
80
+ | `baseUrl` | `string` | `https://api.0xpdf.io/api/v1` | API base URL |
81
81
  | `timeout` | `number` | `120000` | Request timeout (ms) |
82
82
 
83
83
  ### PDF Parsing
package/dist/index.cjs CHANGED
@@ -48,7 +48,7 @@ var OxPDFError = class extends Error {
48
48
  };
49
49
 
50
50
  // src/client.ts
51
- var DEFAULT_BASE_URL = "https://api.0xpdf.com/api/v1";
51
+ var DEFAULT_BASE_URL = "https://api.0xpdf.io/api/v1";
52
52
  var DEFAULT_TIMEOUT = 12e4;
53
53
  var OxPDFClient = class {
54
54
  #apiKey;
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/errors.ts","../src/client.ts"],"sourcesContent":["export { OxPDFClient } from \"./client.js\";\nexport { OxPDFError } from \"./errors.js\";\nexport type {\n AnalyticsResult,\n ClientOptions,\n CreateSchemaOptions,\n ExtractImagesOptions,\n FileInfo,\n FileListResult,\n GenerateSchemaOptions,\n GenerateSchemaResult,\n ImageInfo,\n ImageListResult,\n ImageUrlResult,\n JobStatus,\n ParseOptions,\n ParseResult,\n ParseStreamOptions,\n SchemaInfo,\n SchemaTemplate,\n StreamEvent,\n UpdateSchemaOptions,\n UploadOptions,\n UploadResult,\n ValidateOptions,\n} from \"./types.js\";\n","export class OxPDFError extends Error {\n readonly statusCode: number | undefined;\n readonly responseBody: string | undefined;\n\n constructor(\n message: string,\n statusCode?: number,\n responseBody?: string,\n ) {\n super(message);\n this.name = \"OxPDFError\";\n this.statusCode = statusCode;\n this.responseBody = responseBody;\n }\n}\n","import { OxPDFError } from \"./errors.js\";\nimport type {\n AnalyticsResult,\n ClientOptions,\n CreateSchemaOptions,\n ExtractImagesOptions,\n FileInfo,\n FileListResult,\n GenerateSchemaOptions,\n GenerateSchemaResult,\n ImageListResult,\n ImageUrlResult,\n JobStatus,\n ParseOptions,\n ParseResult,\n ParseStreamOptions,\n SchemaInfo,\n SchemaTemplate,\n StreamEvent,\n UpdateSchemaOptions,\n UploadOptions,\n UploadResult,\n ValidateOptions,\n} from \"./types.js\";\n\nconst DEFAULT_BASE_URL = \"https://api.0xpdf.com/api/v1\";\nconst DEFAULT_TIMEOUT = 120_000;\n\nexport class OxPDFClient {\n readonly #apiKey: string;\n readonly #baseUrl: string;\n readonly #timeout: number;\n\n constructor(options: ClientOptions) {\n if (!options.apiKey) {\n throw new OxPDFError(\"apiKey is required\");\n }\n this.#apiKey = options.apiKey;\n this.#baseUrl = (options.baseUrl ?? DEFAULT_BASE_URL).replace(/\\/+$/, \"\");\n this.#timeout = options.timeout ?? DEFAULT_TIMEOUT;\n }\n\n // ── internal helpers ─────────────────────────────────────────────\n\n #url(path: string): string {\n return `${this.#baseUrl}/${path.replace(/^\\/+/, \"\")}`;\n }\n\n async #request<T = Record<string, unknown>>(\n method: string,\n path: string,\n init?: {\n params?: Record<string, string>;\n body?: FormData | string;\n headers?: Record<string, string>;\n },\n ): Promise<T> {\n const url = new URL(this.#url(path));\n if (init?.params) {\n for (const [k, v] of Object.entries(init.params)) {\n url.searchParams.set(k, v);\n }\n }\n\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), this.#timeout);\n\n let resp: Response;\n try {\n resp = await fetch(url.toString(), {\n method,\n headers: {\n \"X-API-Key\": this.#apiKey,\n ...init?.headers,\n },\n body: init?.body,\n signal: controller.signal,\n });\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n throw new OxPDFError(`Request failed: ${msg}`);\n } finally {\n clearTimeout(timer);\n }\n\n if (resp.status === 204) return {} as T;\n\n if (!resp.ok) {\n const text = await resp.text();\n let detail: string;\n try {\n const body = JSON.parse(text);\n const raw = body.detail ?? body.error ?? text;\n if (Array.isArray(raw)) {\n detail = raw.map((d: Record<string, unknown>) => d.msg ?? JSON.stringify(d)).join(\"; \");\n } else {\n detail = typeof raw === \"string\" ? raw : JSON.stringify(raw);\n }\n } catch {\n detail = text || resp.statusText || `HTTP ${resp.status}`;\n }\n throw new OxPDFError(detail, resp.status, text);\n }\n\n const text = await resp.text();\n if (!text) return {} as T;\n return JSON.parse(text) as T;\n }\n\n #buildPdfForm(\n file: Blob | Buffer | Uint8Array,\n filename: string,\n fields?: Record<string, string>,\n ): FormData {\n if (!filename.toLowerCase().endsWith(\".pdf\")) {\n throw new OxPDFError(\"File must be a PDF\");\n }\n\n const form = new FormData();\n let blob: Blob;\n if (file instanceof Blob) {\n blob = file;\n } else {\n const arr = new Uint8Array(file.buffer, file.byteOffset, file.byteLength);\n blob = new Blob([arr as unknown as Uint8Array<ArrayBuffer>], {\n type: \"application/pdf\",\n });\n }\n form.append(\"file\", blob, filename);\n if (fields) {\n for (const [k, v] of Object.entries(fields)) form.append(k, v);\n }\n return form;\n }\n\n // ── PDF parsing ──────────────────────────────────────────────────\n\n /** Parse a PDF and return structured JSON. */\n async parse(\n file: Blob | Buffer | Uint8Array,\n filename: string,\n options: ParseOptions = {},\n ): Promise<ParseResult> {\n const formFields: Record<string, string> = {\n use_ocr: String(options.useOcr ?? false),\n };\n if (options.ocrEngine) formFields.ocr_engine = options.ocrEngine;\n if (options.schema) formFields.schema_json = JSON.stringify(options.schema);\n\n const params: Record<string, string> = {};\n if (options.schemaTemplate) params.schema_template = options.schemaTemplate;\n if (options.schemaId) params.schema_id = options.schemaId;\n if (options.pages) params.pages = options.pages.join(\",\");\n\n const form = this.#buildPdfForm(file, filename, formFields);\n\n return this.#request<ParseResult>(\"POST\", \"pdf/parse\", {\n params: Object.keys(params).length ? params : undefined,\n body: form,\n });\n }\n\n /** Parse a PDF from a file path (Node.js only). */\n async parseFile(filePath: string, options: ParseOptions = {}): Promise<ParseResult> {\n const { readFile } = await import(\"node:fs/promises\");\n const { basename } = await import(\"node:path\");\n const buf = await readFile(filePath);\n return this.parse(buf, basename(filePath), options);\n }\n\n /**\n * Streaming parse via Server-Sent Events.\n * Returns an async generator that yields ``StreamEvent`` objects.\n */\n async *parseStream(\n file: Blob | Buffer | Uint8Array,\n filename: string,\n options: ParseStreamOptions = {},\n ): AsyncGenerator<StreamEvent> {\n const formFields: Record<string, string> = {\n use_ocr: String(options.useOcr ?? false),\n };\n if (options.ocrEngine) formFields.ocr_engine = options.ocrEngine;\n if (options.schema) formFields.schema_json = JSON.stringify(options.schema);\n\n const params: Record<string, string> = {\n batch_size: String(options.batchSize ?? 5),\n };\n if (options.schemaTemplate) params.schema_template = options.schemaTemplate;\n if (options.schemaId) params.schema_id = options.schemaId;\n if (options.pages) params.pages = options.pages.join(\",\");\n\n const form = this.#buildPdfForm(file, filename, formFields);\n\n const url = new URL(this.#url(\"pdf/parse-stream\"));\n for (const [k, v] of Object.entries(params)) url.searchParams.set(k, v);\n\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), 300_000);\n\n let resp: Response;\n try {\n resp = await fetch(url.toString(), {\n method: \"POST\",\n headers: { \"X-API-Key\": this.#apiKey },\n body: form,\n signal: controller.signal,\n });\n } catch (err) {\n clearTimeout(timer);\n const msg = err instanceof Error ? err.message : String(err);\n throw new OxPDFError(`Stream request failed: ${msg}`);\n }\n\n if (!resp.ok) {\n clearTimeout(timer);\n const text = await resp.text();\n throw new OxPDFError(text, resp.status, text);\n }\n\n try {\n const reader = resp.body?.getReader();\n if (!reader) throw new OxPDFError(\"No response body\");\n\n const decoder = new TextDecoder();\n let buffer = \"\";\n let eventType = \"message\";\n\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n buffer += decoder.decode(value, { stream: true });\n\n const lines = buffer.split(\"\\n\");\n buffer = lines.pop() ?? \"\";\n\n for (const line of lines) {\n if (line.startsWith(\"event:\")) {\n eventType = line.slice(6).trim();\n } else if (line.startsWith(\"data:\")) {\n const raw = line.slice(5).trim();\n let data: Record<string, unknown>;\n try {\n data = JSON.parse(raw);\n } catch {\n data = { raw };\n }\n yield { event: eventType, data };\n eventType = \"message\";\n }\n }\n }\n } finally {\n clearTimeout(timer);\n }\n }\n\n /** Streaming parse from a file path (Node.js only). */\n async *parseFileStream(\n filePath: string,\n options: ParseStreamOptions = {},\n ): AsyncGenerator<StreamEvent> {\n const { readFile } = await import(\"node:fs/promises\");\n const { basename } = await import(\"node:path\");\n const buf = await readFile(filePath);\n yield* this.parseStream(buf, basename(filePath), options);\n }\n\n // ── Async upload (job queue) ─────────────────────────────────────\n\n /** Upload a PDF for async background processing. Returns a job_id. */\n async upload(\n file: Blob | Buffer | Uint8Array,\n filename: string,\n options: UploadOptions = {},\n ): Promise<UploadResult> {\n const params: Record<string, string> = {\n use_ocr: String(options.useOcr ?? false),\n ocr_engine: options.ocrEngine ?? \"surya\",\n };\n if (options.schemaId) params.schema_id = options.schemaId;\n if (options.schemaName) params.schema_name = options.schemaName;\n\n const form = this.#buildPdfForm(file, filename);\n\n return this.#request<UploadResult>(\"POST\", \"pdf/upload\", {\n params,\n body: form,\n });\n }\n\n /** Poll the status of an async PDF processing job. */\n async jobStatus(jobId: string): Promise<JobStatus> {\n return this.#request<JobStatus>(\"GET\", `pdf/status/${jobId}`);\n }\n\n // ── PDF validation ───────────────────────────────────────────────\n\n /** Validate a PDF without full processing (dry-run). */\n async validate(\n file: Blob | Buffer | Uint8Array,\n filename: string,\n options: ValidateOptions = {},\n ): Promise<Record<string, unknown>> {\n const params: Record<string, string> = { dry_run: \"true\" };\n if (options.schemaId) params.schema_id = options.schemaId;\n if (options.schemaName) params.schema_name = options.schemaName;\n\n const form = this.#buildPdfForm(file, filename);\n return this.#request(\"POST\", \"pdf/validate\", { params, body: form });\n }\n\n // ── Image extraction ─────────────────────────────────────────────\n\n /** Extract images from a PDF. */\n async extractImages(\n file: Blob | Buffer | Uint8Array,\n filename: string,\n options: ExtractImagesOptions = {},\n ): Promise<Record<string, unknown>> {\n const params: Record<string, string> = {\n min_width: String(options.minWidth ?? 50),\n min_height: String(options.minHeight ?? 50),\n use_ocr: String(options.useOcr ?? false),\n ocr_engine: options.ocrEngine ?? \"surya\",\n };\n if (options.pages) params.pages = options.pages.join(\",\");\n\n const form = this.#buildPdfForm(file, filename);\n return this.#request(\"POST\", \"pdf/parse-images\", { params, body: form });\n }\n\n // ── Image management ─────────────────────────────────────────────\n\n /** List extracted images. */\n async listImages(limit = 100, offset = 0): Promise<ImageListResult> {\n return this.#request<ImageListResult>(\"GET\", \"pdf/images\", {\n params: { limit: String(limit), offset: String(offset) },\n });\n }\n\n /** Get or refresh a presigned URL for an image. */\n async getImageUrl(imageId: string, expirationSeconds = 3600): Promise<ImageUrlResult> {\n return this.#request<ImageUrlResult>(\"GET\", `pdf/images/${imageId}/url`, {\n params: { expiration_seconds: String(expirationSeconds) },\n });\n }\n\n /** Delete a specific image. */\n async deleteImage(imageId: string): Promise<void> {\n await this.#request(\"DELETE\", `pdf/images/${imageId}`);\n }\n\n /** Delete all extracted images. */\n async deleteAllImages(): Promise<Record<string, unknown>> {\n return this.#request(\"DELETE\", \"pdf/images\");\n }\n\n // ── File management ──────────────────────────────────────────────\n\n /** List previously uploaded PDFs. */\n async listFiles(): Promise<FileListResult> {\n return this.#request<FileListResult>(\"GET\", \"pdf/files\");\n }\n\n /** Get metadata and download URL for an uploaded PDF. */\n async getFile(pdfId: string): Promise<FileInfo> {\n return this.#request<FileInfo>(\"GET\", `pdf/files/${pdfId}`);\n }\n\n /** Delete an uploaded PDF. */\n async deleteFile(pdfId: string): Promise<void> {\n await this.#request(\"DELETE\", `pdf/files/${pdfId}`);\n }\n\n // ── Schema templates ─────────────────────────────────────────────\n\n /** List pre-built schema templates (pdf route). */\n async listTemplates(): Promise<SchemaTemplate[]> {\n const res = await this.#request<{ templates: SchemaTemplate[] }>(\"GET\", \"pdf/templates\");\n return res.templates ?? [];\n }\n\n /** List schema templates from /schemas/templates/list. */\n async listSchemaTemplates(): Promise<SchemaTemplate[]> {\n const res = await this.#request<{ templates: SchemaTemplate[] }>(\n \"GET\",\n \"schemas/templates/list\",\n );\n return res.templates ?? [];\n }\n\n /** Get a specific schema template with full definition. */\n async getSchemaTemplate(templateId: string): Promise<SchemaTemplate> {\n return this.#request<SchemaTemplate>(\"GET\", `schemas/templates/${templateId}`);\n }\n\n // ── Schema CRUD ──────────────────────────────────────────────────\n\n /** List user's saved schemas. */\n async listSchemas(): Promise<SchemaInfo[]> {\n const res = await this.#request<{ schemas: SchemaInfo[] }>(\"GET\", \"schemas\");\n return res.schemas ?? [];\n }\n\n /** Get a specific schema by ID. */\n async getSchema(schemaId: string): Promise<SchemaInfo> {\n return this.#request<SchemaInfo>(\"GET\", `schemas/${schemaId}`);\n }\n\n /** Create a new JSON schema. */\n async createSchema(options: CreateSchemaOptions): Promise<SchemaInfo> {\n return this.#request<SchemaInfo>(\"POST\", \"schemas\", {\n body: JSON.stringify({\n name: options.name,\n schema: options.schema,\n is_default: options.isDefault ?? false,\n }),\n headers: { \"Content-Type\": \"application/json\" },\n });\n }\n\n /** Update an existing schema. */\n async updateSchema(schemaId: string, options: UpdateSchemaOptions): Promise<SchemaInfo> {\n return this.#request<SchemaInfo>(\"PUT\", `schemas/${schemaId}`, {\n body: JSON.stringify({\n name: options.name,\n schema: options.schema,\n is_default: options.isDefault ?? false,\n }),\n headers: { \"Content-Type\": \"application/json\" },\n });\n }\n\n /** Delete a schema. */\n async deleteSchema(schemaId: string): Promise<void> {\n await this.#request(\"DELETE\", `schemas/${schemaId}`);\n }\n\n /** Set a schema as the default. */\n async setDefaultSchema(schemaId: string): Promise<SchemaInfo> {\n return this.#request<SchemaInfo>(\"PATCH\", `schemas/${schemaId}/set-default`);\n }\n\n /** Generate a schema using AI from a natural-language description. */\n async generateSchema(options: GenerateSchemaOptions): Promise<GenerateSchemaResult> {\n const body: Record<string, unknown> = { description: options.description };\n if (options.refinement) body.refinement = options.refinement;\n if (options.currentSchema) body.current_schema = options.currentSchema;\n if (options.selectedText) body.selected_text = options.selectedText;\n\n return this.#request<GenerateSchemaResult>(\"POST\", \"schemas/generate\", {\n body: JSON.stringify(body),\n headers: { \"Content-Type\": \"application/json\" },\n });\n }\n\n // ── Analytics ────────────────────────────────────────────────────\n\n /** Get usage analytics for the current user/org. */\n async getAnalytics(): Promise<AnalyticsResult> {\n return this.#request<AnalyticsResult>(\"GET\", \"analytics/user\");\n }\n\n /** Submit in-app feedback. */\n async submitFeedback(feedback: string): Promise<{ success: boolean }> {\n return this.#request<{ success: boolean }>(\"POST\", \"analytics/feedback\", {\n body: JSON.stringify({ feedback }),\n headers: { \"Content-Type\": \"application/json\" },\n });\n }\n\n // ── Pricing ──────────────────────────────────────────────────────\n\n /** Get available pricing tiers. */\n async getPricing(billingCycle = \"monthly\"): Promise<Record<string, unknown>> {\n return this.#request(\"GET\", \"pricing\", {\n params: { billing_cycle: billingCycle },\n });\n }\n\n /** Get the current user's tier and quota. */\n async getCurrentTier(): Promise<Record<string, unknown>> {\n return this.#request(\"GET\", \"pricing/current\");\n }\n}\n"],"mappings":"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","names":["text"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/errors.ts","../src/client.ts"],"sourcesContent":["export { OxPDFClient } from \"./client.js\";\nexport { OxPDFError } from \"./errors.js\";\nexport type {\n AnalyticsResult,\n ClientOptions,\n CreateSchemaOptions,\n ExtractImagesOptions,\n FileInfo,\n FileListResult,\n GenerateSchemaOptions,\n GenerateSchemaResult,\n ImageInfo,\n ImageListResult,\n ImageUrlResult,\n JobStatus,\n ParseOptions,\n ParseResult,\n ParseStreamOptions,\n SchemaInfo,\n SchemaTemplate,\n StreamEvent,\n UpdateSchemaOptions,\n UploadOptions,\n UploadResult,\n ValidateOptions,\n} from \"./types.js\";\n","export class OxPDFError extends Error {\n readonly statusCode: number | undefined;\n readonly responseBody: string | undefined;\n\n constructor(\n message: string,\n statusCode?: number,\n responseBody?: string,\n ) {\n super(message);\n this.name = \"OxPDFError\";\n this.statusCode = statusCode;\n this.responseBody = responseBody;\n }\n}\n","import { OxPDFError } from \"./errors.js\";\nimport type {\n AnalyticsResult,\n ClientOptions,\n CreateSchemaOptions,\n ExtractImagesOptions,\n FileInfo,\n FileListResult,\n GenerateSchemaOptions,\n GenerateSchemaResult,\n ImageListResult,\n ImageUrlResult,\n JobStatus,\n ParseOptions,\n ParseResult,\n ParseStreamOptions,\n SchemaInfo,\n SchemaTemplate,\n StreamEvent,\n UpdateSchemaOptions,\n UploadOptions,\n UploadResult,\n ValidateOptions,\n} from \"./types.js\";\n\nconst DEFAULT_BASE_URL = \"https://api.0xpdf.io/api/v1\";\nconst DEFAULT_TIMEOUT = 120_000;\n\nexport class OxPDFClient {\n readonly #apiKey: string;\n readonly #baseUrl: string;\n readonly #timeout: number;\n\n constructor(options: ClientOptions) {\n if (!options.apiKey) {\n throw new OxPDFError(\"apiKey is required\");\n }\n this.#apiKey = options.apiKey;\n this.#baseUrl = (options.baseUrl ?? DEFAULT_BASE_URL).replace(/\\/+$/, \"\");\n this.#timeout = options.timeout ?? DEFAULT_TIMEOUT;\n }\n\n // ── internal helpers ─────────────────────────────────────────────\n\n #url(path: string): string {\n return `${this.#baseUrl}/${path.replace(/^\\/+/, \"\")}`;\n }\n\n async #request<T = Record<string, unknown>>(\n method: string,\n path: string,\n init?: {\n params?: Record<string, string>;\n body?: FormData | string;\n headers?: Record<string, string>;\n },\n ): Promise<T> {\n const url = new URL(this.#url(path));\n if (init?.params) {\n for (const [k, v] of Object.entries(init.params)) {\n url.searchParams.set(k, v);\n }\n }\n\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), this.#timeout);\n\n let resp: Response;\n try {\n resp = await fetch(url.toString(), {\n method,\n headers: {\n \"X-API-Key\": this.#apiKey,\n ...init?.headers,\n },\n body: init?.body,\n signal: controller.signal,\n });\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n throw new OxPDFError(`Request failed: ${msg}`);\n } finally {\n clearTimeout(timer);\n }\n\n if (resp.status === 204) return {} as T;\n\n if (!resp.ok) {\n const text = await resp.text();\n let detail: string;\n try {\n const body = JSON.parse(text);\n const raw = body.detail ?? body.error ?? text;\n if (Array.isArray(raw)) {\n detail = raw.map((d: Record<string, unknown>) => d.msg ?? JSON.stringify(d)).join(\"; \");\n } else {\n detail = typeof raw === \"string\" ? raw : JSON.stringify(raw);\n }\n } catch {\n detail = text || resp.statusText || `HTTP ${resp.status}`;\n }\n throw new OxPDFError(detail, resp.status, text);\n }\n\n const text = await resp.text();\n if (!text) return {} as T;\n return JSON.parse(text) as T;\n }\n\n #buildPdfForm(\n file: Blob | Buffer | Uint8Array,\n filename: string,\n fields?: Record<string, string>,\n ): FormData {\n if (!filename.toLowerCase().endsWith(\".pdf\")) {\n throw new OxPDFError(\"File must be a PDF\");\n }\n\n const form = new FormData();\n let blob: Blob;\n if (file instanceof Blob) {\n blob = file;\n } else {\n const arr = new Uint8Array(file.buffer, file.byteOffset, file.byteLength);\n blob = new Blob([arr as unknown as Uint8Array<ArrayBuffer>], {\n type: \"application/pdf\",\n });\n }\n form.append(\"file\", blob, filename);\n if (fields) {\n for (const [k, v] of Object.entries(fields)) form.append(k, v);\n }\n return form;\n }\n\n // ── PDF parsing ──────────────────────────────────────────────────\n\n /** Parse a PDF and return structured JSON. */\n async parse(\n file: Blob | Buffer | Uint8Array,\n filename: string,\n options: ParseOptions = {},\n ): Promise<ParseResult> {\n const formFields: Record<string, string> = {\n use_ocr: String(options.useOcr ?? false),\n };\n if (options.ocrEngine) formFields.ocr_engine = options.ocrEngine;\n if (options.schema) formFields.schema_json = JSON.stringify(options.schema);\n\n const params: Record<string, string> = {};\n if (options.schemaTemplate) params.schema_template = options.schemaTemplate;\n if (options.schemaId) params.schema_id = options.schemaId;\n if (options.pages) params.pages = options.pages.join(\",\");\n\n const form = this.#buildPdfForm(file, filename, formFields);\n\n return this.#request<ParseResult>(\"POST\", \"pdf/parse\", {\n params: Object.keys(params).length ? params : undefined,\n body: form,\n });\n }\n\n /** Parse a PDF from a file path (Node.js only). */\n async parseFile(filePath: string, options: ParseOptions = {}): Promise<ParseResult> {\n const { readFile } = await import(\"node:fs/promises\");\n const { basename } = await import(\"node:path\");\n const buf = await readFile(filePath);\n return this.parse(buf, basename(filePath), options);\n }\n\n /**\n * Streaming parse via Server-Sent Events.\n * Returns an async generator that yields ``StreamEvent`` objects.\n */\n async *parseStream(\n file: Blob | Buffer | Uint8Array,\n filename: string,\n options: ParseStreamOptions = {},\n ): AsyncGenerator<StreamEvent> {\n const formFields: Record<string, string> = {\n use_ocr: String(options.useOcr ?? false),\n };\n if (options.ocrEngine) formFields.ocr_engine = options.ocrEngine;\n if (options.schema) formFields.schema_json = JSON.stringify(options.schema);\n\n const params: Record<string, string> = {\n batch_size: String(options.batchSize ?? 5),\n };\n if (options.schemaTemplate) params.schema_template = options.schemaTemplate;\n if (options.schemaId) params.schema_id = options.schemaId;\n if (options.pages) params.pages = options.pages.join(\",\");\n\n const form = this.#buildPdfForm(file, filename, formFields);\n\n const url = new URL(this.#url(\"pdf/parse-stream\"));\n for (const [k, v] of Object.entries(params)) url.searchParams.set(k, v);\n\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), 300_000);\n\n let resp: Response;\n try {\n resp = await fetch(url.toString(), {\n method: \"POST\",\n headers: { \"X-API-Key\": this.#apiKey },\n body: form,\n signal: controller.signal,\n });\n } catch (err) {\n clearTimeout(timer);\n const msg = err instanceof Error ? err.message : String(err);\n throw new OxPDFError(`Stream request failed: ${msg}`);\n }\n\n if (!resp.ok) {\n clearTimeout(timer);\n const text = await resp.text();\n throw new OxPDFError(text, resp.status, text);\n }\n\n try {\n const reader = resp.body?.getReader();\n if (!reader) throw new OxPDFError(\"No response body\");\n\n const decoder = new TextDecoder();\n let buffer = \"\";\n let eventType = \"message\";\n\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n buffer += decoder.decode(value, { stream: true });\n\n const lines = buffer.split(\"\\n\");\n buffer = lines.pop() ?? \"\";\n\n for (const line of lines) {\n if (line.startsWith(\"event:\")) {\n eventType = line.slice(6).trim();\n } else if (line.startsWith(\"data:\")) {\n const raw = line.slice(5).trim();\n let data: Record<string, unknown>;\n try {\n data = JSON.parse(raw);\n } catch {\n data = { raw };\n }\n yield { event: eventType, data };\n eventType = \"message\";\n }\n }\n }\n } finally {\n clearTimeout(timer);\n }\n }\n\n /** Streaming parse from a file path (Node.js only). */\n async *parseFileStream(\n filePath: string,\n options: ParseStreamOptions = {},\n ): AsyncGenerator<StreamEvent> {\n const { readFile } = await import(\"node:fs/promises\");\n const { basename } = await import(\"node:path\");\n const buf = await readFile(filePath);\n yield* this.parseStream(buf, basename(filePath), options);\n }\n\n // ── Async upload (job queue) ─────────────────────────────────────\n\n /** Upload a PDF for async background processing. Returns a job_id. */\n async upload(\n file: Blob | Buffer | Uint8Array,\n filename: string,\n options: UploadOptions = {},\n ): Promise<UploadResult> {\n const params: Record<string, string> = {\n use_ocr: String(options.useOcr ?? false),\n ocr_engine: options.ocrEngine ?? \"surya\",\n };\n if (options.schemaId) params.schema_id = options.schemaId;\n if (options.schemaName) params.schema_name = options.schemaName;\n\n const form = this.#buildPdfForm(file, filename);\n\n return this.#request<UploadResult>(\"POST\", \"pdf/upload\", {\n params,\n body: form,\n });\n }\n\n /** Poll the status of an async PDF processing job. */\n async jobStatus(jobId: string): Promise<JobStatus> {\n return this.#request<JobStatus>(\"GET\", `pdf/status/${jobId}`);\n }\n\n // ── PDF validation ───────────────────────────────────────────────\n\n /** Validate a PDF without full processing (dry-run). */\n async validate(\n file: Blob | Buffer | Uint8Array,\n filename: string,\n options: ValidateOptions = {},\n ): Promise<Record<string, unknown>> {\n const params: Record<string, string> = { dry_run: \"true\" };\n if (options.schemaId) params.schema_id = options.schemaId;\n if (options.schemaName) params.schema_name = options.schemaName;\n\n const form = this.#buildPdfForm(file, filename);\n return this.#request(\"POST\", \"pdf/validate\", { params, body: form });\n }\n\n // ── Image extraction ─────────────────────────────────────────────\n\n /** Extract images from a PDF. */\n async extractImages(\n file: Blob | Buffer | Uint8Array,\n filename: string,\n options: ExtractImagesOptions = {},\n ): Promise<Record<string, unknown>> {\n const params: Record<string, string> = {\n min_width: String(options.minWidth ?? 50),\n min_height: String(options.minHeight ?? 50),\n use_ocr: String(options.useOcr ?? false),\n ocr_engine: options.ocrEngine ?? \"surya\",\n };\n if (options.pages) params.pages = options.pages.join(\",\");\n\n const form = this.#buildPdfForm(file, filename);\n return this.#request(\"POST\", \"pdf/parse-images\", { params, body: form });\n }\n\n // ── Image management ─────────────────────────────────────────────\n\n /** List extracted images. */\n async listImages(limit = 100, offset = 0): Promise<ImageListResult> {\n return this.#request<ImageListResult>(\"GET\", \"pdf/images\", {\n params: { limit: String(limit), offset: String(offset) },\n });\n }\n\n /** Get or refresh a presigned URL for an image. */\n async getImageUrl(imageId: string, expirationSeconds = 3600): Promise<ImageUrlResult> {\n return this.#request<ImageUrlResult>(\"GET\", `pdf/images/${imageId}/url`, {\n params: { expiration_seconds: String(expirationSeconds) },\n });\n }\n\n /** Delete a specific image. */\n async deleteImage(imageId: string): Promise<void> {\n await this.#request(\"DELETE\", `pdf/images/${imageId}`);\n }\n\n /** Delete all extracted images. */\n async deleteAllImages(): Promise<Record<string, unknown>> {\n return this.#request(\"DELETE\", \"pdf/images\");\n }\n\n // ── File management ──────────────────────────────────────────────\n\n /** List previously uploaded PDFs. */\n async listFiles(): Promise<FileListResult> {\n return this.#request<FileListResult>(\"GET\", \"pdf/files\");\n }\n\n /** Get metadata and download URL for an uploaded PDF. */\n async getFile(pdfId: string): Promise<FileInfo> {\n return this.#request<FileInfo>(\"GET\", `pdf/files/${pdfId}`);\n }\n\n /** Delete an uploaded PDF. */\n async deleteFile(pdfId: string): Promise<void> {\n await this.#request(\"DELETE\", `pdf/files/${pdfId}`);\n }\n\n // ── Schema templates ─────────────────────────────────────────────\n\n /** List pre-built schema templates (pdf route). */\n async listTemplates(): Promise<SchemaTemplate[]> {\n const res = await this.#request<{ templates: SchemaTemplate[] }>(\"GET\", \"pdf/templates\");\n return res.templates ?? [];\n }\n\n /** List schema templates from /schemas/templates/list. */\n async listSchemaTemplates(): Promise<SchemaTemplate[]> {\n const res = await this.#request<{ templates: SchemaTemplate[] }>(\n \"GET\",\n \"schemas/templates/list\",\n );\n return res.templates ?? [];\n }\n\n /** Get a specific schema template with full definition. */\n async getSchemaTemplate(templateId: string): Promise<SchemaTemplate> {\n return this.#request<SchemaTemplate>(\"GET\", `schemas/templates/${templateId}`);\n }\n\n // ── Schema CRUD ──────────────────────────────────────────────────\n\n /** List user's saved schemas. */\n async listSchemas(): Promise<SchemaInfo[]> {\n const res = await this.#request<{ schemas: SchemaInfo[] }>(\"GET\", \"schemas\");\n return res.schemas ?? [];\n }\n\n /** Get a specific schema by ID. */\n async getSchema(schemaId: string): Promise<SchemaInfo> {\n return this.#request<SchemaInfo>(\"GET\", `schemas/${schemaId}`);\n }\n\n /** Create a new JSON schema. */\n async createSchema(options: CreateSchemaOptions): Promise<SchemaInfo> {\n return this.#request<SchemaInfo>(\"POST\", \"schemas\", {\n body: JSON.stringify({\n name: options.name,\n schema: options.schema,\n is_default: options.isDefault ?? false,\n }),\n headers: { \"Content-Type\": \"application/json\" },\n });\n }\n\n /** Update an existing schema. */\n async updateSchema(schemaId: string, options: UpdateSchemaOptions): Promise<SchemaInfo> {\n return this.#request<SchemaInfo>(\"PUT\", `schemas/${schemaId}`, {\n body: JSON.stringify({\n name: options.name,\n schema: options.schema,\n is_default: options.isDefault ?? false,\n }),\n headers: { \"Content-Type\": \"application/json\" },\n });\n }\n\n /** Delete a schema. */\n async deleteSchema(schemaId: string): Promise<void> {\n await this.#request(\"DELETE\", `schemas/${schemaId}`);\n }\n\n /** Set a schema as the default. */\n async setDefaultSchema(schemaId: string): Promise<SchemaInfo> {\n return this.#request<SchemaInfo>(\"PATCH\", `schemas/${schemaId}/set-default`);\n }\n\n /** Generate a schema using AI from a natural-language description. */\n async generateSchema(options: GenerateSchemaOptions): Promise<GenerateSchemaResult> {\n const body: Record<string, unknown> = { description: options.description };\n if (options.refinement) body.refinement = options.refinement;\n if (options.currentSchema) body.current_schema = options.currentSchema;\n if (options.selectedText) body.selected_text = options.selectedText;\n\n return this.#request<GenerateSchemaResult>(\"POST\", \"schemas/generate\", {\n body: JSON.stringify(body),\n headers: { \"Content-Type\": \"application/json\" },\n });\n }\n\n // ── Analytics ────────────────────────────────────────────────────\n\n /** Get usage analytics for the current user/org. */\n async getAnalytics(): Promise<AnalyticsResult> {\n return this.#request<AnalyticsResult>(\"GET\", \"analytics/user\");\n }\n\n /** Submit in-app feedback. */\n async submitFeedback(feedback: string): Promise<{ success: boolean }> {\n return this.#request<{ success: boolean }>(\"POST\", \"analytics/feedback\", {\n body: JSON.stringify({ feedback }),\n headers: { \"Content-Type\": \"application/json\" },\n });\n }\n\n // ── Pricing ──────────────────────────────────────────────────────\n\n /** Get available pricing tiers. */\n async getPricing(billingCycle = \"monthly\"): Promise<Record<string, unknown>> {\n return this.#request(\"GET\", \"pricing\", {\n params: { billing_cycle: billingCycle },\n });\n }\n\n /** Get the current user's tier and quota. */\n async getCurrentTier(): Promise<Record<string, unknown>> {\n return this.#request(\"GET\", \"pricing/current\");\n }\n}\n"],"mappings":"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","names":["text"]}
package/dist/index.js CHANGED
@@ -11,7 +11,7 @@ var OxPDFError = class extends Error {
11
11
  };
12
12
 
13
13
  // src/client.ts
14
- var DEFAULT_BASE_URL = "https://api.0xpdf.com/api/v1";
14
+ var DEFAULT_BASE_URL = "https://api.0xpdf.io/api/v1";
15
15
  var DEFAULT_TIMEOUT = 12e4;
16
16
  var OxPDFClient = class {
17
17
  #apiKey;
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/errors.ts","../src/client.ts"],"sourcesContent":["export class OxPDFError extends Error {\n readonly statusCode: number | undefined;\n readonly responseBody: string | undefined;\n\n constructor(\n message: string,\n statusCode?: number,\n responseBody?: string,\n ) {\n super(message);\n this.name = \"OxPDFError\";\n this.statusCode = statusCode;\n this.responseBody = responseBody;\n }\n}\n","import { OxPDFError } from \"./errors.js\";\nimport type {\n AnalyticsResult,\n ClientOptions,\n CreateSchemaOptions,\n ExtractImagesOptions,\n FileInfo,\n FileListResult,\n GenerateSchemaOptions,\n GenerateSchemaResult,\n ImageListResult,\n ImageUrlResult,\n JobStatus,\n ParseOptions,\n ParseResult,\n ParseStreamOptions,\n SchemaInfo,\n SchemaTemplate,\n StreamEvent,\n UpdateSchemaOptions,\n UploadOptions,\n UploadResult,\n ValidateOptions,\n} from \"./types.js\";\n\nconst DEFAULT_BASE_URL = \"https://api.0xpdf.com/api/v1\";\nconst DEFAULT_TIMEOUT = 120_000;\n\nexport class OxPDFClient {\n readonly #apiKey: string;\n readonly #baseUrl: string;\n readonly #timeout: number;\n\n constructor(options: ClientOptions) {\n if (!options.apiKey) {\n throw new OxPDFError(\"apiKey is required\");\n }\n this.#apiKey = options.apiKey;\n this.#baseUrl = (options.baseUrl ?? DEFAULT_BASE_URL).replace(/\\/+$/, \"\");\n this.#timeout = options.timeout ?? DEFAULT_TIMEOUT;\n }\n\n // ── internal helpers ─────────────────────────────────────────────\n\n #url(path: string): string {\n return `${this.#baseUrl}/${path.replace(/^\\/+/, \"\")}`;\n }\n\n async #request<T = Record<string, unknown>>(\n method: string,\n path: string,\n init?: {\n params?: Record<string, string>;\n body?: FormData | string;\n headers?: Record<string, string>;\n },\n ): Promise<T> {\n const url = new URL(this.#url(path));\n if (init?.params) {\n for (const [k, v] of Object.entries(init.params)) {\n url.searchParams.set(k, v);\n }\n }\n\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), this.#timeout);\n\n let resp: Response;\n try {\n resp = await fetch(url.toString(), {\n method,\n headers: {\n \"X-API-Key\": this.#apiKey,\n ...init?.headers,\n },\n body: init?.body,\n signal: controller.signal,\n });\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n throw new OxPDFError(`Request failed: ${msg}`);\n } finally {\n clearTimeout(timer);\n }\n\n if (resp.status === 204) return {} as T;\n\n if (!resp.ok) {\n const text = await resp.text();\n let detail: string;\n try {\n const body = JSON.parse(text);\n const raw = body.detail ?? body.error ?? text;\n if (Array.isArray(raw)) {\n detail = raw.map((d: Record<string, unknown>) => d.msg ?? JSON.stringify(d)).join(\"; \");\n } else {\n detail = typeof raw === \"string\" ? raw : JSON.stringify(raw);\n }\n } catch {\n detail = text || resp.statusText || `HTTP ${resp.status}`;\n }\n throw new OxPDFError(detail, resp.status, text);\n }\n\n const text = await resp.text();\n if (!text) return {} as T;\n return JSON.parse(text) as T;\n }\n\n #buildPdfForm(\n file: Blob | Buffer | Uint8Array,\n filename: string,\n fields?: Record<string, string>,\n ): FormData {\n if (!filename.toLowerCase().endsWith(\".pdf\")) {\n throw new OxPDFError(\"File must be a PDF\");\n }\n\n const form = new FormData();\n let blob: Blob;\n if (file instanceof Blob) {\n blob = file;\n } else {\n const arr = new Uint8Array(file.buffer, file.byteOffset, file.byteLength);\n blob = new Blob([arr as unknown as Uint8Array<ArrayBuffer>], {\n type: \"application/pdf\",\n });\n }\n form.append(\"file\", blob, filename);\n if (fields) {\n for (const [k, v] of Object.entries(fields)) form.append(k, v);\n }\n return form;\n }\n\n // ── PDF parsing ──────────────────────────────────────────────────\n\n /** Parse a PDF and return structured JSON. */\n async parse(\n file: Blob | Buffer | Uint8Array,\n filename: string,\n options: ParseOptions = {},\n ): Promise<ParseResult> {\n const formFields: Record<string, string> = {\n use_ocr: String(options.useOcr ?? false),\n };\n if (options.ocrEngine) formFields.ocr_engine = options.ocrEngine;\n if (options.schema) formFields.schema_json = JSON.stringify(options.schema);\n\n const params: Record<string, string> = {};\n if (options.schemaTemplate) params.schema_template = options.schemaTemplate;\n if (options.schemaId) params.schema_id = options.schemaId;\n if (options.pages) params.pages = options.pages.join(\",\");\n\n const form = this.#buildPdfForm(file, filename, formFields);\n\n return this.#request<ParseResult>(\"POST\", \"pdf/parse\", {\n params: Object.keys(params).length ? params : undefined,\n body: form,\n });\n }\n\n /** Parse a PDF from a file path (Node.js only). */\n async parseFile(filePath: string, options: ParseOptions = {}): Promise<ParseResult> {\n const { readFile } = await import(\"node:fs/promises\");\n const { basename } = await import(\"node:path\");\n const buf = await readFile(filePath);\n return this.parse(buf, basename(filePath), options);\n }\n\n /**\n * Streaming parse via Server-Sent Events.\n * Returns an async generator that yields ``StreamEvent`` objects.\n */\n async *parseStream(\n file: Blob | Buffer | Uint8Array,\n filename: string,\n options: ParseStreamOptions = {},\n ): AsyncGenerator<StreamEvent> {\n const formFields: Record<string, string> = {\n use_ocr: String(options.useOcr ?? false),\n };\n if (options.ocrEngine) formFields.ocr_engine = options.ocrEngine;\n if (options.schema) formFields.schema_json = JSON.stringify(options.schema);\n\n const params: Record<string, string> = {\n batch_size: String(options.batchSize ?? 5),\n };\n if (options.schemaTemplate) params.schema_template = options.schemaTemplate;\n if (options.schemaId) params.schema_id = options.schemaId;\n if (options.pages) params.pages = options.pages.join(\",\");\n\n const form = this.#buildPdfForm(file, filename, formFields);\n\n const url = new URL(this.#url(\"pdf/parse-stream\"));\n for (const [k, v] of Object.entries(params)) url.searchParams.set(k, v);\n\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), 300_000);\n\n let resp: Response;\n try {\n resp = await fetch(url.toString(), {\n method: \"POST\",\n headers: { \"X-API-Key\": this.#apiKey },\n body: form,\n signal: controller.signal,\n });\n } catch (err) {\n clearTimeout(timer);\n const msg = err instanceof Error ? err.message : String(err);\n throw new OxPDFError(`Stream request failed: ${msg}`);\n }\n\n if (!resp.ok) {\n clearTimeout(timer);\n const text = await resp.text();\n throw new OxPDFError(text, resp.status, text);\n }\n\n try {\n const reader = resp.body?.getReader();\n if (!reader) throw new OxPDFError(\"No response body\");\n\n const decoder = new TextDecoder();\n let buffer = \"\";\n let eventType = \"message\";\n\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n buffer += decoder.decode(value, { stream: true });\n\n const lines = buffer.split(\"\\n\");\n buffer = lines.pop() ?? \"\";\n\n for (const line of lines) {\n if (line.startsWith(\"event:\")) {\n eventType = line.slice(6).trim();\n } else if (line.startsWith(\"data:\")) {\n const raw = line.slice(5).trim();\n let data: Record<string, unknown>;\n try {\n data = JSON.parse(raw);\n } catch {\n data = { raw };\n }\n yield { event: eventType, data };\n eventType = \"message\";\n }\n }\n }\n } finally {\n clearTimeout(timer);\n }\n }\n\n /** Streaming parse from a file path (Node.js only). */\n async *parseFileStream(\n filePath: string,\n options: ParseStreamOptions = {},\n ): AsyncGenerator<StreamEvent> {\n const { readFile } = await import(\"node:fs/promises\");\n const { basename } = await import(\"node:path\");\n const buf = await readFile(filePath);\n yield* this.parseStream(buf, basename(filePath), options);\n }\n\n // ── Async upload (job queue) ─────────────────────────────────────\n\n /** Upload a PDF for async background processing. Returns a job_id. */\n async upload(\n file: Blob | Buffer | Uint8Array,\n filename: string,\n options: UploadOptions = {},\n ): Promise<UploadResult> {\n const params: Record<string, string> = {\n use_ocr: String(options.useOcr ?? false),\n ocr_engine: options.ocrEngine ?? \"surya\",\n };\n if (options.schemaId) params.schema_id = options.schemaId;\n if (options.schemaName) params.schema_name = options.schemaName;\n\n const form = this.#buildPdfForm(file, filename);\n\n return this.#request<UploadResult>(\"POST\", \"pdf/upload\", {\n params,\n body: form,\n });\n }\n\n /** Poll the status of an async PDF processing job. */\n async jobStatus(jobId: string): Promise<JobStatus> {\n return this.#request<JobStatus>(\"GET\", `pdf/status/${jobId}`);\n }\n\n // ── PDF validation ───────────────────────────────────────────────\n\n /** Validate a PDF without full processing (dry-run). */\n async validate(\n file: Blob | Buffer | Uint8Array,\n filename: string,\n options: ValidateOptions = {},\n ): Promise<Record<string, unknown>> {\n const params: Record<string, string> = { dry_run: \"true\" };\n if (options.schemaId) params.schema_id = options.schemaId;\n if (options.schemaName) params.schema_name = options.schemaName;\n\n const form = this.#buildPdfForm(file, filename);\n return this.#request(\"POST\", \"pdf/validate\", { params, body: form });\n }\n\n // ── Image extraction ─────────────────────────────────────────────\n\n /** Extract images from a PDF. */\n async extractImages(\n file: Blob | Buffer | Uint8Array,\n filename: string,\n options: ExtractImagesOptions = {},\n ): Promise<Record<string, unknown>> {\n const params: Record<string, string> = {\n min_width: String(options.minWidth ?? 50),\n min_height: String(options.minHeight ?? 50),\n use_ocr: String(options.useOcr ?? false),\n ocr_engine: options.ocrEngine ?? \"surya\",\n };\n if (options.pages) params.pages = options.pages.join(\",\");\n\n const form = this.#buildPdfForm(file, filename);\n return this.#request(\"POST\", \"pdf/parse-images\", { params, body: form });\n }\n\n // ── Image management ─────────────────────────────────────────────\n\n /** List extracted images. */\n async listImages(limit = 100, offset = 0): Promise<ImageListResult> {\n return this.#request<ImageListResult>(\"GET\", \"pdf/images\", {\n params: { limit: String(limit), offset: String(offset) },\n });\n }\n\n /** Get or refresh a presigned URL for an image. */\n async getImageUrl(imageId: string, expirationSeconds = 3600): Promise<ImageUrlResult> {\n return this.#request<ImageUrlResult>(\"GET\", `pdf/images/${imageId}/url`, {\n params: { expiration_seconds: String(expirationSeconds) },\n });\n }\n\n /** Delete a specific image. */\n async deleteImage(imageId: string): Promise<void> {\n await this.#request(\"DELETE\", `pdf/images/${imageId}`);\n }\n\n /** Delete all extracted images. */\n async deleteAllImages(): Promise<Record<string, unknown>> {\n return this.#request(\"DELETE\", \"pdf/images\");\n }\n\n // ── File management ──────────────────────────────────────────────\n\n /** List previously uploaded PDFs. */\n async listFiles(): Promise<FileListResult> {\n return this.#request<FileListResult>(\"GET\", \"pdf/files\");\n }\n\n /** Get metadata and download URL for an uploaded PDF. */\n async getFile(pdfId: string): Promise<FileInfo> {\n return this.#request<FileInfo>(\"GET\", `pdf/files/${pdfId}`);\n }\n\n /** Delete an uploaded PDF. */\n async deleteFile(pdfId: string): Promise<void> {\n await this.#request(\"DELETE\", `pdf/files/${pdfId}`);\n }\n\n // ── Schema templates ─────────────────────────────────────────────\n\n /** List pre-built schema templates (pdf route). */\n async listTemplates(): Promise<SchemaTemplate[]> {\n const res = await this.#request<{ templates: SchemaTemplate[] }>(\"GET\", \"pdf/templates\");\n return res.templates ?? [];\n }\n\n /** List schema templates from /schemas/templates/list. */\n async listSchemaTemplates(): Promise<SchemaTemplate[]> {\n const res = await this.#request<{ templates: SchemaTemplate[] }>(\n \"GET\",\n \"schemas/templates/list\",\n );\n return res.templates ?? [];\n }\n\n /** Get a specific schema template with full definition. */\n async getSchemaTemplate(templateId: string): Promise<SchemaTemplate> {\n return this.#request<SchemaTemplate>(\"GET\", `schemas/templates/${templateId}`);\n }\n\n // ── Schema CRUD ──────────────────────────────────────────────────\n\n /** List user's saved schemas. */\n async listSchemas(): Promise<SchemaInfo[]> {\n const res = await this.#request<{ schemas: SchemaInfo[] }>(\"GET\", \"schemas\");\n return res.schemas ?? [];\n }\n\n /** Get a specific schema by ID. */\n async getSchema(schemaId: string): Promise<SchemaInfo> {\n return this.#request<SchemaInfo>(\"GET\", `schemas/${schemaId}`);\n }\n\n /** Create a new JSON schema. */\n async createSchema(options: CreateSchemaOptions): Promise<SchemaInfo> {\n return this.#request<SchemaInfo>(\"POST\", \"schemas\", {\n body: JSON.stringify({\n name: options.name,\n schema: options.schema,\n is_default: options.isDefault ?? false,\n }),\n headers: { \"Content-Type\": \"application/json\" },\n });\n }\n\n /** Update an existing schema. */\n async updateSchema(schemaId: string, options: UpdateSchemaOptions): Promise<SchemaInfo> {\n return this.#request<SchemaInfo>(\"PUT\", `schemas/${schemaId}`, {\n body: JSON.stringify({\n name: options.name,\n schema: options.schema,\n is_default: options.isDefault ?? false,\n }),\n headers: { \"Content-Type\": \"application/json\" },\n });\n }\n\n /** Delete a schema. */\n async deleteSchema(schemaId: string): Promise<void> {\n await this.#request(\"DELETE\", `schemas/${schemaId}`);\n }\n\n /** Set a schema as the default. */\n async setDefaultSchema(schemaId: string): Promise<SchemaInfo> {\n return this.#request<SchemaInfo>(\"PATCH\", `schemas/${schemaId}/set-default`);\n }\n\n /** Generate a schema using AI from a natural-language description. */\n async generateSchema(options: GenerateSchemaOptions): Promise<GenerateSchemaResult> {\n const body: Record<string, unknown> = { description: options.description };\n if (options.refinement) body.refinement = options.refinement;\n if (options.currentSchema) body.current_schema = options.currentSchema;\n if (options.selectedText) body.selected_text = options.selectedText;\n\n return this.#request<GenerateSchemaResult>(\"POST\", \"schemas/generate\", {\n body: JSON.stringify(body),\n headers: { \"Content-Type\": \"application/json\" },\n });\n }\n\n // ── Analytics ────────────────────────────────────────────────────\n\n /** Get usage analytics for the current user/org. */\n async getAnalytics(): Promise<AnalyticsResult> {\n return this.#request<AnalyticsResult>(\"GET\", \"analytics/user\");\n }\n\n /** Submit in-app feedback. */\n async submitFeedback(feedback: string): Promise<{ success: boolean }> {\n return this.#request<{ success: boolean }>(\"POST\", \"analytics/feedback\", {\n body: JSON.stringify({ feedback }),\n headers: { \"Content-Type\": \"application/json\" },\n });\n }\n\n // ── Pricing ──────────────────────────────────────────────────────\n\n /** Get available pricing tiers. */\n async getPricing(billingCycle = \"monthly\"): Promise<Record<string, unknown>> {\n return this.#request(\"GET\", \"pricing\", {\n params: { billing_cycle: billingCycle },\n });\n }\n\n /** Get the current user's tier and quota. */\n async getCurrentTier(): Promise<Record<string, unknown>> {\n return this.#request(\"GET\", \"pricing/current\");\n }\n}\n"],"mappings":"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","names":["text"]}
1
+ {"version":3,"sources":["../src/errors.ts","../src/client.ts"],"sourcesContent":["export class OxPDFError extends Error {\n readonly statusCode: number | undefined;\n readonly responseBody: string | undefined;\n\n constructor(\n message: string,\n statusCode?: number,\n responseBody?: string,\n ) {\n super(message);\n this.name = \"OxPDFError\";\n this.statusCode = statusCode;\n this.responseBody = responseBody;\n }\n}\n","import { OxPDFError } from \"./errors.js\";\nimport type {\n AnalyticsResult,\n ClientOptions,\n CreateSchemaOptions,\n ExtractImagesOptions,\n FileInfo,\n FileListResult,\n GenerateSchemaOptions,\n GenerateSchemaResult,\n ImageListResult,\n ImageUrlResult,\n JobStatus,\n ParseOptions,\n ParseResult,\n ParseStreamOptions,\n SchemaInfo,\n SchemaTemplate,\n StreamEvent,\n UpdateSchemaOptions,\n UploadOptions,\n UploadResult,\n ValidateOptions,\n} from \"./types.js\";\n\nconst DEFAULT_BASE_URL = \"https://api.0xpdf.io/api/v1\";\nconst DEFAULT_TIMEOUT = 120_000;\n\nexport class OxPDFClient {\n readonly #apiKey: string;\n readonly #baseUrl: string;\n readonly #timeout: number;\n\n constructor(options: ClientOptions) {\n if (!options.apiKey) {\n throw new OxPDFError(\"apiKey is required\");\n }\n this.#apiKey = options.apiKey;\n this.#baseUrl = (options.baseUrl ?? DEFAULT_BASE_URL).replace(/\\/+$/, \"\");\n this.#timeout = options.timeout ?? DEFAULT_TIMEOUT;\n }\n\n // ── internal helpers ─────────────────────────────────────────────\n\n #url(path: string): string {\n return `${this.#baseUrl}/${path.replace(/^\\/+/, \"\")}`;\n }\n\n async #request<T = Record<string, unknown>>(\n method: string,\n path: string,\n init?: {\n params?: Record<string, string>;\n body?: FormData | string;\n headers?: Record<string, string>;\n },\n ): Promise<T> {\n const url = new URL(this.#url(path));\n if (init?.params) {\n for (const [k, v] of Object.entries(init.params)) {\n url.searchParams.set(k, v);\n }\n }\n\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), this.#timeout);\n\n let resp: Response;\n try {\n resp = await fetch(url.toString(), {\n method,\n headers: {\n \"X-API-Key\": this.#apiKey,\n ...init?.headers,\n },\n body: init?.body,\n signal: controller.signal,\n });\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n throw new OxPDFError(`Request failed: ${msg}`);\n } finally {\n clearTimeout(timer);\n }\n\n if (resp.status === 204) return {} as T;\n\n if (!resp.ok) {\n const text = await resp.text();\n let detail: string;\n try {\n const body = JSON.parse(text);\n const raw = body.detail ?? body.error ?? text;\n if (Array.isArray(raw)) {\n detail = raw.map((d: Record<string, unknown>) => d.msg ?? JSON.stringify(d)).join(\"; \");\n } else {\n detail = typeof raw === \"string\" ? raw : JSON.stringify(raw);\n }\n } catch {\n detail = text || resp.statusText || `HTTP ${resp.status}`;\n }\n throw new OxPDFError(detail, resp.status, text);\n }\n\n const text = await resp.text();\n if (!text) return {} as T;\n return JSON.parse(text) as T;\n }\n\n #buildPdfForm(\n file: Blob | Buffer | Uint8Array,\n filename: string,\n fields?: Record<string, string>,\n ): FormData {\n if (!filename.toLowerCase().endsWith(\".pdf\")) {\n throw new OxPDFError(\"File must be a PDF\");\n }\n\n const form = new FormData();\n let blob: Blob;\n if (file instanceof Blob) {\n blob = file;\n } else {\n const arr = new Uint8Array(file.buffer, file.byteOffset, file.byteLength);\n blob = new Blob([arr as unknown as Uint8Array<ArrayBuffer>], {\n type: \"application/pdf\",\n });\n }\n form.append(\"file\", blob, filename);\n if (fields) {\n for (const [k, v] of Object.entries(fields)) form.append(k, v);\n }\n return form;\n }\n\n // ── PDF parsing ──────────────────────────────────────────────────\n\n /** Parse a PDF and return structured JSON. */\n async parse(\n file: Blob | Buffer | Uint8Array,\n filename: string,\n options: ParseOptions = {},\n ): Promise<ParseResult> {\n const formFields: Record<string, string> = {\n use_ocr: String(options.useOcr ?? false),\n };\n if (options.ocrEngine) formFields.ocr_engine = options.ocrEngine;\n if (options.schema) formFields.schema_json = JSON.stringify(options.schema);\n\n const params: Record<string, string> = {};\n if (options.schemaTemplate) params.schema_template = options.schemaTemplate;\n if (options.schemaId) params.schema_id = options.schemaId;\n if (options.pages) params.pages = options.pages.join(\",\");\n\n const form = this.#buildPdfForm(file, filename, formFields);\n\n return this.#request<ParseResult>(\"POST\", \"pdf/parse\", {\n params: Object.keys(params).length ? params : undefined,\n body: form,\n });\n }\n\n /** Parse a PDF from a file path (Node.js only). */\n async parseFile(filePath: string, options: ParseOptions = {}): Promise<ParseResult> {\n const { readFile } = await import(\"node:fs/promises\");\n const { basename } = await import(\"node:path\");\n const buf = await readFile(filePath);\n return this.parse(buf, basename(filePath), options);\n }\n\n /**\n * Streaming parse via Server-Sent Events.\n * Returns an async generator that yields ``StreamEvent`` objects.\n */\n async *parseStream(\n file: Blob | Buffer | Uint8Array,\n filename: string,\n options: ParseStreamOptions = {},\n ): AsyncGenerator<StreamEvent> {\n const formFields: Record<string, string> = {\n use_ocr: String(options.useOcr ?? false),\n };\n if (options.ocrEngine) formFields.ocr_engine = options.ocrEngine;\n if (options.schema) formFields.schema_json = JSON.stringify(options.schema);\n\n const params: Record<string, string> = {\n batch_size: String(options.batchSize ?? 5),\n };\n if (options.schemaTemplate) params.schema_template = options.schemaTemplate;\n if (options.schemaId) params.schema_id = options.schemaId;\n if (options.pages) params.pages = options.pages.join(\",\");\n\n const form = this.#buildPdfForm(file, filename, formFields);\n\n const url = new URL(this.#url(\"pdf/parse-stream\"));\n for (const [k, v] of Object.entries(params)) url.searchParams.set(k, v);\n\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), 300_000);\n\n let resp: Response;\n try {\n resp = await fetch(url.toString(), {\n method: \"POST\",\n headers: { \"X-API-Key\": this.#apiKey },\n body: form,\n signal: controller.signal,\n });\n } catch (err) {\n clearTimeout(timer);\n const msg = err instanceof Error ? err.message : String(err);\n throw new OxPDFError(`Stream request failed: ${msg}`);\n }\n\n if (!resp.ok) {\n clearTimeout(timer);\n const text = await resp.text();\n throw new OxPDFError(text, resp.status, text);\n }\n\n try {\n const reader = resp.body?.getReader();\n if (!reader) throw new OxPDFError(\"No response body\");\n\n const decoder = new TextDecoder();\n let buffer = \"\";\n let eventType = \"message\";\n\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n buffer += decoder.decode(value, { stream: true });\n\n const lines = buffer.split(\"\\n\");\n buffer = lines.pop() ?? \"\";\n\n for (const line of lines) {\n if (line.startsWith(\"event:\")) {\n eventType = line.slice(6).trim();\n } else if (line.startsWith(\"data:\")) {\n const raw = line.slice(5).trim();\n let data: Record<string, unknown>;\n try {\n data = JSON.parse(raw);\n } catch {\n data = { raw };\n }\n yield { event: eventType, data };\n eventType = \"message\";\n }\n }\n }\n } finally {\n clearTimeout(timer);\n }\n }\n\n /** Streaming parse from a file path (Node.js only). */\n async *parseFileStream(\n filePath: string,\n options: ParseStreamOptions = {},\n ): AsyncGenerator<StreamEvent> {\n const { readFile } = await import(\"node:fs/promises\");\n const { basename } = await import(\"node:path\");\n const buf = await readFile(filePath);\n yield* this.parseStream(buf, basename(filePath), options);\n }\n\n // ── Async upload (job queue) ─────────────────────────────────────\n\n /** Upload a PDF for async background processing. Returns a job_id. */\n async upload(\n file: Blob | Buffer | Uint8Array,\n filename: string,\n options: UploadOptions = {},\n ): Promise<UploadResult> {\n const params: Record<string, string> = {\n use_ocr: String(options.useOcr ?? false),\n ocr_engine: options.ocrEngine ?? \"surya\",\n };\n if (options.schemaId) params.schema_id = options.schemaId;\n if (options.schemaName) params.schema_name = options.schemaName;\n\n const form = this.#buildPdfForm(file, filename);\n\n return this.#request<UploadResult>(\"POST\", \"pdf/upload\", {\n params,\n body: form,\n });\n }\n\n /** Poll the status of an async PDF processing job. */\n async jobStatus(jobId: string): Promise<JobStatus> {\n return this.#request<JobStatus>(\"GET\", `pdf/status/${jobId}`);\n }\n\n // ── PDF validation ───────────────────────────────────────────────\n\n /** Validate a PDF without full processing (dry-run). */\n async validate(\n file: Blob | Buffer | Uint8Array,\n filename: string,\n options: ValidateOptions = {},\n ): Promise<Record<string, unknown>> {\n const params: Record<string, string> = { dry_run: \"true\" };\n if (options.schemaId) params.schema_id = options.schemaId;\n if (options.schemaName) params.schema_name = options.schemaName;\n\n const form = this.#buildPdfForm(file, filename);\n return this.#request(\"POST\", \"pdf/validate\", { params, body: form });\n }\n\n // ── Image extraction ─────────────────────────────────────────────\n\n /** Extract images from a PDF. */\n async extractImages(\n file: Blob | Buffer | Uint8Array,\n filename: string,\n options: ExtractImagesOptions = {},\n ): Promise<Record<string, unknown>> {\n const params: Record<string, string> = {\n min_width: String(options.minWidth ?? 50),\n min_height: String(options.minHeight ?? 50),\n use_ocr: String(options.useOcr ?? false),\n ocr_engine: options.ocrEngine ?? \"surya\",\n };\n if (options.pages) params.pages = options.pages.join(\",\");\n\n const form = this.#buildPdfForm(file, filename);\n return this.#request(\"POST\", \"pdf/parse-images\", { params, body: form });\n }\n\n // ── Image management ─────────────────────────────────────────────\n\n /** List extracted images. */\n async listImages(limit = 100, offset = 0): Promise<ImageListResult> {\n return this.#request<ImageListResult>(\"GET\", \"pdf/images\", {\n params: { limit: String(limit), offset: String(offset) },\n });\n }\n\n /** Get or refresh a presigned URL for an image. */\n async getImageUrl(imageId: string, expirationSeconds = 3600): Promise<ImageUrlResult> {\n return this.#request<ImageUrlResult>(\"GET\", `pdf/images/${imageId}/url`, {\n params: { expiration_seconds: String(expirationSeconds) },\n });\n }\n\n /** Delete a specific image. */\n async deleteImage(imageId: string): Promise<void> {\n await this.#request(\"DELETE\", `pdf/images/${imageId}`);\n }\n\n /** Delete all extracted images. */\n async deleteAllImages(): Promise<Record<string, unknown>> {\n return this.#request(\"DELETE\", \"pdf/images\");\n }\n\n // ── File management ──────────────────────────────────────────────\n\n /** List previously uploaded PDFs. */\n async listFiles(): Promise<FileListResult> {\n return this.#request<FileListResult>(\"GET\", \"pdf/files\");\n }\n\n /** Get metadata and download URL for an uploaded PDF. */\n async getFile(pdfId: string): Promise<FileInfo> {\n return this.#request<FileInfo>(\"GET\", `pdf/files/${pdfId}`);\n }\n\n /** Delete an uploaded PDF. */\n async deleteFile(pdfId: string): Promise<void> {\n await this.#request(\"DELETE\", `pdf/files/${pdfId}`);\n }\n\n // ── Schema templates ─────────────────────────────────────────────\n\n /** List pre-built schema templates (pdf route). */\n async listTemplates(): Promise<SchemaTemplate[]> {\n const res = await this.#request<{ templates: SchemaTemplate[] }>(\"GET\", \"pdf/templates\");\n return res.templates ?? [];\n }\n\n /** List schema templates from /schemas/templates/list. */\n async listSchemaTemplates(): Promise<SchemaTemplate[]> {\n const res = await this.#request<{ templates: SchemaTemplate[] }>(\n \"GET\",\n \"schemas/templates/list\",\n );\n return res.templates ?? [];\n }\n\n /** Get a specific schema template with full definition. */\n async getSchemaTemplate(templateId: string): Promise<SchemaTemplate> {\n return this.#request<SchemaTemplate>(\"GET\", `schemas/templates/${templateId}`);\n }\n\n // ── Schema CRUD ──────────────────────────────────────────────────\n\n /** List user's saved schemas. */\n async listSchemas(): Promise<SchemaInfo[]> {\n const res = await this.#request<{ schemas: SchemaInfo[] }>(\"GET\", \"schemas\");\n return res.schemas ?? [];\n }\n\n /** Get a specific schema by ID. */\n async getSchema(schemaId: string): Promise<SchemaInfo> {\n return this.#request<SchemaInfo>(\"GET\", `schemas/${schemaId}`);\n }\n\n /** Create a new JSON schema. */\n async createSchema(options: CreateSchemaOptions): Promise<SchemaInfo> {\n return this.#request<SchemaInfo>(\"POST\", \"schemas\", {\n body: JSON.stringify({\n name: options.name,\n schema: options.schema,\n is_default: options.isDefault ?? false,\n }),\n headers: { \"Content-Type\": \"application/json\" },\n });\n }\n\n /** Update an existing schema. */\n async updateSchema(schemaId: string, options: UpdateSchemaOptions): Promise<SchemaInfo> {\n return this.#request<SchemaInfo>(\"PUT\", `schemas/${schemaId}`, {\n body: JSON.stringify({\n name: options.name,\n schema: options.schema,\n is_default: options.isDefault ?? false,\n }),\n headers: { \"Content-Type\": \"application/json\" },\n });\n }\n\n /** Delete a schema. */\n async deleteSchema(schemaId: string): Promise<void> {\n await this.#request(\"DELETE\", `schemas/${schemaId}`);\n }\n\n /** Set a schema as the default. */\n async setDefaultSchema(schemaId: string): Promise<SchemaInfo> {\n return this.#request<SchemaInfo>(\"PATCH\", `schemas/${schemaId}/set-default`);\n }\n\n /** Generate a schema using AI from a natural-language description. */\n async generateSchema(options: GenerateSchemaOptions): Promise<GenerateSchemaResult> {\n const body: Record<string, unknown> = { description: options.description };\n if (options.refinement) body.refinement = options.refinement;\n if (options.currentSchema) body.current_schema = options.currentSchema;\n if (options.selectedText) body.selected_text = options.selectedText;\n\n return this.#request<GenerateSchemaResult>(\"POST\", \"schemas/generate\", {\n body: JSON.stringify(body),\n headers: { \"Content-Type\": \"application/json\" },\n });\n }\n\n // ── Analytics ────────────────────────────────────────────────────\n\n /** Get usage analytics for the current user/org. */\n async getAnalytics(): Promise<AnalyticsResult> {\n return this.#request<AnalyticsResult>(\"GET\", \"analytics/user\");\n }\n\n /** Submit in-app feedback. */\n async submitFeedback(feedback: string): Promise<{ success: boolean }> {\n return this.#request<{ success: boolean }>(\"POST\", \"analytics/feedback\", {\n body: JSON.stringify({ feedback }),\n headers: { \"Content-Type\": \"application/json\" },\n });\n }\n\n // ── Pricing ──────────────────────────────────────────────────────\n\n /** Get available pricing tiers. */\n async getPricing(billingCycle = \"monthly\"): Promise<Record<string, unknown>> {\n return this.#request(\"GET\", \"pricing\", {\n params: { billing_cycle: billingCycle },\n });\n }\n\n /** Get the current user's tier and quota. */\n async getCurrentTier(): Promise<Record<string, unknown>> {\n return this.#request(\"GET\", \"pricing/current\");\n }\n}\n"],"mappings":"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","names":["text"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "oxpdf",
3
- "version": "0.1.1",
3
+ "version": "0.1.2",
4
4
  "description": "TypeScript/JavaScript SDK for the 0xPdf PDF-to-JSON API",
5
5
  "keywords": [
6
6
  "pdf",