mineru-open-sdk 0.1.3 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +15 -7
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +3 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.js +15 -7
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.cjs
CHANGED
|
@@ -60,6 +60,7 @@ module.exports = __toCommonJS(index_exports);
|
|
|
60
60
|
// src/constants.ts
|
|
61
61
|
var DEFAULT_BASE_URL = "https://mineru.net/api/v4";
|
|
62
62
|
var DEFAULT_FLASH_BASE_URL = "https://mineru.net/api/v1/agent";
|
|
63
|
+
var UPLOAD_TIMEOUT_MS = 3e5;
|
|
63
64
|
|
|
64
65
|
// src/client.ts
|
|
65
66
|
var import_promises2 = require("fs/promises");
|
|
@@ -222,7 +223,8 @@ var ApiClient = class {
|
|
|
222
223
|
async putFile(url, data) {
|
|
223
224
|
const resp = await fetch(url, {
|
|
224
225
|
method: "PUT",
|
|
225
|
-
body: data
|
|
226
|
+
body: data,
|
|
227
|
+
signal: AbortSignal.timeout(UPLOAD_TIMEOUT_MS)
|
|
226
228
|
});
|
|
227
229
|
if (!resp.ok) {
|
|
228
230
|
throw new Error(`Upload failed: ${resp.status} ${resp.statusText}`);
|
|
@@ -282,7 +284,7 @@ var FlashApiClient = class {
|
|
|
282
284
|
return this.handle(resp);
|
|
283
285
|
}
|
|
284
286
|
async putFile(url, data) {
|
|
285
|
-
const resp = await fetch(url, { method: "PUT", body: data });
|
|
287
|
+
const resp = await fetch(url, { method: "PUT", body: data, signal: AbortSignal.timeout(UPLOAD_TIMEOUT_MS) });
|
|
286
288
|
if (!resp.ok) {
|
|
287
289
|
throw new Error(`Upload failed: ${resp.status} ${resp.statusText}`);
|
|
288
290
|
}
|
|
@@ -738,26 +740,32 @@ var MinerU = class {
|
|
|
738
740
|
// Flash (agent) mode
|
|
739
741
|
// ══════════════════════════════════════════════════════════════════
|
|
740
742
|
async flashExtract(source, options = {}) {
|
|
741
|
-
const { language = "ch", pageRange, timeout = DEFAULT_TIMEOUT_POLL_SINGLE } = options;
|
|
743
|
+
const { language = "ch", pageRange, ocr, formula, table, timeout = DEFAULT_TIMEOUT_POLL_SINGLE } = options;
|
|
742
744
|
let taskId;
|
|
743
745
|
if (isUrl(source)) {
|
|
744
|
-
taskId = await this.flashSubmitUrl(source, language, pageRange);
|
|
746
|
+
taskId = await this.flashSubmitUrl(source, language, pageRange, ocr, formula, table);
|
|
745
747
|
} else {
|
|
746
|
-
taskId = await this.flashSubmitFile(source, language, pageRange);
|
|
748
|
+
taskId = await this.flashSubmitFile(source, language, pageRange, ocr, formula, table);
|
|
747
749
|
}
|
|
748
750
|
return this.flashWait(taskId, timeout);
|
|
749
751
|
}
|
|
750
752
|
// ── Flash internal helpers ──
|
|
751
|
-
async flashSubmitUrl(url, language, pageRange) {
|
|
753
|
+
async flashSubmitUrl(url, language, pageRange, ocr, formula, table) {
|
|
752
754
|
const payload = { url, language };
|
|
753
755
|
if (pageRange != null) payload["page_range"] = pageRange;
|
|
756
|
+
if (ocr != null) payload["is_ocr"] = ocr;
|
|
757
|
+
if (formula != null) payload["enable_formula"] = formula;
|
|
758
|
+
if (table != null) payload["enable_table"] = table;
|
|
754
759
|
const body = await this.flashApi.post("/parse/url", payload);
|
|
755
760
|
return body.data["task_id"];
|
|
756
761
|
}
|
|
757
|
-
async flashSubmitFile(filePath, language, pageRange) {
|
|
762
|
+
async flashSubmitFile(filePath, language, pageRange, ocr, formula, table) {
|
|
758
763
|
const fileName = (0, import_node_path2.basename)(filePath);
|
|
759
764
|
const payload = { file_name: fileName, language };
|
|
760
765
|
if (pageRange != null) payload["page_range"] = pageRange;
|
|
766
|
+
if (ocr != null) payload["is_ocr"] = ocr;
|
|
767
|
+
if (formula != null) payload["enable_formula"] = formula;
|
|
768
|
+
if (table != null) payload["enable_table"] = table;
|
|
761
769
|
const body = await this.flashApi.post("/parse/file", payload);
|
|
762
770
|
const taskId = body.data["task_id"];
|
|
763
771
|
const fileUrl = body.data["file_url"];
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/constants.ts","../src/client.ts","../src/errors.ts","../src/api.ts","../src/flash-api.ts","../src/models.ts","../src/zip.ts"],"sourcesContent":["export { DEFAULT_BASE_URL, DEFAULT_FLASH_BASE_URL } from \"./constants.js\";\n\nexport { MinerU } from \"./client.js\";\nexport type { ExtractOptions, BatchOptions, FlashExtractOptions, FileParam } from \"./client.js\";\n\nexport type { ExtractResult, Image, Progress } from \"./models.js\";\nexport {\n saveMarkdown,\n saveDocx,\n saveHtml,\n saveLatex,\n saveAll,\n progressPercent,\n progressToString,\n} from \"./models.js\";\n\nexport {\n MinerUError,\n AuthError,\n ParamError,\n FileTooLargeError,\n PageLimitError,\n TaskNotFoundError,\n ExtractFailedError,\n TimeoutError,\n QuotaExceededError,\n FlashFileTooLargeError,\n FlashUnsupportedTypeError,\n FlashPageLimitError,\n FlashParamError,\n NoAuthClientError,\n} from \"./errors.js\";\n","export const DEFAULT_BASE_URL = \"https://mineru.net/api/v4\";\n\nexport const DEFAULT_FLASH_BASE_URL = \"https://mineru.net/api/v1/agent\";\n","import { readFile } from \"node:fs/promises\";\nimport { basename, extname } from \"node:path\";\n\nimport { ApiClient } from \"./api.js\";\nimport { DEFAULT_BASE_URL } from \"./constants.js\";\nimport { NoAuthClientError, TimeoutError } from \"./errors.js\";\nimport { FlashApiClient } from \"./flash-api.js\";\nimport type { ExtractResult, Progress } from \"./models.js\";\nimport { createEmptyResult } from \"./models.js\";\nimport { parseZip } from \"./zip.js\";\n\nconst MODEL_MAP: Record<string, string> = {\n pipeline: \"pipeline\",\n vlm: \"vlm\",\n html: \"MinerU-HTML\",\n};\n\nconst HTML_EXTENSIONS = new Set([\".html\", \".htm\"]);\n\nconst DEFAULT_SOURCE = \"open-api-sdk-js\";\n\n/** Default total business timeouts for extraction tasks (in seconds). */\nconst DEFAULT_TIMEOUT_POLL_SINGLE = 300;\nconst DEFAULT_TIMEOUT_POLL_BATCH = 1800;\n\nfunction isUrl(source: string): boolean {\n return source.startsWith(\"http://\") || source.startsWith(\"https://\");\n}\n\nfunction getExtension(source: string): string {\n if (isUrl(source)) {\n const path = source.split(\"?\")[0]!.split(\"#\")[0]!;\n const dot = path.lastIndexOf(\".\");\n return dot === -1 ? \"\" : path.slice(dot).toLowerCase();\n }\n return extname(source).toLowerCase();\n}\n\nfunction inferModel(source: string): string {\n return HTML_EXTENSIONS.has(getExtension(source)) ? \"MinerU-HTML\" : \"vlm\";\n}\n\nfunction resolveModel(model: string | undefined, source: string): string {\n if (model != null) {\n return MODEL_MAP[model] ?? model;\n }\n return inferModel(source);\n}\n\nexport interface ExtractOptions {\n model?: string;\n ocr?: boolean;\n formula?: boolean;\n table?: boolean;\n language?: string;\n pages?: string;\n extraFormats?: string[];\n /** Per-file overrides keyed by path or URL. */\n fileParams?: Record<string, FileParam>;\n /** Max total seconds to wait for task completion (polling). */\n timeout?: number;\n}\n\nexport interface BatchOptions {\n model?: string;\n ocr?: boolean;\n formula?: boolean;\n table?: boolean;\n language?: string;\n extraFormats?: string[];\n /** Per-file overrides keyed by path or URL. */\n fileParams?: Record<string, FileParam>;\n /** Max total seconds to wait for all tasks (polling). */\n timeout?: number;\n}\n\nexport interface FlashExtractOptions {\n language?: string;\n pageRange?: string;\n /** Max total seconds to wait for task completion (polling). */\n timeout?: number;\n}\n\n/** Per-file parameter overrides for batch methods. */\nexport interface FileParam {\n /** Override page_ranges for this file (e.g. \"1-10,15\"). */\n pages?: string;\n /** Override is_ocr for this file. */\n ocr?: boolean;\n /** Set data_id for this file. */\n dataId?: string;\n}\n\n/** Only includes fields the user explicitly set. Never assumes API defaults. */\nfunction buildApiOptions(\n modelVersion: string,\n opts: ExtractOptions | BatchOptions,\n): Record<string, unknown> {\n const o: Record<string, unknown> = { model_version: modelVersion };\n if (opts.formula !== undefined) o[\"enable_formula\"] = opts.formula;\n if (opts.table !== undefined) o[\"enable_table\"] = opts.table;\n if (opts.language !== undefined) o[\"language\"] = opts.language;\n if (opts.extraFormats?.length) {\n o[\"extra_formats\"] = opts.extraFormats;\n }\n return o;\n}\n\n/** Adds per-file fields (is_ocr, page_ranges, data_id) to a file entry. */\nfunction applyFileFields(\n entry: Record<string, unknown>,\n key: string,\n ocr: boolean | undefined,\n pages: string | undefined,\n fileParams: Record<string, FileParam> | undefined,\n): void {\n const fp = fileParams?.[key];\n\n // OCR: per-file overrides global\n const effectiveOcr = fp?.ocr !== undefined ? fp.ocr : ocr;\n if (effectiveOcr !== undefined) entry[\"is_ocr\"] = effectiveOcr;\n\n // Pages: per-file overrides global\n const effectivePages = fp?.pages || pages;\n if (effectivePages) entry[\"page_ranges\"] = effectivePages;\n\n // DataID: per-file only\n if (fp?.dataId) entry[\"data_id\"] = fp.dataId;\n}\n\nfunction parseTaskResult(data: Record<string, unknown>): ExtractResult {\n const result = createEmptyResult(\n (data[\"task_id\"] as string) ?? \"\",\n (data[\"state\"] as string) ?? \"unknown\",\n );\n result.filename = (data[\"file_name\"] as string) ?? null;\n const errCodeRaw = data[\"err_code\"];\n result.errCode = errCodeRaw == null ? \"\" : String(errCodeRaw);\n result.error = (data[\"err_msg\"] as string) || null;\n result.zipUrl = (data[\"full_zip_url\"] as string) ?? null;\n\n const ep = data[\"extract_progress\"] as Record<string, unknown> | undefined;\n if (ep) {\n result.progress = {\n extractedPages: (ep[\"extracted_pages\"] as number) ?? 0,\n totalPages: (ep[\"total_pages\"] as number) ?? 0,\n startTime: (ep[\"start_time\"] as string) ?? \"\",\n } satisfies Progress;\n }\n return result;\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\n/**\n * MinerU API client. Turn documents into Markdown with one method call.\n */\nexport class MinerU {\n private readonly api: ApiClient | null;\n private readonly flashApi: FlashApiClient;\n\n /**\n * @param token - API token.\n * @param baseUrl - API base URL.\n * @param flashBaseUrl - Flash API base URL.\n */\n constructor(\n token?: string,\n baseUrl = DEFAULT_BASE_URL,\n flashBaseUrl?: string,\n ) {\n const resolved = token ?? process.env[\"MINERU_TOKEN\"];\n if (resolved) {\n // ApiClient should ideally use DEFAULT_TIMEOUT_REQUEST internally\n this.api = new ApiClient(resolved, baseUrl, DEFAULT_SOURCE);\n } else {\n this.api = null; // flash-only mode\n }\n this.flashApi = new FlashApiClient(flashBaseUrl, DEFAULT_SOURCE);\n }\n\n setSource(source: string): void {\n if (this.api !== null) {\n this.api.setSource(source);\n }\n this.flashApi.setSource(source);\n }\n\n private requireAuth(): ApiClient {\n if (this.api === null) {\n throw new NoAuthClientError();\n }\n return this.api;\n }\n\n // ══════════════════════════════════════════════════════════════════\n // Synchronous (blocking) methods\n // ══════════════════════════════════════════════════════════════════\n\n async extract(\n source: string,\n options: ExtractOptions = {},\n ): Promise<ExtractResult> {\n this.requireAuth();\n const { timeout = DEFAULT_TIMEOUT_POLL_SINGLE, ...opts } = options;\n const modelVersion = resolveModel(opts.model, source);\n const apiOpts = buildApiOptions(modelVersion, opts);\n\n let batchId: string;\n if (isUrl(source)) {\n batchId = await this.submitUrlsBatch([source], apiOpts, opts.ocr, opts.pages, opts.fileParams);\n } else {\n batchId = await this.uploadAndSubmit([source], apiOpts, opts.ocr, opts.pages, opts.fileParams);\n }\n const results = await this.waitBatch(batchId, timeout);\n return results[0]!;\n }\n\n async *extractBatch(\n sources: string[],\n options: BatchOptions = {},\n ): AsyncGenerator<ExtractResult> {\n this.requireAuth();\n const { timeout = DEFAULT_TIMEOUT_POLL_BATCH, ...opts } = options;\n const firstSource = sources[0] ?? \"\";\n const modelVersion = resolveModel(opts.model, firstSource);\n const apiOpts = buildApiOptions(modelVersion, opts);\n\n const urls = sources.filter(isUrl);\n const files = sources.filter((s) => !isUrl(s));\n\n const batchIds: string[] = [];\n if (urls.length > 0) {\n batchIds.push(await this.submitUrlsBatch(urls, apiOpts, opts.ocr, undefined, opts.fileParams));\n }\n if (files.length > 0) {\n batchIds.push(await this.uploadAndSubmit(files, apiOpts, opts.ocr, undefined, opts.fileParams));\n }\n\n yield* this.yieldBatch(batchIds, sources.length, timeout);\n }\n\n async crawl(\n url: string,\n options: { extraFormats?: string[]; timeout?: number } = {},\n ): Promise<ExtractResult> {\n return this.extract(url, { model: \"html\", timeout: DEFAULT_TIMEOUT_POLL_SINGLE, ...options });\n }\n\n async *crawlBatch(\n urls: string[],\n options: { extraFormats?: string[]; timeout?: number } = {},\n ): AsyncGenerator<ExtractResult> {\n yield* this.extractBatch(urls, { model: \"html\", timeout: DEFAULT_TIMEOUT_POLL_BATCH, ...options });\n }\n\n // ══════════════════════════════════════════════════════════════════\n // Async primitives (no polling, no waiting)\n // ══════════════════════════════════════════════════════════════════\n\n async submit(\n source: string,\n options: Omit<ExtractOptions, \"timeout\"> = {},\n ): Promise<string> {\n this.requireAuth();\n const modelVersion = resolveModel(options.model, source);\n const apiOpts = buildApiOptions(modelVersion, options);\n\n if (isUrl(source)) {\n return this.submitUrlsBatch([source], apiOpts, options.ocr, options.pages, options.fileParams);\n }\n return this.uploadAndSubmit([source], apiOpts, options.ocr, options.pages, options.fileParams);\n }\n\n async submitBatch(\n sources: string[],\n options: Omit<BatchOptions, \"timeout\"> = {},\n ): Promise<string> {\n this.requireAuth();\n const firstSource = sources[0] ?? \"\";\n const modelVersion = resolveModel(options.model, firstSource);\n const apiOpts = buildApiOptions(modelVersion, options);\n\n const urls = sources.filter(isUrl);\n const files = sources.filter((s) => !isUrl(s));\n\n if (urls.length === 0 && files.length === 0) {\n throw new Error(\"No sources provided.\");\n }\n if (urls.length > 0 && files.length > 0) {\n throw new Error(\n \"submitBatch() does not support mixing URLs and local files in one call. \" +\n \"Please submit them separately or use extractBatch() instead.\",\n );\n }\n\n if (urls.length > 0) {\n return this.submitUrlsBatch(urls, apiOpts, options.ocr, undefined, options.fileParams);\n }\n return this.uploadAndSubmit(files, apiOpts, options.ocr, undefined, options.fileParams);\n }\n\n async getTask(taskId: string): Promise<ExtractResult> {\n const api = this.requireAuth();\n const body = await api.get(`/extract/task/${taskId}`);\n const result = parseTaskResult(body.data);\n if (result.state === \"done\" && result.zipUrl) {\n return this.downloadAndParse(result);\n }\n return result;\n }\n\n async getBatch(batchId: string): Promise<ExtractResult[]> {\n const api = this.requireAuth();\n const body = await api.get(`/extract-results/batch/${batchId}`);\n const items = (body.data[\"extract_result\"] as Record<string, unknown>[]) ?? [];\n const results: ExtractResult[] = [];\n for (const item of items) {\n let r = parseTaskResult(item);\n if (r.state === \"done\" && r.zipUrl) {\n r = await this.downloadAndParse(r);\n }\n results.push(r);\n }\n return results;\n }\n\n // ══════════════════════════════════════════════════════════════════\n // Internal helpers\n // ══════════════════════════════════════════════════════════════════\n\n private async submitUrlsBatch(\n urls: string[],\n opts: Record<string, unknown>,\n ocr: boolean | undefined,\n pages: string | undefined,\n fileParams: Record<string, FileParam> | undefined,\n ): Promise<string> {\n const files = urls.map((u) => {\n const entry: Record<string, unknown> = { url: u };\n applyFileFields(entry, u, ocr, pages, fileParams);\n return entry;\n });\n const body = await this.requireAuth().post(\"/extract/task/batch\", {\n files,\n ...opts,\n });\n return body.data[\"batch_id\"] as string;\n }\n\n private async uploadAndSubmit(\n filePaths: string[],\n opts: Record<string, unknown>,\n ocr: boolean | undefined,\n pages: string | undefined,\n fileParams: Record<string, FileParam> | undefined,\n ): Promise<string> {\n const api = this.requireAuth();\n const filesMeta = filePaths.map((p) => {\n const entry: Record<string, unknown> = { name: basename(p) };\n applyFileFields(entry, p, ocr, pages, fileParams);\n return entry;\n });\n const body = await api.post(\"/file-urls/batch\", {\n files: filesMeta,\n ...opts,\n });\n const batchId = body.data[\"batch_id\"] as string;\n const uploadUrls = body.data[\"file_urls\"] as string[];\n\n for (let i = 0; i < filePaths.length; i++) {\n const data = await readFile(filePaths[i]!);\n await api.putFile(uploadUrls[i]!, new Uint8Array(data));\n }\n\n return batchId;\n }\n\n private async downloadAndParse(\n result: ExtractResult,\n ): Promise<ExtractResult> {\n const zipBytes = await this.requireAuth().download(result.zipUrl!);\n const parsed = parseZip(zipBytes, result.taskId, result.filename);\n parsed.zipUrl = result.zipUrl;\n return parsed;\n }\n\n private async waitBatch(\n batchId: string,\n timeout: number,\n ): Promise<ExtractResult[]> {\n const deadline = Date.now() + timeout * 1000;\n let interval = 2000;\n for (;;) {\n const results = await this.getBatch(batchId);\n if (results.every((r) => r.state === \"done\" || r.state === \"failed\")) {\n return results;\n }\n if (Date.now() > deadline) {\n throw new TimeoutError(timeout, batchId);\n }\n await sleep(Math.min(interval, Math.max(0, deadline - Date.now())));\n interval = Math.min(interval * 2, 30_000);\n }\n }\n\n private async *yieldBatch(\n batchIds: string[],\n total: number,\n timeout: number,\n ): AsyncGenerator<ExtractResult> {\n const deadline = Date.now() + timeout * 1000;\n const yielded = new Set<string>();\n let interval = 2000;\n\n while (yielded.size < total) {\n for (const bid of batchIds) {\n const results = await this.getBatch(bid);\n for (let idx = 0; idx < results.length; idx++) {\n const key = `${bid}:${idx}`;\n const r = results[idx]!;\n if (!yielded.has(key) && (r.state === \"done\" || r.state === \"failed\")) {\n yielded.add(key);\n yield r;\n }\n }\n }\n\n if (yielded.size >= total) break;\n if (Date.now() > deadline) {\n throw new TimeoutError(timeout, batchIds.join(\",\"));\n }\n await sleep(Math.min(interval, Math.max(0, deadline - Date.now())));\n interval = Math.min(interval * 2, 30_000);\n }\n }\n\n // ══════════════════════════════════════════════════════════════════\n // Flash (agent) mode\n // ══════════════════════════════════════════════════════════════════\n\n async flashExtract(\n source: string,\n options: FlashExtractOptions = {},\n ): Promise<ExtractResult> {\n const { language = \"ch\", pageRange, timeout = DEFAULT_TIMEOUT_POLL_SINGLE } = options;\n\n let taskId: string;\n if (isUrl(source)) {\n taskId = await this.flashSubmitUrl(source, language, pageRange);\n } else {\n taskId = await this.flashSubmitFile(source, language, pageRange);\n }\n\n return this.flashWait(taskId, timeout);\n }\n\n // ── Flash internal helpers ──\n\n private async flashSubmitUrl(\n url: string,\n language: string,\n pageRange?: string,\n ): Promise<string> {\n const payload: Record<string, unknown> = { url, language };\n if (pageRange != null) payload[\"page_range\"] = pageRange;\n const body = await this.flashApi.post(\"/parse/url\", payload);\n return body.data[\"task_id\"] as string;\n }\n\n private async flashSubmitFile(\n filePath: string,\n language: string,\n pageRange?: string,\n ): Promise<string> {\n const fileName = basename(filePath);\n const payload: Record<string, unknown> = { file_name: fileName, language };\n if (pageRange != null) payload[\"page_range\"] = pageRange;\n const body = await this.flashApi.post(\"/parse/file\", payload);\n const taskId = body.data[\"task_id\"] as string;\n const fileUrl = body.data[\"file_url\"] as string;\n\n const data = await readFile(filePath);\n await this.flashApi.putFile(fileUrl, new Uint8Array(data));\n return taskId;\n }\n\n private async flashWait(\n taskId: string,\n timeout: number,\n ): Promise<ExtractResult> {\n const deadline = Date.now() + timeout * 1000;\n let interval = 2000;\n for (;;) {\n const result = await this.flashGetTask(taskId);\n if (result.state === \"done\" || result.state === \"failed\") return result;\n if (Date.now() > deadline) throw new TimeoutError(timeout, taskId);\n await sleep(Math.min(interval, Math.max(0, deadline - Date.now())));\n interval = Math.min(interval * 2, 30_000);\n }\n }\n\n private async flashGetTask(taskId: string): Promise<ExtractResult> {\n const body = await this.flashApi.get(`/parse/${taskId}`);\n return this.parseFlashTask(body.data);\n }\n\n private async parseFlashTask(\n data: Record<string, unknown>,\n ): Promise<ExtractResult> {\n const result = createEmptyResult(\n (data[\"task_id\"] as string) ?? \"\",\n (data[\"state\"] as string) ?? \"unknown\",\n );\n const errCodeRaw = data[\"err_code\"];\n result.errCode = errCodeRaw == null ? \"\" : String(errCodeRaw);\n result.error = (data[\"err_msg\"] as string) || null;\n\n const ep = data[\"extract_progress\"] as\n | Record<string, unknown>\n | undefined;\n if (ep) {\n result.progress = {\n extractedPages: (ep[\"extracted_pages\"] as number) ?? 0,\n totalPages: (ep[\"total_pages\"] as number) ?? 0,\n startTime: (ep[\"start_time\"] as string) ?? \"\",\n };\n }\n\n if (result.state === \"done\" && data[\"markdown_url\"]) {\n result.markdown = await this.flashApi.downloadText(\n data[\"markdown_url\"] as string,\n );\n }\n\n return result;\n }\n}\n","export class MinerUError extends Error {\n readonly code: string;\n readonly traceId: string;\n\n constructor(code: string | number, message: string, traceId = \"\") {\n const tag = traceId ? ` (trace: ${traceId})` : \"\";\n super(`[${code}] ${message}${tag}`);\n this.name = \"MinerUError\";\n this.code = String(code);\n this.traceId = traceId;\n }\n}\n\nexport class AuthError extends MinerUError {\n constructor(code: string | number, message: string, traceId = \"\") {\n super(code, message, traceId);\n this.name = \"AuthError\";\n }\n}\n\nexport class ParamError extends MinerUError {\n constructor(code: string | number, message: string, traceId = \"\") {\n super(code, message, traceId);\n this.name = \"ParamError\";\n }\n}\n\nexport class FileTooLargeError extends MinerUError {\n constructor(code: string | number, message: string, traceId = \"\") {\n super(code, message, traceId);\n this.name = \"FileTooLargeError\";\n }\n}\n\nexport class PageLimitError extends MinerUError {\n constructor(code: string | number, message: string, traceId = \"\") {\n super(code, message, traceId);\n this.name = \"PageLimitError\";\n }\n}\n\nexport class TaskNotFoundError extends MinerUError {\n constructor(code: string | number, message: string, traceId = \"\") {\n super(code, message, traceId);\n this.name = \"TaskNotFoundError\";\n }\n}\n\nexport class ExtractFailedError extends MinerUError {\n constructor(code: string | number, message: string, traceId = \"\") {\n super(code, message, traceId);\n this.name = \"ExtractFailedError\";\n }\n}\n\nexport class TimeoutError extends MinerUError {\n readonly timeout: number;\n readonly taskId: string;\n\n constructor(timeout: number, taskId: string) {\n super(\"TIMEOUT\", `Task ${taskId} did not complete within ${timeout}s`);\n this.name = \"TimeoutError\";\n this.timeout = timeout;\n this.taskId = taskId;\n }\n}\n\nexport class QuotaExceededError extends MinerUError {\n constructor(code: string | number, message: string, traceId = \"\") {\n super(code, message, traceId);\n this.name = \"QuotaExceededError\";\n }\n}\n\n// Flash API specific errors\n\nexport class FlashFileTooLargeError extends MinerUError {\n constructor(code: string | number, message: string, traceId = \"\") {\n super(code, message, traceId);\n this.name = \"FlashFileTooLargeError\";\n }\n}\n\nexport class FlashUnsupportedTypeError extends MinerUError {\n constructor(code: string | number, message: string, traceId = \"\") {\n super(code, message, traceId);\n this.name = \"FlashUnsupportedTypeError\";\n }\n}\n\nexport class FlashPageLimitError extends MinerUError {\n constructor(code: string | number, message: string, traceId = \"\") {\n super(code, message, traceId);\n this.name = \"FlashPageLimitError\";\n }\n}\n\nexport class FlashParamError extends MinerUError {\n constructor(code: string | number, message: string, traceId = \"\") {\n super(code, message, traceId);\n this.name = \"FlashParamError\";\n }\n}\n\nexport class NoAuthClientError extends MinerUError {\n constructor() {\n super(\n \"-1\",\n \"This operation requires an authenticated client; pass token to MinerU() or set MINERU_TOKEN env var.\",\n );\n this.name = \"NoAuthClientError\";\n }\n}\n\nconst CODE_TO_ERROR: Record<string, typeof MinerUError> = {\n A0202: AuthError,\n A0211: AuthError,\n \"-500\": ParamError,\n \"-10002\": ParamError,\n \"-60005\": FileTooLargeError,\n \"-60006\": PageLimitError,\n \"-60010\": ExtractFailedError,\n \"-60012\": TaskNotFoundError,\n \"-60013\": MinerUError,\n \"-60018\": QuotaExceededError,\n \"-60019\": QuotaExceededError,\n \"-30001\": FlashFileTooLargeError,\n \"-30002\": FlashUnsupportedTypeError,\n \"-30003\": FlashPageLimitError,\n \"-30004\": FlashParamError,\n};\n\nexport function raiseForCode(\n code: number | string,\n msg: string,\n traceId = \"\",\n): never {\n const ErrorClass = CODE_TO_ERROR[String(code)] ?? MinerUError;\n throw new ErrorClass(code, msg, traceId);\n}\n","import { raiseForCode } from \"./errors.js\";\n\ninterface ApiResponse {\n code: number;\n msg?: string;\n trace_id?: string;\n data: Record<string, unknown>;\n}\n\nexport class ApiClient {\n private readonly baseUrl: string;\n private readonly headers: Record<string, string>;\n private source: string;\n\n constructor(token: string, baseUrl: string, source = \"\") {\n this.baseUrl = baseUrl;\n this.headers = {\n Authorization: `Bearer ${token}`,\n \"Content-Type\": \"application/json\",\n };\n this.source = source;\n }\n\n setSource(source: string): void {\n this.source = source;\n }\n\n async post(\n path: string,\n json: Record<string, unknown>,\n ): Promise<ApiResponse> {\n const headers: Record<string, string> = { ...this.headers };\n if (this.source) {\n headers[\"source\"] = this.source;\n }\n const resp = await fetch(`${this.baseUrl}${path}`, {\n method: \"POST\",\n headers,\n body: JSON.stringify(json),\n });\n return this.handle(resp);\n }\n\n async get(path: string): Promise<ApiResponse> {\n const resp = await fetch(`${this.baseUrl}${path}`, {\n method: \"GET\",\n headers: this.headers,\n });\n return this.handle(resp);\n }\n\n async putFile(url: string, data: Uint8Array): Promise<void> {\n const resp = await fetch(url, {\n method: \"PUT\",\n body: data,\n });\n if (!resp.ok) {\n throw new Error(`Upload failed: ${resp.status} ${resp.statusText}`);\n }\n }\n\n async download(url: string): Promise<Uint8Array> {\n const resp = await fetch(url, { redirect: \"follow\" });\n if (!resp.ok) {\n throw new Error(`Download failed: ${resp.status} ${resp.statusText}`);\n }\n return new Uint8Array(await resp.arrayBuffer());\n }\n\n private async handle(resp: Response): Promise<ApiResponse> {\n if (!resp.ok) {\n const text = await resp.text().catch(() => \"\");\n throw new Error(\n `HTTP ${resp.status}: ${resp.statusText}${text ? ` — ${text}` : \"\"}`,\n );\n }\n const body = (await resp.json()) as ApiResponse;\n if (body.code !== 0) {\n raiseForCode(body.code, body.msg ?? \"unknown error\", body.trace_id ?? \"\");\n }\n return body;\n }\n}\n","import { raiseForCode } from \"./errors.js\";\nimport { DEFAULT_FLASH_BASE_URL } from \"./constants.js\";\n\ninterface FlashApiResponse {\n code: number;\n msg?: string;\n trace_id?: string;\n data: Record<string, unknown>;\n}\n\nexport class FlashApiClient {\n private readonly baseUrl: string;\n private readonly headers: Record<string, string>;\n private source: string;\n\n constructor(baseUrl: string = DEFAULT_FLASH_BASE_URL, source = \"\") {\n this.baseUrl = baseUrl;\n this.headers = { \"Content-Type\": \"application/json\" };\n this.source = source;\n }\n\n setSource(source: string): void {\n this.source = source;\n }\n\n async post(\n path: string,\n json: Record<string, unknown>,\n ): Promise<FlashApiResponse> {\n const headers: Record<string, string> = { ...this.headers };\n if (this.source) {\n headers[\"source\"] = this.source;\n }\n const resp = await fetch(`${this.baseUrl}${path}`, {\n method: \"POST\",\n headers,\n body: JSON.stringify(json),\n });\n return this.handle(resp);\n }\n\n async get(path: string): Promise<FlashApiResponse> {\n const resp = await fetch(`${this.baseUrl}${path}`, {\n method: \"GET\",\n });\n return this.handle(resp);\n }\n\n async putFile(url: string, data: Uint8Array): Promise<void> {\n const resp = await fetch(url, { method: \"PUT\", body: data });\n if (!resp.ok) {\n throw new Error(`Upload failed: ${resp.status} ${resp.statusText}`);\n }\n }\n\n async downloadText(url: string): Promise<string> {\n const resp = await fetch(url, { redirect: \"follow\" });\n if (!resp.ok) {\n throw new Error(`Download failed: ${resp.status} ${resp.statusText}`);\n }\n return resp.text();\n }\n\n private async handle(resp: Response): Promise<FlashApiResponse> {\n if (resp.status === 429) {\n raiseForCode(\n \"RATE_LIMITED\",\n \"flash API rate limit exceeded; try again later\",\n );\n }\n if (!resp.ok) {\n const text = await resp.text().catch(() => \"\");\n throw new Error(\n `HTTP ${resp.status}: ${resp.statusText}${text ? ` — ${text}` : \"\"}`,\n );\n }\n const body = (await resp.json()) as FlashApiResponse;\n if (body.code !== 0) {\n raiseForCode(body.code, body.msg ?? \"unknown error\", body.trace_id ?? \"\");\n }\n return body;\n }\n}\n","import { writeFile, mkdir } from \"node:fs/promises\";\nimport { dirname, join } from \"node:path\";\n\nexport interface Image {\n name: string;\n data: Uint8Array;\n path: string;\n}\n\nexport interface Progress {\n extractedPages: number;\n totalPages: number;\n startTime: string;\n}\n\nexport function progressPercent(p: Progress): number {\n if (p.totalPages === 0) return 0;\n return (p.extractedPages / p.totalPages) * 100;\n}\n\nexport function progressToString(p: Progress): string {\n return `${p.extractedPages}/${p.totalPages} (${progressPercent(p).toFixed(0)}%)`;\n}\n\nexport interface ExtractResult {\n taskId: string;\n state: string;\n filename: string | null;\n errCode: string;\n error: string | null;\n zipUrl: string | null;\n\n progress: Progress | null;\n\n markdown: string | null;\n contentList: Record<string, unknown>[] | null;\n images: Image[];\n\n docx: Uint8Array | null;\n html: string | null;\n latex: string | null;\n\n /** @internal */\n _zipBytes: Uint8Array | null;\n}\n\nexport function createEmptyResult(\n taskId: string,\n state: string,\n): ExtractResult {\n return {\n taskId,\n state,\n filename: null,\n errCode: \"\",\n error: null,\n zipUrl: null,\n progress: null,\n markdown: null,\n contentList: null,\n images: [],\n docx: null,\n html: null,\n latex: null,\n _zipBytes: null,\n };\n}\n\nasync function ensureDir(filePath: string): Promise<void> {\n await mkdir(dirname(filePath), { recursive: true });\n}\n\nexport async function saveMarkdown(\n result: ExtractResult,\n path: string,\n withImages = true,\n): Promise<void> {\n if (result.markdown == null) {\n throw new Error(\"No markdown content available (state != done)\");\n }\n await ensureDir(path);\n await writeFile(path, result.markdown, \"utf-8\");\n if (withImages && result.images.length > 0) {\n const imgDir = join(dirname(path), \"images\");\n await mkdir(imgDir, { recursive: true });\n for (const img of result.images) {\n await writeFile(join(imgDir, img.name), img.data);\n }\n }\n}\n\nexport async function saveDocx(\n result: ExtractResult,\n path: string,\n): Promise<void> {\n if (result.docx == null) {\n throw new Error(\n \"No docx content available\",\n );\n }\n await ensureDir(path);\n await writeFile(path, result.docx);\n}\n\nexport async function saveHtml(\n result: ExtractResult,\n path: string,\n): Promise<void> {\n if (result.html == null) {\n throw new Error(\n \"No html content available\",\n );\n }\n await ensureDir(path);\n await writeFile(path, result.html, \"utf-8\");\n}\n\nexport async function saveLatex(\n result: ExtractResult,\n path: string,\n): Promise<void> {\n if (result.latex == null) {\n throw new Error(\n \"No latex content available\",\n );\n }\n await ensureDir(path);\n await writeFile(path, result.latex, \"utf-8\");\n}\n\nexport async function saveAll(\n result: ExtractResult,\n dir: string,\n): Promise<void> {\n if (result._zipBytes == null) {\n throw new Error(\"No zip data available (state != done)\");\n }\n const { unzipSync } = await import(\"fflate\");\n const entries = unzipSync(new Uint8Array(result._zipBytes));\n await mkdir(dir, { recursive: true });\n for (const [relativePath, content] of Object.entries(entries)) {\n if (relativePath.endsWith(\"/\")) continue;\n const fullPath = join(dir, relativePath);\n await ensureDir(fullPath);\n await writeFile(fullPath, content);\n }\n}\n","import { unzipSync } from \"fflate\";\nimport type { ExtractResult, Image } from \"./models.js\";\nimport { createEmptyResult } from \"./models.js\";\n\nconst IMAGE_EXTENSIONS = new Set([\n \".png\", \".jpg\", \".jpeg\", \".gif\", \".bmp\", \".svg\", \".webp\",\n]);\n\nfunction extname(filename: string): string {\n const dot = filename.lastIndexOf(\".\");\n return dot === -1 ? \"\" : filename.slice(dot).toLowerCase();\n}\n\nfunction basename(filepath: string): string {\n const parts = filepath.replace(/\\\\/g, \"/\").split(\"/\");\n return parts[parts.length - 1] ?? \"\";\n}\n\nexport function parseZip(\n zipBytes: Uint8Array,\n taskId: string,\n filename: string | null = null,\n): ExtractResult {\n const result = createEmptyResult(taskId, \"done\");\n result.filename = filename;\n result._zipBytes = zipBytes;\n\n const entries = unzipSync(zipBytes);\n const images: Image[] = [];\n let contentList: Record<string, unknown>[] | null = null;\n\n for (const [relPath, data] of Object.entries(entries)) {\n if (relPath.endsWith(\"/\")) continue;\n\n const name = basename(relPath);\n const ext = extname(name);\n const text = () => new TextDecoder().decode(data);\n\n if (ext === \".md\") {\n result.markdown = text();\n } else if (\n name.endsWith(\"_content_list.json\") ||\n name === \"content_list.json\"\n ) {\n contentList = JSON.parse(text()) as Record<string, unknown>[];\n } else if (ext === \".json\" && contentList == null) {\n try {\n const parsed: unknown = JSON.parse(text());\n if (Array.isArray(parsed)) {\n contentList = parsed as Record<string, unknown>[];\n }\n } catch {\n // not a valid JSON array — skip\n }\n } else if (IMAGE_EXTENSIONS.has(ext)) {\n images.push({ name, data: new Uint8Array(data), path: relPath });\n } else if (ext === \".docx\") {\n result.docx = new Uint8Array(data);\n } else if (ext === \".html\" || ext === \".htm\") {\n result.html = text();\n } else if (ext === \".tex\") {\n result.latex = text();\n }\n }\n\n result.contentList = contentList;\n result.images = images;\n return result;\n}\n"],"mappings":"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","names":["import_promises","import_node_path","unzipSync"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/constants.ts","../src/client.ts","../src/errors.ts","../src/api.ts","../src/flash-api.ts","../src/models.ts","../src/zip.ts"],"sourcesContent":["export { DEFAULT_BASE_URL, DEFAULT_FLASH_BASE_URL } from \"./constants.js\";\n\nexport { MinerU } from \"./client.js\";\nexport type { ExtractOptions, BatchOptions, FlashExtractOptions, FileParam } from \"./client.js\";\n\nexport type { ExtractResult, Image, Progress } from \"./models.js\";\nexport {\n saveMarkdown,\n saveDocx,\n saveHtml,\n saveLatex,\n saveAll,\n progressPercent,\n progressToString,\n} from \"./models.js\";\n\nexport {\n MinerUError,\n AuthError,\n ParamError,\n FileTooLargeError,\n PageLimitError,\n TaskNotFoundError,\n ExtractFailedError,\n TimeoutError,\n QuotaExceededError,\n FlashFileTooLargeError,\n FlashUnsupportedTypeError,\n FlashPageLimitError,\n FlashParamError,\n NoAuthClientError,\n} from \"./errors.js\";\n","export const DEFAULT_BASE_URL = \"https://mineru.net/api/v4\";\n\nexport const DEFAULT_FLASH_BASE_URL = \"https://mineru.net/api/v1/agent\";\n\n/** Timeout for file uploads in milliseconds (PUT to pre-signed URL). */\nexport const UPLOAD_TIMEOUT_MS = 300_000;\n","import { readFile } from \"node:fs/promises\";\nimport { basename, extname } from \"node:path\";\n\nimport { ApiClient } from \"./api.js\";\nimport { DEFAULT_BASE_URL } from \"./constants.js\";\nimport { NoAuthClientError, TimeoutError } from \"./errors.js\";\nimport { FlashApiClient } from \"./flash-api.js\";\nimport type { ExtractResult, Progress } from \"./models.js\";\nimport { createEmptyResult } from \"./models.js\";\nimport { parseZip } from \"./zip.js\";\n\nconst MODEL_MAP: Record<string, string> = {\n pipeline: \"pipeline\",\n vlm: \"vlm\",\n html: \"MinerU-HTML\",\n};\n\nconst HTML_EXTENSIONS = new Set([\".html\", \".htm\"]);\n\nconst DEFAULT_SOURCE = \"open-api-sdk-js\";\n\n/** Default total business timeouts for extraction tasks (in seconds). */\nconst DEFAULT_TIMEOUT_POLL_SINGLE = 300;\nconst DEFAULT_TIMEOUT_POLL_BATCH = 1800;\n\nfunction isUrl(source: string): boolean {\n return source.startsWith(\"http://\") || source.startsWith(\"https://\");\n}\n\nfunction getExtension(source: string): string {\n if (isUrl(source)) {\n const path = source.split(\"?\")[0]!.split(\"#\")[0]!;\n const dot = path.lastIndexOf(\".\");\n return dot === -1 ? \"\" : path.slice(dot).toLowerCase();\n }\n return extname(source).toLowerCase();\n}\n\nfunction inferModel(source: string): string {\n return HTML_EXTENSIONS.has(getExtension(source)) ? \"MinerU-HTML\" : \"vlm\";\n}\n\nfunction resolveModel(model: string | undefined, source: string): string {\n if (model != null) {\n return MODEL_MAP[model] ?? model;\n }\n return inferModel(source);\n}\n\nexport interface ExtractOptions {\n model?: string;\n ocr?: boolean;\n formula?: boolean;\n table?: boolean;\n language?: string;\n pages?: string;\n extraFormats?: string[];\n /** Per-file overrides keyed by path or URL. */\n fileParams?: Record<string, FileParam>;\n /** Max total seconds to wait for task completion (polling). */\n timeout?: number;\n}\n\nexport interface BatchOptions {\n model?: string;\n ocr?: boolean;\n formula?: boolean;\n table?: boolean;\n language?: string;\n extraFormats?: string[];\n /** Per-file overrides keyed by path or URL. */\n fileParams?: Record<string, FileParam>;\n /** Max total seconds to wait for all tasks (polling). */\n timeout?: number;\n}\n\nexport interface FlashExtractOptions {\n language?: string;\n pageRange?: string;\n ocr?: boolean;\n formula?: boolean;\n table?: boolean;\n /** Max total seconds to wait for task completion (polling). */\n timeout?: number;\n}\n\n/** Per-file parameter overrides for batch methods. */\nexport interface FileParam {\n /** Override page_ranges for this file (e.g. \"1-10,15\"). */\n pages?: string;\n /** Override is_ocr for this file. */\n ocr?: boolean;\n /** Set data_id for this file. */\n dataId?: string;\n}\n\n/** Only includes fields the user explicitly set. Never assumes API defaults. */\nfunction buildApiOptions(\n modelVersion: string,\n opts: ExtractOptions | BatchOptions,\n): Record<string, unknown> {\n const o: Record<string, unknown> = { model_version: modelVersion };\n if (opts.formula !== undefined) o[\"enable_formula\"] = opts.formula;\n if (opts.table !== undefined) o[\"enable_table\"] = opts.table;\n if (opts.language !== undefined) o[\"language\"] = opts.language;\n if (opts.extraFormats?.length) {\n o[\"extra_formats\"] = opts.extraFormats;\n }\n return o;\n}\n\n/** Adds per-file fields (is_ocr, page_ranges, data_id) to a file entry. */\nfunction applyFileFields(\n entry: Record<string, unknown>,\n key: string,\n ocr: boolean | undefined,\n pages: string | undefined,\n fileParams: Record<string, FileParam> | undefined,\n): void {\n const fp = fileParams?.[key];\n\n // OCR: per-file overrides global\n const effectiveOcr = fp?.ocr !== undefined ? fp.ocr : ocr;\n if (effectiveOcr !== undefined) entry[\"is_ocr\"] = effectiveOcr;\n\n // Pages: per-file overrides global\n const effectivePages = fp?.pages || pages;\n if (effectivePages) entry[\"page_ranges\"] = effectivePages;\n\n // DataID: per-file only\n if (fp?.dataId) entry[\"data_id\"] = fp.dataId;\n}\n\nfunction parseTaskResult(data: Record<string, unknown>): ExtractResult {\n const result = createEmptyResult(\n (data[\"task_id\"] as string) ?? \"\",\n (data[\"state\"] as string) ?? \"unknown\",\n );\n result.filename = (data[\"file_name\"] as string) ?? null;\n const errCodeRaw = data[\"err_code\"];\n result.errCode = errCodeRaw == null ? \"\" : String(errCodeRaw);\n result.error = (data[\"err_msg\"] as string) || null;\n result.zipUrl = (data[\"full_zip_url\"] as string) ?? null;\n\n const ep = data[\"extract_progress\"] as Record<string, unknown> | undefined;\n if (ep) {\n result.progress = {\n extractedPages: (ep[\"extracted_pages\"] as number) ?? 0,\n totalPages: (ep[\"total_pages\"] as number) ?? 0,\n startTime: (ep[\"start_time\"] as string) ?? \"\",\n } satisfies Progress;\n }\n return result;\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\n/**\n * MinerU API client. Turn documents into Markdown with one method call.\n */\nexport class MinerU {\n private readonly api: ApiClient | null;\n private readonly flashApi: FlashApiClient;\n\n /**\n * @param token - API token.\n * @param baseUrl - API base URL.\n * @param flashBaseUrl - Flash API base URL.\n */\n constructor(\n token?: string,\n baseUrl = DEFAULT_BASE_URL,\n flashBaseUrl?: string,\n ) {\n const resolved = token ?? process.env[\"MINERU_TOKEN\"];\n if (resolved) {\n // ApiClient should ideally use DEFAULT_TIMEOUT_REQUEST internally\n this.api = new ApiClient(resolved, baseUrl, DEFAULT_SOURCE);\n } else {\n this.api = null; // flash-only mode\n }\n this.flashApi = new FlashApiClient(flashBaseUrl, DEFAULT_SOURCE);\n }\n\n setSource(source: string): void {\n if (this.api !== null) {\n this.api.setSource(source);\n }\n this.flashApi.setSource(source);\n }\n\n private requireAuth(): ApiClient {\n if (this.api === null) {\n throw new NoAuthClientError();\n }\n return this.api;\n }\n\n // ══════════════════════════════════════════════════════════════════\n // Synchronous (blocking) methods\n // ══════════════════════════════════════════════════════════════════\n\n async extract(\n source: string,\n options: ExtractOptions = {},\n ): Promise<ExtractResult> {\n this.requireAuth();\n const { timeout = DEFAULT_TIMEOUT_POLL_SINGLE, ...opts } = options;\n const modelVersion = resolveModel(opts.model, source);\n const apiOpts = buildApiOptions(modelVersion, opts);\n\n let batchId: string;\n if (isUrl(source)) {\n batchId = await this.submitUrlsBatch([source], apiOpts, opts.ocr, opts.pages, opts.fileParams);\n } else {\n batchId = await this.uploadAndSubmit([source], apiOpts, opts.ocr, opts.pages, opts.fileParams);\n }\n const results = await this.waitBatch(batchId, timeout);\n return results[0]!;\n }\n\n async *extractBatch(\n sources: string[],\n options: BatchOptions = {},\n ): AsyncGenerator<ExtractResult> {\n this.requireAuth();\n const { timeout = DEFAULT_TIMEOUT_POLL_BATCH, ...opts } = options;\n const firstSource = sources[0] ?? \"\";\n const modelVersion = resolveModel(opts.model, firstSource);\n const apiOpts = buildApiOptions(modelVersion, opts);\n\n const urls = sources.filter(isUrl);\n const files = sources.filter((s) => !isUrl(s));\n\n const batchIds: string[] = [];\n if (urls.length > 0) {\n batchIds.push(await this.submitUrlsBatch(urls, apiOpts, opts.ocr, undefined, opts.fileParams));\n }\n if (files.length > 0) {\n batchIds.push(await this.uploadAndSubmit(files, apiOpts, opts.ocr, undefined, opts.fileParams));\n }\n\n yield* this.yieldBatch(batchIds, sources.length, timeout);\n }\n\n async crawl(\n url: string,\n options: { extraFormats?: string[]; timeout?: number } = {},\n ): Promise<ExtractResult> {\n return this.extract(url, { model: \"html\", timeout: DEFAULT_TIMEOUT_POLL_SINGLE, ...options });\n }\n\n async *crawlBatch(\n urls: string[],\n options: { extraFormats?: string[]; timeout?: number } = {},\n ): AsyncGenerator<ExtractResult> {\n yield* this.extractBatch(urls, { model: \"html\", timeout: DEFAULT_TIMEOUT_POLL_BATCH, ...options });\n }\n\n // ══════════════════════════════════════════════════════════════════\n // Async primitives (no polling, no waiting)\n // ══════════════════════════════════════════════════════════════════\n\n async submit(\n source: string,\n options: Omit<ExtractOptions, \"timeout\"> = {},\n ): Promise<string> {\n this.requireAuth();\n const modelVersion = resolveModel(options.model, source);\n const apiOpts = buildApiOptions(modelVersion, options);\n\n if (isUrl(source)) {\n return this.submitUrlsBatch([source], apiOpts, options.ocr, options.pages, options.fileParams);\n }\n return this.uploadAndSubmit([source], apiOpts, options.ocr, options.pages, options.fileParams);\n }\n\n async submitBatch(\n sources: string[],\n options: Omit<BatchOptions, \"timeout\"> = {},\n ): Promise<string> {\n this.requireAuth();\n const firstSource = sources[0] ?? \"\";\n const modelVersion = resolveModel(options.model, firstSource);\n const apiOpts = buildApiOptions(modelVersion, options);\n\n const urls = sources.filter(isUrl);\n const files = sources.filter((s) => !isUrl(s));\n\n if (urls.length === 0 && files.length === 0) {\n throw new Error(\"No sources provided.\");\n }\n if (urls.length > 0 && files.length > 0) {\n throw new Error(\n \"submitBatch() does not support mixing URLs and local files in one call. \" +\n \"Please submit them separately or use extractBatch() instead.\",\n );\n }\n\n if (urls.length > 0) {\n return this.submitUrlsBatch(urls, apiOpts, options.ocr, undefined, options.fileParams);\n }\n return this.uploadAndSubmit(files, apiOpts, options.ocr, undefined, options.fileParams);\n }\n\n async getTask(taskId: string): Promise<ExtractResult> {\n const api = this.requireAuth();\n const body = await api.get(`/extract/task/${taskId}`);\n const result = parseTaskResult(body.data);\n if (result.state === \"done\" && result.zipUrl) {\n return this.downloadAndParse(result);\n }\n return result;\n }\n\n async getBatch(batchId: string): Promise<ExtractResult[]> {\n const api = this.requireAuth();\n const body = await api.get(`/extract-results/batch/${batchId}`);\n const items = (body.data[\"extract_result\"] as Record<string, unknown>[]) ?? [];\n const results: ExtractResult[] = [];\n for (const item of items) {\n let r = parseTaskResult(item);\n if (r.state === \"done\" && r.zipUrl) {\n r = await this.downloadAndParse(r);\n }\n results.push(r);\n }\n return results;\n }\n\n // ══════════════════════════════════════════════════════════════════\n // Internal helpers\n // ══════════════════════════════════════════════════════════════════\n\n private async submitUrlsBatch(\n urls: string[],\n opts: Record<string, unknown>,\n ocr: boolean | undefined,\n pages: string | undefined,\n fileParams: Record<string, FileParam> | undefined,\n ): Promise<string> {\n const files = urls.map((u) => {\n const entry: Record<string, unknown> = { url: u };\n applyFileFields(entry, u, ocr, pages, fileParams);\n return entry;\n });\n const body = await this.requireAuth().post(\"/extract/task/batch\", {\n files,\n ...opts,\n });\n return body.data[\"batch_id\"] as string;\n }\n\n private async uploadAndSubmit(\n filePaths: string[],\n opts: Record<string, unknown>,\n ocr: boolean | undefined,\n pages: string | undefined,\n fileParams: Record<string, FileParam> | undefined,\n ): Promise<string> {\n const api = this.requireAuth();\n const filesMeta = filePaths.map((p) => {\n const entry: Record<string, unknown> = { name: basename(p) };\n applyFileFields(entry, p, ocr, pages, fileParams);\n return entry;\n });\n const body = await api.post(\"/file-urls/batch\", {\n files: filesMeta,\n ...opts,\n });\n const batchId = body.data[\"batch_id\"] as string;\n const uploadUrls = body.data[\"file_urls\"] as string[];\n\n for (let i = 0; i < filePaths.length; i++) {\n const data = await readFile(filePaths[i]!);\n await api.putFile(uploadUrls[i]!, new Uint8Array(data));\n }\n\n return batchId;\n }\n\n private async downloadAndParse(\n result: ExtractResult,\n ): Promise<ExtractResult> {\n const zipBytes = await this.requireAuth().download(result.zipUrl!);\n const parsed = parseZip(zipBytes, result.taskId, result.filename);\n parsed.zipUrl = result.zipUrl;\n return parsed;\n }\n\n private async waitBatch(\n batchId: string,\n timeout: number,\n ): Promise<ExtractResult[]> {\n const deadline = Date.now() + timeout * 1000;\n let interval = 2000;\n for (;;) {\n const results = await this.getBatch(batchId);\n if (results.every((r) => r.state === \"done\" || r.state === \"failed\")) {\n return results;\n }\n if (Date.now() > deadline) {\n throw new TimeoutError(timeout, batchId);\n }\n await sleep(Math.min(interval, Math.max(0, deadline - Date.now())));\n interval = Math.min(interval * 2, 30_000);\n }\n }\n\n private async *yieldBatch(\n batchIds: string[],\n total: number,\n timeout: number,\n ): AsyncGenerator<ExtractResult> {\n const deadline = Date.now() + timeout * 1000;\n const yielded = new Set<string>();\n let interval = 2000;\n\n while (yielded.size < total) {\n for (const bid of batchIds) {\n const results = await this.getBatch(bid);\n for (let idx = 0; idx < results.length; idx++) {\n const key = `${bid}:${idx}`;\n const r = results[idx]!;\n if (!yielded.has(key) && (r.state === \"done\" || r.state === \"failed\")) {\n yielded.add(key);\n yield r;\n }\n }\n }\n\n if (yielded.size >= total) break;\n if (Date.now() > deadline) {\n throw new TimeoutError(timeout, batchIds.join(\",\"));\n }\n await sleep(Math.min(interval, Math.max(0, deadline - Date.now())));\n interval = Math.min(interval * 2, 30_000);\n }\n }\n\n // ══════════════════════════════════════════════════════════════════\n // Flash (agent) mode\n // ══════════════════════════════════════════════════════════════════\n\n async flashExtract(\n source: string,\n options: FlashExtractOptions = {},\n ): Promise<ExtractResult> {\n const { language = \"ch\", pageRange, ocr, formula, table, timeout = DEFAULT_TIMEOUT_POLL_SINGLE } = options;\n\n let taskId: string;\n if (isUrl(source)) {\n taskId = await this.flashSubmitUrl(source, language, pageRange, ocr, formula, table);\n } else {\n taskId = await this.flashSubmitFile(source, language, pageRange, ocr, formula, table);\n }\n\n return this.flashWait(taskId, timeout);\n }\n\n // ── Flash internal helpers ──\n\n private async flashSubmitUrl(\n url: string,\n language: string,\n pageRange?: string,\n ocr?: boolean,\n formula?: boolean,\n table?: boolean,\n ): Promise<string> {\n const payload: Record<string, unknown> = { url, language };\n if (pageRange != null) payload[\"page_range\"] = pageRange;\n if (ocr != null) payload[\"is_ocr\"] = ocr;\n if (formula != null) payload[\"enable_formula\"] = formula;\n if (table != null) payload[\"enable_table\"] = table;\n const body = await this.flashApi.post(\"/parse/url\", payload);\n return body.data[\"task_id\"] as string;\n }\n\n private async flashSubmitFile(\n filePath: string,\n language: string,\n pageRange?: string,\n ocr?: boolean,\n formula?: boolean,\n table?: boolean,\n ): Promise<string> {\n const fileName = basename(filePath);\n const payload: Record<string, unknown> = { file_name: fileName, language };\n if (pageRange != null) payload[\"page_range\"] = pageRange;\n if (ocr != null) payload[\"is_ocr\"] = ocr;\n if (formula != null) payload[\"enable_formula\"] = formula;\n if (table != null) payload[\"enable_table\"] = table;\n const body = await this.flashApi.post(\"/parse/file\", payload);\n const taskId = body.data[\"task_id\"] as string;\n const fileUrl = body.data[\"file_url\"] as string;\n\n const data = await readFile(filePath);\n await this.flashApi.putFile(fileUrl, new Uint8Array(data));\n return taskId;\n }\n\n private async flashWait(\n taskId: string,\n timeout: number,\n ): Promise<ExtractResult> {\n const deadline = Date.now() + timeout * 1000;\n let interval = 2000;\n for (;;) {\n const result = await this.flashGetTask(taskId);\n if (result.state === \"done\" || result.state === \"failed\") return result;\n if (Date.now() > deadline) throw new TimeoutError(timeout, taskId);\n await sleep(Math.min(interval, Math.max(0, deadline - Date.now())));\n interval = Math.min(interval * 2, 30_000);\n }\n }\n\n private async flashGetTask(taskId: string): Promise<ExtractResult> {\n const body = await this.flashApi.get(`/parse/${taskId}`);\n return this.parseFlashTask(body.data);\n }\n\n private async parseFlashTask(\n data: Record<string, unknown>,\n ): Promise<ExtractResult> {\n const result = createEmptyResult(\n (data[\"task_id\"] as string) ?? \"\",\n (data[\"state\"] as string) ?? \"unknown\",\n );\n const errCodeRaw = data[\"err_code\"];\n result.errCode = errCodeRaw == null ? \"\" : String(errCodeRaw);\n result.error = (data[\"err_msg\"] as string) || null;\n\n const ep = data[\"extract_progress\"] as\n | Record<string, unknown>\n | undefined;\n if (ep) {\n result.progress = {\n extractedPages: (ep[\"extracted_pages\"] as number) ?? 0,\n totalPages: (ep[\"total_pages\"] as number) ?? 0,\n startTime: (ep[\"start_time\"] as string) ?? \"\",\n };\n }\n\n if (result.state === \"done\" && data[\"markdown_url\"]) {\n result.markdown = await this.flashApi.downloadText(\n data[\"markdown_url\"] as string,\n );\n }\n\n return result;\n }\n}\n","export class MinerUError extends Error {\n readonly code: string;\n readonly traceId: string;\n\n constructor(code: string | number, message: string, traceId = \"\") {\n const tag = traceId ? ` (trace: ${traceId})` : \"\";\n super(`[${code}] ${message}${tag}`);\n this.name = \"MinerUError\";\n this.code = String(code);\n this.traceId = traceId;\n }\n}\n\nexport class AuthError extends MinerUError {\n constructor(code: string | number, message: string, traceId = \"\") {\n super(code, message, traceId);\n this.name = \"AuthError\";\n }\n}\n\nexport class ParamError extends MinerUError {\n constructor(code: string | number, message: string, traceId = \"\") {\n super(code, message, traceId);\n this.name = \"ParamError\";\n }\n}\n\nexport class FileTooLargeError extends MinerUError {\n constructor(code: string | number, message: string, traceId = \"\") {\n super(code, message, traceId);\n this.name = \"FileTooLargeError\";\n }\n}\n\nexport class PageLimitError extends MinerUError {\n constructor(code: string | number, message: string, traceId = \"\") {\n super(code, message, traceId);\n this.name = \"PageLimitError\";\n }\n}\n\nexport class TaskNotFoundError extends MinerUError {\n constructor(code: string | number, message: string, traceId = \"\") {\n super(code, message, traceId);\n this.name = \"TaskNotFoundError\";\n }\n}\n\nexport class ExtractFailedError extends MinerUError {\n constructor(code: string | number, message: string, traceId = \"\") {\n super(code, message, traceId);\n this.name = \"ExtractFailedError\";\n }\n}\n\nexport class TimeoutError extends MinerUError {\n readonly timeout: number;\n readonly taskId: string;\n\n constructor(timeout: number, taskId: string) {\n super(\"TIMEOUT\", `Task ${taskId} did not complete within ${timeout}s`);\n this.name = \"TimeoutError\";\n this.timeout = timeout;\n this.taskId = taskId;\n }\n}\n\nexport class QuotaExceededError extends MinerUError {\n constructor(code: string | number, message: string, traceId = \"\") {\n super(code, message, traceId);\n this.name = \"QuotaExceededError\";\n }\n}\n\n// Flash API specific errors\n\nexport class FlashFileTooLargeError extends MinerUError {\n constructor(code: string | number, message: string, traceId = \"\") {\n super(code, message, traceId);\n this.name = \"FlashFileTooLargeError\";\n }\n}\n\nexport class FlashUnsupportedTypeError extends MinerUError {\n constructor(code: string | number, message: string, traceId = \"\") {\n super(code, message, traceId);\n this.name = \"FlashUnsupportedTypeError\";\n }\n}\n\nexport class FlashPageLimitError extends MinerUError {\n constructor(code: string | number, message: string, traceId = \"\") {\n super(code, message, traceId);\n this.name = \"FlashPageLimitError\";\n }\n}\n\nexport class FlashParamError extends MinerUError {\n constructor(code: string | number, message: string, traceId = \"\") {\n super(code, message, traceId);\n this.name = \"FlashParamError\";\n }\n}\n\nexport class NoAuthClientError extends MinerUError {\n constructor() {\n super(\n \"-1\",\n \"This operation requires an authenticated client; pass token to MinerU() or set MINERU_TOKEN env var.\",\n );\n this.name = \"NoAuthClientError\";\n }\n}\n\nconst CODE_TO_ERROR: Record<string, typeof MinerUError> = {\n A0202: AuthError,\n A0211: AuthError,\n \"-500\": ParamError,\n \"-10002\": ParamError,\n \"-60005\": FileTooLargeError,\n \"-60006\": PageLimitError,\n \"-60010\": ExtractFailedError,\n \"-60012\": TaskNotFoundError,\n \"-60013\": MinerUError,\n \"-60018\": QuotaExceededError,\n \"-60019\": QuotaExceededError,\n \"-30001\": FlashFileTooLargeError,\n \"-30002\": FlashUnsupportedTypeError,\n \"-30003\": FlashPageLimitError,\n \"-30004\": FlashParamError,\n};\n\nexport function raiseForCode(\n code: number | string,\n msg: string,\n traceId = \"\",\n): never {\n const ErrorClass = CODE_TO_ERROR[String(code)] ?? MinerUError;\n throw new ErrorClass(code, msg, traceId);\n}\n","import { raiseForCode } from \"./errors.js\";\nimport { UPLOAD_TIMEOUT_MS } from \"./constants.js\";\n\ninterface ApiResponse {\n code: number;\n msg?: string;\n trace_id?: string;\n data: Record<string, unknown>;\n}\n\nexport class ApiClient {\n private readonly baseUrl: string;\n private readonly headers: Record<string, string>;\n private source: string;\n\n constructor(token: string, baseUrl: string, source = \"\") {\n this.baseUrl = baseUrl;\n this.headers = {\n Authorization: `Bearer ${token}`,\n \"Content-Type\": \"application/json\",\n };\n this.source = source;\n }\n\n setSource(source: string): void {\n this.source = source;\n }\n\n async post(\n path: string,\n json: Record<string, unknown>,\n ): Promise<ApiResponse> {\n const headers: Record<string, string> = { ...this.headers };\n if (this.source) {\n headers[\"source\"] = this.source;\n }\n const resp = await fetch(`${this.baseUrl}${path}`, {\n method: \"POST\",\n headers,\n body: JSON.stringify(json),\n });\n return this.handle(resp);\n }\n\n async get(path: string): Promise<ApiResponse> {\n const resp = await fetch(`${this.baseUrl}${path}`, {\n method: \"GET\",\n headers: this.headers,\n });\n return this.handle(resp);\n }\n\n async putFile(url: string, data: Uint8Array): Promise<void> {\n const resp = await fetch(url, {\n method: \"PUT\",\n body: data,\n signal: AbortSignal.timeout(UPLOAD_TIMEOUT_MS),\n });\n if (!resp.ok) {\n throw new Error(`Upload failed: ${resp.status} ${resp.statusText}`);\n }\n }\n\n async download(url: string): Promise<Uint8Array> {\n const resp = await fetch(url, { redirect: \"follow\" });\n if (!resp.ok) {\n throw new Error(`Download failed: ${resp.status} ${resp.statusText}`);\n }\n return new Uint8Array(await resp.arrayBuffer());\n }\n\n private async handle(resp: Response): Promise<ApiResponse> {\n if (!resp.ok) {\n const text = await resp.text().catch(() => \"\");\n throw new Error(\n `HTTP ${resp.status}: ${resp.statusText}${text ? ` — ${text}` : \"\"}`,\n );\n }\n const body = (await resp.json()) as ApiResponse;\n if (body.code !== 0) {\n raiseForCode(body.code, body.msg ?? \"unknown error\", body.trace_id ?? \"\");\n }\n return body;\n }\n}\n","import { raiseForCode } from \"./errors.js\";\nimport { DEFAULT_FLASH_BASE_URL, UPLOAD_TIMEOUT_MS } from \"./constants.js\";\n\ninterface FlashApiResponse {\n code: number;\n msg?: string;\n trace_id?: string;\n data: Record<string, unknown>;\n}\n\nexport class FlashApiClient {\n private readonly baseUrl: string;\n private readonly headers: Record<string, string>;\n private source: string;\n\n constructor(baseUrl: string = DEFAULT_FLASH_BASE_URL, source = \"\") {\n this.baseUrl = baseUrl;\n this.headers = { \"Content-Type\": \"application/json\" };\n this.source = source;\n }\n\n setSource(source: string): void {\n this.source = source;\n }\n\n async post(\n path: string,\n json: Record<string, unknown>,\n ): Promise<FlashApiResponse> {\n const headers: Record<string, string> = { ...this.headers };\n if (this.source) {\n headers[\"source\"] = this.source;\n }\n const resp = await fetch(`${this.baseUrl}${path}`, {\n method: \"POST\",\n headers,\n body: JSON.stringify(json),\n });\n return this.handle(resp);\n }\n\n async get(path: string): Promise<FlashApiResponse> {\n const resp = await fetch(`${this.baseUrl}${path}`, {\n method: \"GET\",\n });\n return this.handle(resp);\n }\n\n async putFile(url: string, data: Uint8Array): Promise<void> {\n const resp = await fetch(url, { method: \"PUT\", body: data, signal: AbortSignal.timeout(UPLOAD_TIMEOUT_MS) });\n if (!resp.ok) {\n throw new Error(`Upload failed: ${resp.status} ${resp.statusText}`);\n }\n }\n\n async downloadText(url: string): Promise<string> {\n const resp = await fetch(url, { redirect: \"follow\" });\n if (!resp.ok) {\n throw new Error(`Download failed: ${resp.status} ${resp.statusText}`);\n }\n return resp.text();\n }\n\n private async handle(resp: Response): Promise<FlashApiResponse> {\n if (resp.status === 429) {\n raiseForCode(\n \"RATE_LIMITED\",\n \"flash API rate limit exceeded; try again later\",\n );\n }\n if (!resp.ok) {\n const text = await resp.text().catch(() => \"\");\n throw new Error(\n `HTTP ${resp.status}: ${resp.statusText}${text ? ` — ${text}` : \"\"}`,\n );\n }\n const body = (await resp.json()) as FlashApiResponse;\n if (body.code !== 0) {\n raiseForCode(body.code, body.msg ?? \"unknown error\", body.trace_id ?? \"\");\n }\n return body;\n }\n}\n","import { writeFile, mkdir } from \"node:fs/promises\";\nimport { dirname, join } from \"node:path\";\n\nexport interface Image {\n name: string;\n data: Uint8Array;\n path: string;\n}\n\nexport interface Progress {\n extractedPages: number;\n totalPages: number;\n startTime: string;\n}\n\nexport function progressPercent(p: Progress): number {\n if (p.totalPages === 0) return 0;\n return (p.extractedPages / p.totalPages) * 100;\n}\n\nexport function progressToString(p: Progress): string {\n return `${p.extractedPages}/${p.totalPages} (${progressPercent(p).toFixed(0)}%)`;\n}\n\nexport interface ExtractResult {\n taskId: string;\n state: string;\n filename: string | null;\n errCode: string;\n error: string | null;\n zipUrl: string | null;\n\n progress: Progress | null;\n\n markdown: string | null;\n contentList: Record<string, unknown>[] | null;\n images: Image[];\n\n docx: Uint8Array | null;\n html: string | null;\n latex: string | null;\n\n /** @internal */\n _zipBytes: Uint8Array | null;\n}\n\nexport function createEmptyResult(\n taskId: string,\n state: string,\n): ExtractResult {\n return {\n taskId,\n state,\n filename: null,\n errCode: \"\",\n error: null,\n zipUrl: null,\n progress: null,\n markdown: null,\n contentList: null,\n images: [],\n docx: null,\n html: null,\n latex: null,\n _zipBytes: null,\n };\n}\n\nasync function ensureDir(filePath: string): Promise<void> {\n await mkdir(dirname(filePath), { recursive: true });\n}\n\nexport async function saveMarkdown(\n result: ExtractResult,\n path: string,\n withImages = true,\n): Promise<void> {\n if (result.markdown == null) {\n throw new Error(\"No markdown content available (state != done)\");\n }\n await ensureDir(path);\n await writeFile(path, result.markdown, \"utf-8\");\n if (withImages && result.images.length > 0) {\n const imgDir = join(dirname(path), \"images\");\n await mkdir(imgDir, { recursive: true });\n for (const img of result.images) {\n await writeFile(join(imgDir, img.name), img.data);\n }\n }\n}\n\nexport async function saveDocx(\n result: ExtractResult,\n path: string,\n): Promise<void> {\n if (result.docx == null) {\n throw new Error(\n \"No docx content available\",\n );\n }\n await ensureDir(path);\n await writeFile(path, result.docx);\n}\n\nexport async function saveHtml(\n result: ExtractResult,\n path: string,\n): Promise<void> {\n if (result.html == null) {\n throw new Error(\n \"No html content available\",\n );\n }\n await ensureDir(path);\n await writeFile(path, result.html, \"utf-8\");\n}\n\nexport async function saveLatex(\n result: ExtractResult,\n path: string,\n): Promise<void> {\n if (result.latex == null) {\n throw new Error(\n \"No latex content available\",\n );\n }\n await ensureDir(path);\n await writeFile(path, result.latex, \"utf-8\");\n}\n\nexport async function saveAll(\n result: ExtractResult,\n dir: string,\n): Promise<void> {\n if (result._zipBytes == null) {\n throw new Error(\"No zip data available (state != done)\");\n }\n const { unzipSync } = await import(\"fflate\");\n const entries = unzipSync(new Uint8Array(result._zipBytes));\n await mkdir(dir, { recursive: true });\n for (const [relativePath, content] of Object.entries(entries)) {\n if (relativePath.endsWith(\"/\")) continue;\n const fullPath = join(dir, relativePath);\n await ensureDir(fullPath);\n await writeFile(fullPath, content);\n }\n}\n","import { unzipSync } from \"fflate\";\nimport type { ExtractResult, Image } from \"./models.js\";\nimport { createEmptyResult } from \"./models.js\";\n\nconst IMAGE_EXTENSIONS = new Set([\n \".png\", \".jpg\", \".jpeg\", \".gif\", \".bmp\", \".svg\", \".webp\",\n]);\n\nfunction extname(filename: string): string {\n const dot = filename.lastIndexOf(\".\");\n return dot === -1 ? \"\" : filename.slice(dot).toLowerCase();\n}\n\nfunction basename(filepath: string): string {\n const parts = filepath.replace(/\\\\/g, \"/\").split(\"/\");\n return parts[parts.length - 1] ?? \"\";\n}\n\nexport function parseZip(\n zipBytes: Uint8Array,\n taskId: string,\n filename: string | null = null,\n): ExtractResult {\n const result = createEmptyResult(taskId, \"done\");\n result.filename = filename;\n result._zipBytes = zipBytes;\n\n const entries = unzipSync(zipBytes);\n const images: Image[] = [];\n let contentList: Record<string, unknown>[] | null = null;\n\n for (const [relPath, data] of Object.entries(entries)) {\n if (relPath.endsWith(\"/\")) continue;\n\n const name = basename(relPath);\n const ext = extname(name);\n const text = () => new TextDecoder().decode(data);\n\n if (ext === \".md\") {\n result.markdown = text();\n } else if (\n name.endsWith(\"_content_list.json\") ||\n name === \"content_list.json\"\n ) {\n contentList = JSON.parse(text()) as Record<string, unknown>[];\n } else if (ext === \".json\" && contentList == null) {\n try {\n const parsed: unknown = JSON.parse(text());\n if (Array.isArray(parsed)) {\n contentList = parsed as Record<string, unknown>[];\n }\n } catch {\n // not a valid JSON array — skip\n }\n } else if (IMAGE_EXTENSIONS.has(ext)) {\n images.push({ name, data: new Uint8Array(data), path: relPath });\n } else if (ext === \".docx\") {\n result.docx = new Uint8Array(data);\n } else if (ext === \".html\" || ext === \".htm\") {\n result.html = text();\n } else if (ext === \".tex\") {\n result.latex = text();\n }\n }\n\n result.contentList = contentList;\n result.images = images;\n return result;\n}\n"],"mappings":"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","names":["import_promises","import_node_path","unzipSync"]}
|
package/dist/index.d.cts
CHANGED
package/dist/index.d.ts
CHANGED
package/dist/index.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
// src/constants.ts
|
|
2
2
|
var DEFAULT_BASE_URL = "https://mineru.net/api/v4";
|
|
3
3
|
var DEFAULT_FLASH_BASE_URL = "https://mineru.net/api/v1/agent";
|
|
4
|
+
var UPLOAD_TIMEOUT_MS = 3e5;
|
|
4
5
|
|
|
5
6
|
// src/client.ts
|
|
6
7
|
import { readFile } from "fs/promises";
|
|
@@ -163,7 +164,8 @@ var ApiClient = class {
|
|
|
163
164
|
async putFile(url, data) {
|
|
164
165
|
const resp = await fetch(url, {
|
|
165
166
|
method: "PUT",
|
|
166
|
-
body: data
|
|
167
|
+
body: data,
|
|
168
|
+
signal: AbortSignal.timeout(UPLOAD_TIMEOUT_MS)
|
|
167
169
|
});
|
|
168
170
|
if (!resp.ok) {
|
|
169
171
|
throw new Error(`Upload failed: ${resp.status} ${resp.statusText}`);
|
|
@@ -223,7 +225,7 @@ var FlashApiClient = class {
|
|
|
223
225
|
return this.handle(resp);
|
|
224
226
|
}
|
|
225
227
|
async putFile(url, data) {
|
|
226
|
-
const resp = await fetch(url, { method: "PUT", body: data });
|
|
228
|
+
const resp = await fetch(url, { method: "PUT", body: data, signal: AbortSignal.timeout(UPLOAD_TIMEOUT_MS) });
|
|
227
229
|
if (!resp.ok) {
|
|
228
230
|
throw new Error(`Upload failed: ${resp.status} ${resp.statusText}`);
|
|
229
231
|
}
|
|
@@ -679,26 +681,32 @@ var MinerU = class {
|
|
|
679
681
|
// Flash (agent) mode
|
|
680
682
|
// ══════════════════════════════════════════════════════════════════
|
|
681
683
|
async flashExtract(source, options = {}) {
|
|
682
|
-
const { language = "ch", pageRange, timeout = DEFAULT_TIMEOUT_POLL_SINGLE } = options;
|
|
684
|
+
const { language = "ch", pageRange, ocr, formula, table, timeout = DEFAULT_TIMEOUT_POLL_SINGLE } = options;
|
|
683
685
|
let taskId;
|
|
684
686
|
if (isUrl(source)) {
|
|
685
|
-
taskId = await this.flashSubmitUrl(source, language, pageRange);
|
|
687
|
+
taskId = await this.flashSubmitUrl(source, language, pageRange, ocr, formula, table);
|
|
686
688
|
} else {
|
|
687
|
-
taskId = await this.flashSubmitFile(source, language, pageRange);
|
|
689
|
+
taskId = await this.flashSubmitFile(source, language, pageRange, ocr, formula, table);
|
|
688
690
|
}
|
|
689
691
|
return this.flashWait(taskId, timeout);
|
|
690
692
|
}
|
|
691
693
|
// ── Flash internal helpers ──
|
|
692
|
-
async flashSubmitUrl(url, language, pageRange) {
|
|
694
|
+
async flashSubmitUrl(url, language, pageRange, ocr, formula, table) {
|
|
693
695
|
const payload = { url, language };
|
|
694
696
|
if (pageRange != null) payload["page_range"] = pageRange;
|
|
697
|
+
if (ocr != null) payload["is_ocr"] = ocr;
|
|
698
|
+
if (formula != null) payload["enable_formula"] = formula;
|
|
699
|
+
if (table != null) payload["enable_table"] = table;
|
|
695
700
|
const body = await this.flashApi.post("/parse/url", payload);
|
|
696
701
|
return body.data["task_id"];
|
|
697
702
|
}
|
|
698
|
-
async flashSubmitFile(filePath, language, pageRange) {
|
|
703
|
+
async flashSubmitFile(filePath, language, pageRange, ocr, formula, table) {
|
|
699
704
|
const fileName = basename2(filePath);
|
|
700
705
|
const payload = { file_name: fileName, language };
|
|
701
706
|
if (pageRange != null) payload["page_range"] = pageRange;
|
|
707
|
+
if (ocr != null) payload["is_ocr"] = ocr;
|
|
708
|
+
if (formula != null) payload["enable_formula"] = formula;
|
|
709
|
+
if (table != null) payload["enable_table"] = table;
|
|
702
710
|
const body = await this.flashApi.post("/parse/file", payload);
|
|
703
711
|
const taskId = body.data["task_id"];
|
|
704
712
|
const fileUrl = body.data["file_url"];
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/constants.ts","../src/client.ts","../src/errors.ts","../src/api.ts","../src/flash-api.ts","../src/models.ts","../src/zip.ts"],"sourcesContent":["export const DEFAULT_BASE_URL = \"https://mineru.net/api/v4\";\n\nexport const DEFAULT_FLASH_BASE_URL = \"https://mineru.net/api/v1/agent\";\n","import { readFile } from \"node:fs/promises\";\nimport { basename, extname } from \"node:path\";\n\nimport { ApiClient } from \"./api.js\";\nimport { DEFAULT_BASE_URL } from \"./constants.js\";\nimport { NoAuthClientError, TimeoutError } from \"./errors.js\";\nimport { FlashApiClient } from \"./flash-api.js\";\nimport type { ExtractResult, Progress } from \"./models.js\";\nimport { createEmptyResult } from \"./models.js\";\nimport { parseZip } from \"./zip.js\";\n\nconst MODEL_MAP: Record<string, string> = {\n pipeline: \"pipeline\",\n vlm: \"vlm\",\n html: \"MinerU-HTML\",\n};\n\nconst HTML_EXTENSIONS = new Set([\".html\", \".htm\"]);\n\nconst DEFAULT_SOURCE = \"open-api-sdk-js\";\n\n/** Default total business timeouts for extraction tasks (in seconds). */\nconst DEFAULT_TIMEOUT_POLL_SINGLE = 300;\nconst DEFAULT_TIMEOUT_POLL_BATCH = 1800;\n\nfunction isUrl(source: string): boolean {\n return source.startsWith(\"http://\") || source.startsWith(\"https://\");\n}\n\nfunction getExtension(source: string): string {\n if (isUrl(source)) {\n const path = source.split(\"?\")[0]!.split(\"#\")[0]!;\n const dot = path.lastIndexOf(\".\");\n return dot === -1 ? \"\" : path.slice(dot).toLowerCase();\n }\n return extname(source).toLowerCase();\n}\n\nfunction inferModel(source: string): string {\n return HTML_EXTENSIONS.has(getExtension(source)) ? \"MinerU-HTML\" : \"vlm\";\n}\n\nfunction resolveModel(model: string | undefined, source: string): string {\n if (model != null) {\n return MODEL_MAP[model] ?? model;\n }\n return inferModel(source);\n}\n\nexport interface ExtractOptions {\n model?: string;\n ocr?: boolean;\n formula?: boolean;\n table?: boolean;\n language?: string;\n pages?: string;\n extraFormats?: string[];\n /** Per-file overrides keyed by path or URL. */\n fileParams?: Record<string, FileParam>;\n /** Max total seconds to wait for task completion (polling). */\n timeout?: number;\n}\n\nexport interface BatchOptions {\n model?: string;\n ocr?: boolean;\n formula?: boolean;\n table?: boolean;\n language?: string;\n extraFormats?: string[];\n /** Per-file overrides keyed by path or URL. */\n fileParams?: Record<string, FileParam>;\n /** Max total seconds to wait for all tasks (polling). */\n timeout?: number;\n}\n\nexport interface FlashExtractOptions {\n language?: string;\n pageRange?: string;\n /** Max total seconds to wait for task completion (polling). */\n timeout?: number;\n}\n\n/** Per-file parameter overrides for batch methods. */\nexport interface FileParam {\n /** Override page_ranges for this file (e.g. \"1-10,15\"). */\n pages?: string;\n /** Override is_ocr for this file. */\n ocr?: boolean;\n /** Set data_id for this file. */\n dataId?: string;\n}\n\n/** Only includes fields the user explicitly set. Never assumes API defaults. */\nfunction buildApiOptions(\n modelVersion: string,\n opts: ExtractOptions | BatchOptions,\n): Record<string, unknown> {\n const o: Record<string, unknown> = { model_version: modelVersion };\n if (opts.formula !== undefined) o[\"enable_formula\"] = opts.formula;\n if (opts.table !== undefined) o[\"enable_table\"] = opts.table;\n if (opts.language !== undefined) o[\"language\"] = opts.language;\n if (opts.extraFormats?.length) {\n o[\"extra_formats\"] = opts.extraFormats;\n }\n return o;\n}\n\n/** Adds per-file fields (is_ocr, page_ranges, data_id) to a file entry. */\nfunction applyFileFields(\n entry: Record<string, unknown>,\n key: string,\n ocr: boolean | undefined,\n pages: string | undefined,\n fileParams: Record<string, FileParam> | undefined,\n): void {\n const fp = fileParams?.[key];\n\n // OCR: per-file overrides global\n const effectiveOcr = fp?.ocr !== undefined ? fp.ocr : ocr;\n if (effectiveOcr !== undefined) entry[\"is_ocr\"] = effectiveOcr;\n\n // Pages: per-file overrides global\n const effectivePages = fp?.pages || pages;\n if (effectivePages) entry[\"page_ranges\"] = effectivePages;\n\n // DataID: per-file only\n if (fp?.dataId) entry[\"data_id\"] = fp.dataId;\n}\n\nfunction parseTaskResult(data: Record<string, unknown>): ExtractResult {\n const result = createEmptyResult(\n (data[\"task_id\"] as string) ?? \"\",\n (data[\"state\"] as string) ?? \"unknown\",\n );\n result.filename = (data[\"file_name\"] as string) ?? null;\n const errCodeRaw = data[\"err_code\"];\n result.errCode = errCodeRaw == null ? \"\" : String(errCodeRaw);\n result.error = (data[\"err_msg\"] as string) || null;\n result.zipUrl = (data[\"full_zip_url\"] as string) ?? null;\n\n const ep = data[\"extract_progress\"] as Record<string, unknown> | undefined;\n if (ep) {\n result.progress = {\n extractedPages: (ep[\"extracted_pages\"] as number) ?? 0,\n totalPages: (ep[\"total_pages\"] as number) ?? 0,\n startTime: (ep[\"start_time\"] as string) ?? \"\",\n } satisfies Progress;\n }\n return result;\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\n/**\n * MinerU API client. Turn documents into Markdown with one method call.\n */\nexport class MinerU {\n private readonly api: ApiClient | null;\n private readonly flashApi: FlashApiClient;\n\n /**\n * @param token - API token.\n * @param baseUrl - API base URL.\n * @param flashBaseUrl - Flash API base URL.\n */\n constructor(\n token?: string,\n baseUrl = DEFAULT_BASE_URL,\n flashBaseUrl?: string,\n ) {\n const resolved = token ?? process.env[\"MINERU_TOKEN\"];\n if (resolved) {\n // ApiClient should ideally use DEFAULT_TIMEOUT_REQUEST internally\n this.api = new ApiClient(resolved, baseUrl, DEFAULT_SOURCE);\n } else {\n this.api = null; // flash-only mode\n }\n this.flashApi = new FlashApiClient(flashBaseUrl, DEFAULT_SOURCE);\n }\n\n setSource(source: string): void {\n if (this.api !== null) {\n this.api.setSource(source);\n }\n this.flashApi.setSource(source);\n }\n\n private requireAuth(): ApiClient {\n if (this.api === null) {\n throw new NoAuthClientError();\n }\n return this.api;\n }\n\n // ══════════════════════════════════════════════════════════════════\n // Synchronous (blocking) methods\n // ══════════════════════════════════════════════════════════════════\n\n async extract(\n source: string,\n options: ExtractOptions = {},\n ): Promise<ExtractResult> {\n this.requireAuth();\n const { timeout = DEFAULT_TIMEOUT_POLL_SINGLE, ...opts } = options;\n const modelVersion = resolveModel(opts.model, source);\n const apiOpts = buildApiOptions(modelVersion, opts);\n\n let batchId: string;\n if (isUrl(source)) {\n batchId = await this.submitUrlsBatch([source], apiOpts, opts.ocr, opts.pages, opts.fileParams);\n } else {\n batchId = await this.uploadAndSubmit([source], apiOpts, opts.ocr, opts.pages, opts.fileParams);\n }\n const results = await this.waitBatch(batchId, timeout);\n return results[0]!;\n }\n\n async *extractBatch(\n sources: string[],\n options: BatchOptions = {},\n ): AsyncGenerator<ExtractResult> {\n this.requireAuth();\n const { timeout = DEFAULT_TIMEOUT_POLL_BATCH, ...opts } = options;\n const firstSource = sources[0] ?? \"\";\n const modelVersion = resolveModel(opts.model, firstSource);\n const apiOpts = buildApiOptions(modelVersion, opts);\n\n const urls = sources.filter(isUrl);\n const files = sources.filter((s) => !isUrl(s));\n\n const batchIds: string[] = [];\n if (urls.length > 0) {\n batchIds.push(await this.submitUrlsBatch(urls, apiOpts, opts.ocr, undefined, opts.fileParams));\n }\n if (files.length > 0) {\n batchIds.push(await this.uploadAndSubmit(files, apiOpts, opts.ocr, undefined, opts.fileParams));\n }\n\n yield* this.yieldBatch(batchIds, sources.length, timeout);\n }\n\n async crawl(\n url: string,\n options: { extraFormats?: string[]; timeout?: number } = {},\n ): Promise<ExtractResult> {\n return this.extract(url, { model: \"html\", timeout: DEFAULT_TIMEOUT_POLL_SINGLE, ...options });\n }\n\n async *crawlBatch(\n urls: string[],\n options: { extraFormats?: string[]; timeout?: number } = {},\n ): AsyncGenerator<ExtractResult> {\n yield* this.extractBatch(urls, { model: \"html\", timeout: DEFAULT_TIMEOUT_POLL_BATCH, ...options });\n }\n\n // ══════════════════════════════════════════════════════════════════\n // Async primitives (no polling, no waiting)\n // ══════════════════════════════════════════════════════════════════\n\n async submit(\n source: string,\n options: Omit<ExtractOptions, \"timeout\"> = {},\n ): Promise<string> {\n this.requireAuth();\n const modelVersion = resolveModel(options.model, source);\n const apiOpts = buildApiOptions(modelVersion, options);\n\n if (isUrl(source)) {\n return this.submitUrlsBatch([source], apiOpts, options.ocr, options.pages, options.fileParams);\n }\n return this.uploadAndSubmit([source], apiOpts, options.ocr, options.pages, options.fileParams);\n }\n\n async submitBatch(\n sources: string[],\n options: Omit<BatchOptions, \"timeout\"> = {},\n ): Promise<string> {\n this.requireAuth();\n const firstSource = sources[0] ?? \"\";\n const modelVersion = resolveModel(options.model, firstSource);\n const apiOpts = buildApiOptions(modelVersion, options);\n\n const urls = sources.filter(isUrl);\n const files = sources.filter((s) => !isUrl(s));\n\n if (urls.length === 0 && files.length === 0) {\n throw new Error(\"No sources provided.\");\n }\n if (urls.length > 0 && files.length > 0) {\n throw new Error(\n \"submitBatch() does not support mixing URLs and local files in one call. \" +\n \"Please submit them separately or use extractBatch() instead.\",\n );\n }\n\n if (urls.length > 0) {\n return this.submitUrlsBatch(urls, apiOpts, options.ocr, undefined, options.fileParams);\n }\n return this.uploadAndSubmit(files, apiOpts, options.ocr, undefined, options.fileParams);\n }\n\n async getTask(taskId: string): Promise<ExtractResult> {\n const api = this.requireAuth();\n const body = await api.get(`/extract/task/${taskId}`);\n const result = parseTaskResult(body.data);\n if (result.state === \"done\" && result.zipUrl) {\n return this.downloadAndParse(result);\n }\n return result;\n }\n\n async getBatch(batchId: string): Promise<ExtractResult[]> {\n const api = this.requireAuth();\n const body = await api.get(`/extract-results/batch/${batchId}`);\n const items = (body.data[\"extract_result\"] as Record<string, unknown>[]) ?? [];\n const results: ExtractResult[] = [];\n for (const item of items) {\n let r = parseTaskResult(item);\n if (r.state === \"done\" && r.zipUrl) {\n r = await this.downloadAndParse(r);\n }\n results.push(r);\n }\n return results;\n }\n\n // ══════════════════════════════════════════════════════════════════\n // Internal helpers\n // ══════════════════════════════════════════════════════════════════\n\n private async submitUrlsBatch(\n urls: string[],\n opts: Record<string, unknown>,\n ocr: boolean | undefined,\n pages: string | undefined,\n fileParams: Record<string, FileParam> | undefined,\n ): Promise<string> {\n const files = urls.map((u) => {\n const entry: Record<string, unknown> = { url: u };\n applyFileFields(entry, u, ocr, pages, fileParams);\n return entry;\n });\n const body = await this.requireAuth().post(\"/extract/task/batch\", {\n files,\n ...opts,\n });\n return body.data[\"batch_id\"] as string;\n }\n\n private async uploadAndSubmit(\n filePaths: string[],\n opts: Record<string, unknown>,\n ocr: boolean | undefined,\n pages: string | undefined,\n fileParams: Record<string, FileParam> | undefined,\n ): Promise<string> {\n const api = this.requireAuth();\n const filesMeta = filePaths.map((p) => {\n const entry: Record<string, unknown> = { name: basename(p) };\n applyFileFields(entry, p, ocr, pages, fileParams);\n return entry;\n });\n const body = await api.post(\"/file-urls/batch\", {\n files: filesMeta,\n ...opts,\n });\n const batchId = body.data[\"batch_id\"] as string;\n const uploadUrls = body.data[\"file_urls\"] as string[];\n\n for (let i = 0; i < filePaths.length; i++) {\n const data = await readFile(filePaths[i]!);\n await api.putFile(uploadUrls[i]!, new Uint8Array(data));\n }\n\n return batchId;\n }\n\n private async downloadAndParse(\n result: ExtractResult,\n ): Promise<ExtractResult> {\n const zipBytes = await this.requireAuth().download(result.zipUrl!);\n const parsed = parseZip(zipBytes, result.taskId, result.filename);\n parsed.zipUrl = result.zipUrl;\n return parsed;\n }\n\n private async waitBatch(\n batchId: string,\n timeout: number,\n ): Promise<ExtractResult[]> {\n const deadline = Date.now() + timeout * 1000;\n let interval = 2000;\n for (;;) {\n const results = await this.getBatch(batchId);\n if (results.every((r) => r.state === \"done\" || r.state === \"failed\")) {\n return results;\n }\n if (Date.now() > deadline) {\n throw new TimeoutError(timeout, batchId);\n }\n await sleep(Math.min(interval, Math.max(0, deadline - Date.now())));\n interval = Math.min(interval * 2, 30_000);\n }\n }\n\n private async *yieldBatch(\n batchIds: string[],\n total: number,\n timeout: number,\n ): AsyncGenerator<ExtractResult> {\n const deadline = Date.now() + timeout * 1000;\n const yielded = new Set<string>();\n let interval = 2000;\n\n while (yielded.size < total) {\n for (const bid of batchIds) {\n const results = await this.getBatch(bid);\n for (let idx = 0; idx < results.length; idx++) {\n const key = `${bid}:${idx}`;\n const r = results[idx]!;\n if (!yielded.has(key) && (r.state === \"done\" || r.state === \"failed\")) {\n yielded.add(key);\n yield r;\n }\n }\n }\n\n if (yielded.size >= total) break;\n if (Date.now() > deadline) {\n throw new TimeoutError(timeout, batchIds.join(\",\"));\n }\n await sleep(Math.min(interval, Math.max(0, deadline - Date.now())));\n interval = Math.min(interval * 2, 30_000);\n }\n }\n\n // ══════════════════════════════════════════════════════════════════\n // Flash (agent) mode\n // ══════════════════════════════════════════════════════════════════\n\n async flashExtract(\n source: string,\n options: FlashExtractOptions = {},\n ): Promise<ExtractResult> {\n const { language = \"ch\", pageRange, timeout = DEFAULT_TIMEOUT_POLL_SINGLE } = options;\n\n let taskId: string;\n if (isUrl(source)) {\n taskId = await this.flashSubmitUrl(source, language, pageRange);\n } else {\n taskId = await this.flashSubmitFile(source, language, pageRange);\n }\n\n return this.flashWait(taskId, timeout);\n }\n\n // ── Flash internal helpers ──\n\n private async flashSubmitUrl(\n url: string,\n language: string,\n pageRange?: string,\n ): Promise<string> {\n const payload: Record<string, unknown> = { url, language };\n if (pageRange != null) payload[\"page_range\"] = pageRange;\n const body = await this.flashApi.post(\"/parse/url\", payload);\n return body.data[\"task_id\"] as string;\n }\n\n private async flashSubmitFile(\n filePath: string,\n language: string,\n pageRange?: string,\n ): Promise<string> {\n const fileName = basename(filePath);\n const payload: Record<string, unknown> = { file_name: fileName, language };\n if (pageRange != null) payload[\"page_range\"] = pageRange;\n const body = await this.flashApi.post(\"/parse/file\", payload);\n const taskId = body.data[\"task_id\"] as string;\n const fileUrl = body.data[\"file_url\"] as string;\n\n const data = await readFile(filePath);\n await this.flashApi.putFile(fileUrl, new Uint8Array(data));\n return taskId;\n }\n\n private async flashWait(\n taskId: string,\n timeout: number,\n ): Promise<ExtractResult> {\n const deadline = Date.now() + timeout * 1000;\n let interval = 2000;\n for (;;) {\n const result = await this.flashGetTask(taskId);\n if (result.state === \"done\" || result.state === \"failed\") return result;\n if (Date.now() > deadline) throw new TimeoutError(timeout, taskId);\n await sleep(Math.min(interval, Math.max(0, deadline - Date.now())));\n interval = Math.min(interval * 2, 30_000);\n }\n }\n\n private async flashGetTask(taskId: string): Promise<ExtractResult> {\n const body = await this.flashApi.get(`/parse/${taskId}`);\n return this.parseFlashTask(body.data);\n }\n\n private async parseFlashTask(\n data: Record<string, unknown>,\n ): Promise<ExtractResult> {\n const result = createEmptyResult(\n (data[\"task_id\"] as string) ?? \"\",\n (data[\"state\"] as string) ?? \"unknown\",\n );\n const errCodeRaw = data[\"err_code\"];\n result.errCode = errCodeRaw == null ? \"\" : String(errCodeRaw);\n result.error = (data[\"err_msg\"] as string) || null;\n\n const ep = data[\"extract_progress\"] as\n | Record<string, unknown>\n | undefined;\n if (ep) {\n result.progress = {\n extractedPages: (ep[\"extracted_pages\"] as number) ?? 0,\n totalPages: (ep[\"total_pages\"] as number) ?? 0,\n startTime: (ep[\"start_time\"] as string) ?? \"\",\n };\n }\n\n if (result.state === \"done\" && data[\"markdown_url\"]) {\n result.markdown = await this.flashApi.downloadText(\n data[\"markdown_url\"] as string,\n );\n }\n\n return result;\n }\n}\n","export class MinerUError extends Error {\n readonly code: string;\n readonly traceId: string;\n\n constructor(code: string | number, message: string, traceId = \"\") {\n const tag = traceId ? ` (trace: ${traceId})` : \"\";\n super(`[${code}] ${message}${tag}`);\n this.name = \"MinerUError\";\n this.code = String(code);\n this.traceId = traceId;\n }\n}\n\nexport class AuthError extends MinerUError {\n constructor(code: string | number, message: string, traceId = \"\") {\n super(code, message, traceId);\n this.name = \"AuthError\";\n }\n}\n\nexport class ParamError extends MinerUError {\n constructor(code: string | number, message: string, traceId = \"\") {\n super(code, message, traceId);\n this.name = \"ParamError\";\n }\n}\n\nexport class FileTooLargeError extends MinerUError {\n constructor(code: string | number, message: string, traceId = \"\") {\n super(code, message, traceId);\n this.name = \"FileTooLargeError\";\n }\n}\n\nexport class PageLimitError extends MinerUError {\n constructor(code: string | number, message: string, traceId = \"\") {\n super(code, message, traceId);\n this.name = \"PageLimitError\";\n }\n}\n\nexport class TaskNotFoundError extends MinerUError {\n constructor(code: string | number, message: string, traceId = \"\") {\n super(code, message, traceId);\n this.name = \"TaskNotFoundError\";\n }\n}\n\nexport class ExtractFailedError extends MinerUError {\n constructor(code: string | number, message: string, traceId = \"\") {\n super(code, message, traceId);\n this.name = \"ExtractFailedError\";\n }\n}\n\nexport class TimeoutError extends MinerUError {\n readonly timeout: number;\n readonly taskId: string;\n\n constructor(timeout: number, taskId: string) {\n super(\"TIMEOUT\", `Task ${taskId} did not complete within ${timeout}s`);\n this.name = \"TimeoutError\";\n this.timeout = timeout;\n this.taskId = taskId;\n }\n}\n\nexport class QuotaExceededError extends MinerUError {\n constructor(code: string | number, message: string, traceId = \"\") {\n super(code, message, traceId);\n this.name = \"QuotaExceededError\";\n }\n}\n\n// Flash API specific errors\n\nexport class FlashFileTooLargeError extends MinerUError {\n constructor(code: string | number, message: string, traceId = \"\") {\n super(code, message, traceId);\n this.name = \"FlashFileTooLargeError\";\n }\n}\n\nexport class FlashUnsupportedTypeError extends MinerUError {\n constructor(code: string | number, message: string, traceId = \"\") {\n super(code, message, traceId);\n this.name = \"FlashUnsupportedTypeError\";\n }\n}\n\nexport class FlashPageLimitError extends MinerUError {\n constructor(code: string | number, message: string, traceId = \"\") {\n super(code, message, traceId);\n this.name = \"FlashPageLimitError\";\n }\n}\n\nexport class FlashParamError extends MinerUError {\n constructor(code: string | number, message: string, traceId = \"\") {\n super(code, message, traceId);\n this.name = \"FlashParamError\";\n }\n}\n\nexport class NoAuthClientError extends MinerUError {\n constructor() {\n super(\n \"-1\",\n \"This operation requires an authenticated client; pass token to MinerU() or set MINERU_TOKEN env var.\",\n );\n this.name = \"NoAuthClientError\";\n }\n}\n\nconst CODE_TO_ERROR: Record<string, typeof MinerUError> = {\n A0202: AuthError,\n A0211: AuthError,\n \"-500\": ParamError,\n \"-10002\": ParamError,\n \"-60005\": FileTooLargeError,\n \"-60006\": PageLimitError,\n \"-60010\": ExtractFailedError,\n \"-60012\": TaskNotFoundError,\n \"-60013\": MinerUError,\n \"-60018\": QuotaExceededError,\n \"-60019\": QuotaExceededError,\n \"-30001\": FlashFileTooLargeError,\n \"-30002\": FlashUnsupportedTypeError,\n \"-30003\": FlashPageLimitError,\n \"-30004\": FlashParamError,\n};\n\nexport function raiseForCode(\n code: number | string,\n msg: string,\n traceId = \"\",\n): never {\n const ErrorClass = CODE_TO_ERROR[String(code)] ?? MinerUError;\n throw new ErrorClass(code, msg, traceId);\n}\n","import { raiseForCode } from \"./errors.js\";\n\ninterface ApiResponse {\n code: number;\n msg?: string;\n trace_id?: string;\n data: Record<string, unknown>;\n}\n\nexport class ApiClient {\n private readonly baseUrl: string;\n private readonly headers: Record<string, string>;\n private source: string;\n\n constructor(token: string, baseUrl: string, source = \"\") {\n this.baseUrl = baseUrl;\n this.headers = {\n Authorization: `Bearer ${token}`,\n \"Content-Type\": \"application/json\",\n };\n this.source = source;\n }\n\n setSource(source: string): void {\n this.source = source;\n }\n\n async post(\n path: string,\n json: Record<string, unknown>,\n ): Promise<ApiResponse> {\n const headers: Record<string, string> = { ...this.headers };\n if (this.source) {\n headers[\"source\"] = this.source;\n }\n const resp = await fetch(`${this.baseUrl}${path}`, {\n method: \"POST\",\n headers,\n body: JSON.stringify(json),\n });\n return this.handle(resp);\n }\n\n async get(path: string): Promise<ApiResponse> {\n const resp = await fetch(`${this.baseUrl}${path}`, {\n method: \"GET\",\n headers: this.headers,\n });\n return this.handle(resp);\n }\n\n async putFile(url: string, data: Uint8Array): Promise<void> {\n const resp = await fetch(url, {\n method: \"PUT\",\n body: data,\n });\n if (!resp.ok) {\n throw new Error(`Upload failed: ${resp.status} ${resp.statusText}`);\n }\n }\n\n async download(url: string): Promise<Uint8Array> {\n const resp = await fetch(url, { redirect: \"follow\" });\n if (!resp.ok) {\n throw new Error(`Download failed: ${resp.status} ${resp.statusText}`);\n }\n return new Uint8Array(await resp.arrayBuffer());\n }\n\n private async handle(resp: Response): Promise<ApiResponse> {\n if (!resp.ok) {\n const text = await resp.text().catch(() => \"\");\n throw new Error(\n `HTTP ${resp.status}: ${resp.statusText}${text ? ` — ${text}` : \"\"}`,\n );\n }\n const body = (await resp.json()) as ApiResponse;\n if (body.code !== 0) {\n raiseForCode(body.code, body.msg ?? \"unknown error\", body.trace_id ?? \"\");\n }\n return body;\n }\n}\n","import { raiseForCode } from \"./errors.js\";\nimport { DEFAULT_FLASH_BASE_URL } from \"./constants.js\";\n\ninterface FlashApiResponse {\n code: number;\n msg?: string;\n trace_id?: string;\n data: Record<string, unknown>;\n}\n\nexport class FlashApiClient {\n private readonly baseUrl: string;\n private readonly headers: Record<string, string>;\n private source: string;\n\n constructor(baseUrl: string = DEFAULT_FLASH_BASE_URL, source = \"\") {\n this.baseUrl = baseUrl;\n this.headers = { \"Content-Type\": \"application/json\" };\n this.source = source;\n }\n\n setSource(source: string): void {\n this.source = source;\n }\n\n async post(\n path: string,\n json: Record<string, unknown>,\n ): Promise<FlashApiResponse> {\n const headers: Record<string, string> = { ...this.headers };\n if (this.source) {\n headers[\"source\"] = this.source;\n }\n const resp = await fetch(`${this.baseUrl}${path}`, {\n method: \"POST\",\n headers,\n body: JSON.stringify(json),\n });\n return this.handle(resp);\n }\n\n async get(path: string): Promise<FlashApiResponse> {\n const resp = await fetch(`${this.baseUrl}${path}`, {\n method: \"GET\",\n });\n return this.handle(resp);\n }\n\n async putFile(url: string, data: Uint8Array): Promise<void> {\n const resp = await fetch(url, { method: \"PUT\", body: data });\n if (!resp.ok) {\n throw new Error(`Upload failed: ${resp.status} ${resp.statusText}`);\n }\n }\n\n async downloadText(url: string): Promise<string> {\n const resp = await fetch(url, { redirect: \"follow\" });\n if (!resp.ok) {\n throw new Error(`Download failed: ${resp.status} ${resp.statusText}`);\n }\n return resp.text();\n }\n\n private async handle(resp: Response): Promise<FlashApiResponse> {\n if (resp.status === 429) {\n raiseForCode(\n \"RATE_LIMITED\",\n \"flash API rate limit exceeded; try again later\",\n );\n }\n if (!resp.ok) {\n const text = await resp.text().catch(() => \"\");\n throw new Error(\n `HTTP ${resp.status}: ${resp.statusText}${text ? ` — ${text}` : \"\"}`,\n );\n }\n const body = (await resp.json()) as FlashApiResponse;\n if (body.code !== 0) {\n raiseForCode(body.code, body.msg ?? \"unknown error\", body.trace_id ?? \"\");\n }\n return body;\n }\n}\n","import { writeFile, mkdir } from \"node:fs/promises\";\nimport { dirname, join } from \"node:path\";\n\nexport interface Image {\n name: string;\n data: Uint8Array;\n path: string;\n}\n\nexport interface Progress {\n extractedPages: number;\n totalPages: number;\n startTime: string;\n}\n\nexport function progressPercent(p: Progress): number {\n if (p.totalPages === 0) return 0;\n return (p.extractedPages / p.totalPages) * 100;\n}\n\nexport function progressToString(p: Progress): string {\n return `${p.extractedPages}/${p.totalPages} (${progressPercent(p).toFixed(0)}%)`;\n}\n\nexport interface ExtractResult {\n taskId: string;\n state: string;\n filename: string | null;\n errCode: string;\n error: string | null;\n zipUrl: string | null;\n\n progress: Progress | null;\n\n markdown: string | null;\n contentList: Record<string, unknown>[] | null;\n images: Image[];\n\n docx: Uint8Array | null;\n html: string | null;\n latex: string | null;\n\n /** @internal */\n _zipBytes: Uint8Array | null;\n}\n\nexport function createEmptyResult(\n taskId: string,\n state: string,\n): ExtractResult {\n return {\n taskId,\n state,\n filename: null,\n errCode: \"\",\n error: null,\n zipUrl: null,\n progress: null,\n markdown: null,\n contentList: null,\n images: [],\n docx: null,\n html: null,\n latex: null,\n _zipBytes: null,\n };\n}\n\nasync function ensureDir(filePath: string): Promise<void> {\n await mkdir(dirname(filePath), { recursive: true });\n}\n\nexport async function saveMarkdown(\n result: ExtractResult,\n path: string,\n withImages = true,\n): Promise<void> {\n if (result.markdown == null) {\n throw new Error(\"No markdown content available (state != done)\");\n }\n await ensureDir(path);\n await writeFile(path, result.markdown, \"utf-8\");\n if (withImages && result.images.length > 0) {\n const imgDir = join(dirname(path), \"images\");\n await mkdir(imgDir, { recursive: true });\n for (const img of result.images) {\n await writeFile(join(imgDir, img.name), img.data);\n }\n }\n}\n\nexport async function saveDocx(\n result: ExtractResult,\n path: string,\n): Promise<void> {\n if (result.docx == null) {\n throw new Error(\n \"No docx content available\",\n );\n }\n await ensureDir(path);\n await writeFile(path, result.docx);\n}\n\nexport async function saveHtml(\n result: ExtractResult,\n path: string,\n): Promise<void> {\n if (result.html == null) {\n throw new Error(\n \"No html content available\",\n );\n }\n await ensureDir(path);\n await writeFile(path, result.html, \"utf-8\");\n}\n\nexport async function saveLatex(\n result: ExtractResult,\n path: string,\n): Promise<void> {\n if (result.latex == null) {\n throw new Error(\n \"No latex content available\",\n );\n }\n await ensureDir(path);\n await writeFile(path, result.latex, \"utf-8\");\n}\n\nexport async function saveAll(\n result: ExtractResult,\n dir: string,\n): Promise<void> {\n if (result._zipBytes == null) {\n throw new Error(\"No zip data available (state != done)\");\n }\n const { unzipSync } = await import(\"fflate\");\n const entries = unzipSync(new Uint8Array(result._zipBytes));\n await mkdir(dir, { recursive: true });\n for (const [relativePath, content] of Object.entries(entries)) {\n if (relativePath.endsWith(\"/\")) continue;\n const fullPath = join(dir, relativePath);\n await ensureDir(fullPath);\n await writeFile(fullPath, content);\n }\n}\n","import { unzipSync } from \"fflate\";\nimport type { ExtractResult, Image } from \"./models.js\";\nimport { createEmptyResult } from \"./models.js\";\n\nconst IMAGE_EXTENSIONS = new Set([\n \".png\", \".jpg\", \".jpeg\", \".gif\", \".bmp\", \".svg\", \".webp\",\n]);\n\nfunction extname(filename: string): string {\n const dot = filename.lastIndexOf(\".\");\n return dot === -1 ? \"\" : filename.slice(dot).toLowerCase();\n}\n\nfunction basename(filepath: string): string {\n const parts = filepath.replace(/\\\\/g, \"/\").split(\"/\");\n return parts[parts.length - 1] ?? \"\";\n}\n\nexport function parseZip(\n zipBytes: Uint8Array,\n taskId: string,\n filename: string | null = null,\n): ExtractResult {\n const result = createEmptyResult(taskId, \"done\");\n result.filename = filename;\n result._zipBytes = zipBytes;\n\n const entries = unzipSync(zipBytes);\n const images: Image[] = [];\n let contentList: Record<string, unknown>[] | null = null;\n\n for (const [relPath, data] of Object.entries(entries)) {\n if (relPath.endsWith(\"/\")) continue;\n\n const name = basename(relPath);\n const ext = extname(name);\n const text = () => new TextDecoder().decode(data);\n\n if (ext === \".md\") {\n result.markdown = text();\n } else if (\n name.endsWith(\"_content_list.json\") ||\n name === \"content_list.json\"\n ) {\n contentList = JSON.parse(text()) as Record<string, unknown>[];\n } else if (ext === \".json\" && contentList == null) {\n try {\n const parsed: unknown = JSON.parse(text());\n if (Array.isArray(parsed)) {\n contentList = parsed as Record<string, unknown>[];\n }\n } catch {\n // not a valid JSON array — skip\n }\n } else if (IMAGE_EXTENSIONS.has(ext)) {\n images.push({ name, data: new Uint8Array(data), path: relPath });\n } else if (ext === \".docx\") {\n result.docx = new Uint8Array(data);\n } else if (ext === \".html\" || ext === \".htm\") {\n result.html = text();\n } else if (ext === \".tex\") {\n result.latex = text();\n }\n }\n\n result.contentList = contentList;\n result.images = images;\n return result;\n}\n"],"mappings":"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","names":["basename","extname","unzipSync","extname","basename"]}
|
|
1
|
+
{"version":3,"sources":["../src/constants.ts","../src/client.ts","../src/errors.ts","../src/api.ts","../src/flash-api.ts","../src/models.ts","../src/zip.ts"],"sourcesContent":["export const DEFAULT_BASE_URL = \"https://mineru.net/api/v4\";\n\nexport const DEFAULT_FLASH_BASE_URL = \"https://mineru.net/api/v1/agent\";\n\n/** Timeout for file uploads in milliseconds (PUT to pre-signed URL). */\nexport const UPLOAD_TIMEOUT_MS = 300_000;\n","import { readFile } from \"node:fs/promises\";\nimport { basename, extname } from \"node:path\";\n\nimport { ApiClient } from \"./api.js\";\nimport { DEFAULT_BASE_URL } from \"./constants.js\";\nimport { NoAuthClientError, TimeoutError } from \"./errors.js\";\nimport { FlashApiClient } from \"./flash-api.js\";\nimport type { ExtractResult, Progress } from \"./models.js\";\nimport { createEmptyResult } from \"./models.js\";\nimport { parseZip } from \"./zip.js\";\n\nconst MODEL_MAP: Record<string, string> = {\n pipeline: \"pipeline\",\n vlm: \"vlm\",\n html: \"MinerU-HTML\",\n};\n\nconst HTML_EXTENSIONS = new Set([\".html\", \".htm\"]);\n\nconst DEFAULT_SOURCE = \"open-api-sdk-js\";\n\n/** Default total business timeouts for extraction tasks (in seconds). */\nconst DEFAULT_TIMEOUT_POLL_SINGLE = 300;\nconst DEFAULT_TIMEOUT_POLL_BATCH = 1800;\n\nfunction isUrl(source: string): boolean {\n return source.startsWith(\"http://\") || source.startsWith(\"https://\");\n}\n\nfunction getExtension(source: string): string {\n if (isUrl(source)) {\n const path = source.split(\"?\")[0]!.split(\"#\")[0]!;\n const dot = path.lastIndexOf(\".\");\n return dot === -1 ? \"\" : path.slice(dot).toLowerCase();\n }\n return extname(source).toLowerCase();\n}\n\nfunction inferModel(source: string): string {\n return HTML_EXTENSIONS.has(getExtension(source)) ? \"MinerU-HTML\" : \"vlm\";\n}\n\nfunction resolveModel(model: string | undefined, source: string): string {\n if (model != null) {\n return MODEL_MAP[model] ?? model;\n }\n return inferModel(source);\n}\n\nexport interface ExtractOptions {\n model?: string;\n ocr?: boolean;\n formula?: boolean;\n table?: boolean;\n language?: string;\n pages?: string;\n extraFormats?: string[];\n /** Per-file overrides keyed by path or URL. */\n fileParams?: Record<string, FileParam>;\n /** Max total seconds to wait for task completion (polling). */\n timeout?: number;\n}\n\nexport interface BatchOptions {\n model?: string;\n ocr?: boolean;\n formula?: boolean;\n table?: boolean;\n language?: string;\n extraFormats?: string[];\n /** Per-file overrides keyed by path or URL. */\n fileParams?: Record<string, FileParam>;\n /** Max total seconds to wait for all tasks (polling). */\n timeout?: number;\n}\n\nexport interface FlashExtractOptions {\n language?: string;\n pageRange?: string;\n ocr?: boolean;\n formula?: boolean;\n table?: boolean;\n /** Max total seconds to wait for task completion (polling). */\n timeout?: number;\n}\n\n/** Per-file parameter overrides for batch methods. */\nexport interface FileParam {\n /** Override page_ranges for this file (e.g. \"1-10,15\"). */\n pages?: string;\n /** Override is_ocr for this file. */\n ocr?: boolean;\n /** Set data_id for this file. */\n dataId?: string;\n}\n\n/** Only includes fields the user explicitly set. Never assumes API defaults. */\nfunction buildApiOptions(\n modelVersion: string,\n opts: ExtractOptions | BatchOptions,\n): Record<string, unknown> {\n const o: Record<string, unknown> = { model_version: modelVersion };\n if (opts.formula !== undefined) o[\"enable_formula\"] = opts.formula;\n if (opts.table !== undefined) o[\"enable_table\"] = opts.table;\n if (opts.language !== undefined) o[\"language\"] = opts.language;\n if (opts.extraFormats?.length) {\n o[\"extra_formats\"] = opts.extraFormats;\n }\n return o;\n}\n\n/** Adds per-file fields (is_ocr, page_ranges, data_id) to a file entry. */\nfunction applyFileFields(\n entry: Record<string, unknown>,\n key: string,\n ocr: boolean | undefined,\n pages: string | undefined,\n fileParams: Record<string, FileParam> | undefined,\n): void {\n const fp = fileParams?.[key];\n\n // OCR: per-file overrides global\n const effectiveOcr = fp?.ocr !== undefined ? fp.ocr : ocr;\n if (effectiveOcr !== undefined) entry[\"is_ocr\"] = effectiveOcr;\n\n // Pages: per-file overrides global\n const effectivePages = fp?.pages || pages;\n if (effectivePages) entry[\"page_ranges\"] = effectivePages;\n\n // DataID: per-file only\n if (fp?.dataId) entry[\"data_id\"] = fp.dataId;\n}\n\nfunction parseTaskResult(data: Record<string, unknown>): ExtractResult {\n const result = createEmptyResult(\n (data[\"task_id\"] as string) ?? \"\",\n (data[\"state\"] as string) ?? \"unknown\",\n );\n result.filename = (data[\"file_name\"] as string) ?? null;\n const errCodeRaw = data[\"err_code\"];\n result.errCode = errCodeRaw == null ? \"\" : String(errCodeRaw);\n result.error = (data[\"err_msg\"] as string) || null;\n result.zipUrl = (data[\"full_zip_url\"] as string) ?? null;\n\n const ep = data[\"extract_progress\"] as Record<string, unknown> | undefined;\n if (ep) {\n result.progress = {\n extractedPages: (ep[\"extracted_pages\"] as number) ?? 0,\n totalPages: (ep[\"total_pages\"] as number) ?? 0,\n startTime: (ep[\"start_time\"] as string) ?? \"\",\n } satisfies Progress;\n }\n return result;\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\n/**\n * MinerU API client. Turn documents into Markdown with one method call.\n */\nexport class MinerU {\n private readonly api: ApiClient | null;\n private readonly flashApi: FlashApiClient;\n\n /**\n * @param token - API token.\n * @param baseUrl - API base URL.\n * @param flashBaseUrl - Flash API base URL.\n */\n constructor(\n token?: string,\n baseUrl = DEFAULT_BASE_URL,\n flashBaseUrl?: string,\n ) {\n const resolved = token ?? process.env[\"MINERU_TOKEN\"];\n if (resolved) {\n // ApiClient should ideally use DEFAULT_TIMEOUT_REQUEST internally\n this.api = new ApiClient(resolved, baseUrl, DEFAULT_SOURCE);\n } else {\n this.api = null; // flash-only mode\n }\n this.flashApi = new FlashApiClient(flashBaseUrl, DEFAULT_SOURCE);\n }\n\n setSource(source: string): void {\n if (this.api !== null) {\n this.api.setSource(source);\n }\n this.flashApi.setSource(source);\n }\n\n private requireAuth(): ApiClient {\n if (this.api === null) {\n throw new NoAuthClientError();\n }\n return this.api;\n }\n\n // ══════════════════════════════════════════════════════════════════\n // Synchronous (blocking) methods\n // ══════════════════════════════════════════════════════════════════\n\n async extract(\n source: string,\n options: ExtractOptions = {},\n ): Promise<ExtractResult> {\n this.requireAuth();\n const { timeout = DEFAULT_TIMEOUT_POLL_SINGLE, ...opts } = options;\n const modelVersion = resolveModel(opts.model, source);\n const apiOpts = buildApiOptions(modelVersion, opts);\n\n let batchId: string;\n if (isUrl(source)) {\n batchId = await this.submitUrlsBatch([source], apiOpts, opts.ocr, opts.pages, opts.fileParams);\n } else {\n batchId = await this.uploadAndSubmit([source], apiOpts, opts.ocr, opts.pages, opts.fileParams);\n }\n const results = await this.waitBatch(batchId, timeout);\n return results[0]!;\n }\n\n async *extractBatch(\n sources: string[],\n options: BatchOptions = {},\n ): AsyncGenerator<ExtractResult> {\n this.requireAuth();\n const { timeout = DEFAULT_TIMEOUT_POLL_BATCH, ...opts } = options;\n const firstSource = sources[0] ?? \"\";\n const modelVersion = resolveModel(opts.model, firstSource);\n const apiOpts = buildApiOptions(modelVersion, opts);\n\n const urls = sources.filter(isUrl);\n const files = sources.filter((s) => !isUrl(s));\n\n const batchIds: string[] = [];\n if (urls.length > 0) {\n batchIds.push(await this.submitUrlsBatch(urls, apiOpts, opts.ocr, undefined, opts.fileParams));\n }\n if (files.length > 0) {\n batchIds.push(await this.uploadAndSubmit(files, apiOpts, opts.ocr, undefined, opts.fileParams));\n }\n\n yield* this.yieldBatch(batchIds, sources.length, timeout);\n }\n\n async crawl(\n url: string,\n options: { extraFormats?: string[]; timeout?: number } = {},\n ): Promise<ExtractResult> {\n return this.extract(url, { model: \"html\", timeout: DEFAULT_TIMEOUT_POLL_SINGLE, ...options });\n }\n\n async *crawlBatch(\n urls: string[],\n options: { extraFormats?: string[]; timeout?: number } = {},\n ): AsyncGenerator<ExtractResult> {\n yield* this.extractBatch(urls, { model: \"html\", timeout: DEFAULT_TIMEOUT_POLL_BATCH, ...options });\n }\n\n // ══════════════════════════════════════════════════════════════════\n // Async primitives (no polling, no waiting)\n // ══════════════════════════════════════════════════════════════════\n\n async submit(\n source: string,\n options: Omit<ExtractOptions, \"timeout\"> = {},\n ): Promise<string> {\n this.requireAuth();\n const modelVersion = resolveModel(options.model, source);\n const apiOpts = buildApiOptions(modelVersion, options);\n\n if (isUrl(source)) {\n return this.submitUrlsBatch([source], apiOpts, options.ocr, options.pages, options.fileParams);\n }\n return this.uploadAndSubmit([source], apiOpts, options.ocr, options.pages, options.fileParams);\n }\n\n async submitBatch(\n sources: string[],\n options: Omit<BatchOptions, \"timeout\"> = {},\n ): Promise<string> {\n this.requireAuth();\n const firstSource = sources[0] ?? \"\";\n const modelVersion = resolveModel(options.model, firstSource);\n const apiOpts = buildApiOptions(modelVersion, options);\n\n const urls = sources.filter(isUrl);\n const files = sources.filter((s) => !isUrl(s));\n\n if (urls.length === 0 && files.length === 0) {\n throw new Error(\"No sources provided.\");\n }\n if (urls.length > 0 && files.length > 0) {\n throw new Error(\n \"submitBatch() does not support mixing URLs and local files in one call. \" +\n \"Please submit them separately or use extractBatch() instead.\",\n );\n }\n\n if (urls.length > 0) {\n return this.submitUrlsBatch(urls, apiOpts, options.ocr, undefined, options.fileParams);\n }\n return this.uploadAndSubmit(files, apiOpts, options.ocr, undefined, options.fileParams);\n }\n\n async getTask(taskId: string): Promise<ExtractResult> {\n const api = this.requireAuth();\n const body = await api.get(`/extract/task/${taskId}`);\n const result = parseTaskResult(body.data);\n if (result.state === \"done\" && result.zipUrl) {\n return this.downloadAndParse(result);\n }\n return result;\n }\n\n async getBatch(batchId: string): Promise<ExtractResult[]> {\n const api = this.requireAuth();\n const body = await api.get(`/extract-results/batch/${batchId}`);\n const items = (body.data[\"extract_result\"] as Record<string, unknown>[]) ?? [];\n const results: ExtractResult[] = [];\n for (const item of items) {\n let r = parseTaskResult(item);\n if (r.state === \"done\" && r.zipUrl) {\n r = await this.downloadAndParse(r);\n }\n results.push(r);\n }\n return results;\n }\n\n // ══════════════════════════════════════════════════════════════════\n // Internal helpers\n // ══════════════════════════════════════════════════════════════════\n\n private async submitUrlsBatch(\n urls: string[],\n opts: Record<string, unknown>,\n ocr: boolean | undefined,\n pages: string | undefined,\n fileParams: Record<string, FileParam> | undefined,\n ): Promise<string> {\n const files = urls.map((u) => {\n const entry: Record<string, unknown> = { url: u };\n applyFileFields(entry, u, ocr, pages, fileParams);\n return entry;\n });\n const body = await this.requireAuth().post(\"/extract/task/batch\", {\n files,\n ...opts,\n });\n return body.data[\"batch_id\"] as string;\n }\n\n private async uploadAndSubmit(\n filePaths: string[],\n opts: Record<string, unknown>,\n ocr: boolean | undefined,\n pages: string | undefined,\n fileParams: Record<string, FileParam> | undefined,\n ): Promise<string> {\n const api = this.requireAuth();\n const filesMeta = filePaths.map((p) => {\n const entry: Record<string, unknown> = { name: basename(p) };\n applyFileFields(entry, p, ocr, pages, fileParams);\n return entry;\n });\n const body = await api.post(\"/file-urls/batch\", {\n files: filesMeta,\n ...opts,\n });\n const batchId = body.data[\"batch_id\"] as string;\n const uploadUrls = body.data[\"file_urls\"] as string[];\n\n for (let i = 0; i < filePaths.length; i++) {\n const data = await readFile(filePaths[i]!);\n await api.putFile(uploadUrls[i]!, new Uint8Array(data));\n }\n\n return batchId;\n }\n\n private async downloadAndParse(\n result: ExtractResult,\n ): Promise<ExtractResult> {\n const zipBytes = await this.requireAuth().download(result.zipUrl!);\n const parsed = parseZip(zipBytes, result.taskId, result.filename);\n parsed.zipUrl = result.zipUrl;\n return parsed;\n }\n\n private async waitBatch(\n batchId: string,\n timeout: number,\n ): Promise<ExtractResult[]> {\n const deadline = Date.now() + timeout * 1000;\n let interval = 2000;\n for (;;) {\n const results = await this.getBatch(batchId);\n if (results.every((r) => r.state === \"done\" || r.state === \"failed\")) {\n return results;\n }\n if (Date.now() > deadline) {\n throw new TimeoutError(timeout, batchId);\n }\n await sleep(Math.min(interval, Math.max(0, deadline - Date.now())));\n interval = Math.min(interval * 2, 30_000);\n }\n }\n\n private async *yieldBatch(\n batchIds: string[],\n total: number,\n timeout: number,\n ): AsyncGenerator<ExtractResult> {\n const deadline = Date.now() + timeout * 1000;\n const yielded = new Set<string>();\n let interval = 2000;\n\n while (yielded.size < total) {\n for (const bid of batchIds) {\n const results = await this.getBatch(bid);\n for (let idx = 0; idx < results.length; idx++) {\n const key = `${bid}:${idx}`;\n const r = results[idx]!;\n if (!yielded.has(key) && (r.state === \"done\" || r.state === \"failed\")) {\n yielded.add(key);\n yield r;\n }\n }\n }\n\n if (yielded.size >= total) break;\n if (Date.now() > deadline) {\n throw new TimeoutError(timeout, batchIds.join(\",\"));\n }\n await sleep(Math.min(interval, Math.max(0, deadline - Date.now())));\n interval = Math.min(interval * 2, 30_000);\n }\n }\n\n // ══════════════════════════════════════════════════════════════════\n // Flash (agent) mode\n // ══════════════════════════════════════════════════════════════════\n\n async flashExtract(\n source: string,\n options: FlashExtractOptions = {},\n ): Promise<ExtractResult> {\n const { language = \"ch\", pageRange, ocr, formula, table, timeout = DEFAULT_TIMEOUT_POLL_SINGLE } = options;\n\n let taskId: string;\n if (isUrl(source)) {\n taskId = await this.flashSubmitUrl(source, language, pageRange, ocr, formula, table);\n } else {\n taskId = await this.flashSubmitFile(source, language, pageRange, ocr, formula, table);\n }\n\n return this.flashWait(taskId, timeout);\n }\n\n // ── Flash internal helpers ──\n\n private async flashSubmitUrl(\n url: string,\n language: string,\n pageRange?: string,\n ocr?: boolean,\n formula?: boolean,\n table?: boolean,\n ): Promise<string> {\n const payload: Record<string, unknown> = { url, language };\n if (pageRange != null) payload[\"page_range\"] = pageRange;\n if (ocr != null) payload[\"is_ocr\"] = ocr;\n if (formula != null) payload[\"enable_formula\"] = formula;\n if (table != null) payload[\"enable_table\"] = table;\n const body = await this.flashApi.post(\"/parse/url\", payload);\n return body.data[\"task_id\"] as string;\n }\n\n private async flashSubmitFile(\n filePath: string,\n language: string,\n pageRange?: string,\n ocr?: boolean,\n formula?: boolean,\n table?: boolean,\n ): Promise<string> {\n const fileName = basename(filePath);\n const payload: Record<string, unknown> = { file_name: fileName, language };\n if (pageRange != null) payload[\"page_range\"] = pageRange;\n if (ocr != null) payload[\"is_ocr\"] = ocr;\n if (formula != null) payload[\"enable_formula\"] = formula;\n if (table != null) payload[\"enable_table\"] = table;\n const body = await this.flashApi.post(\"/parse/file\", payload);\n const taskId = body.data[\"task_id\"] as string;\n const fileUrl = body.data[\"file_url\"] as string;\n\n const data = await readFile(filePath);\n await this.flashApi.putFile(fileUrl, new Uint8Array(data));\n return taskId;\n }\n\n private async flashWait(\n taskId: string,\n timeout: number,\n ): Promise<ExtractResult> {\n const deadline = Date.now() + timeout * 1000;\n let interval = 2000;\n for (;;) {\n const result = await this.flashGetTask(taskId);\n if (result.state === \"done\" || result.state === \"failed\") return result;\n if (Date.now() > deadline) throw new TimeoutError(timeout, taskId);\n await sleep(Math.min(interval, Math.max(0, deadline - Date.now())));\n interval = Math.min(interval * 2, 30_000);\n }\n }\n\n private async flashGetTask(taskId: string): Promise<ExtractResult> {\n const body = await this.flashApi.get(`/parse/${taskId}`);\n return this.parseFlashTask(body.data);\n }\n\n private async parseFlashTask(\n data: Record<string, unknown>,\n ): Promise<ExtractResult> {\n const result = createEmptyResult(\n (data[\"task_id\"] as string) ?? \"\",\n (data[\"state\"] as string) ?? \"unknown\",\n );\n const errCodeRaw = data[\"err_code\"];\n result.errCode = errCodeRaw == null ? \"\" : String(errCodeRaw);\n result.error = (data[\"err_msg\"] as string) || null;\n\n const ep = data[\"extract_progress\"] as\n | Record<string, unknown>\n | undefined;\n if (ep) {\n result.progress = {\n extractedPages: (ep[\"extracted_pages\"] as number) ?? 0,\n totalPages: (ep[\"total_pages\"] as number) ?? 0,\n startTime: (ep[\"start_time\"] as string) ?? \"\",\n };\n }\n\n if (result.state === \"done\" && data[\"markdown_url\"]) {\n result.markdown = await this.flashApi.downloadText(\n data[\"markdown_url\"] as string,\n );\n }\n\n return result;\n }\n}\n","export class MinerUError extends Error {\n readonly code: string;\n readonly traceId: string;\n\n constructor(code: string | number, message: string, traceId = \"\") {\n const tag = traceId ? ` (trace: ${traceId})` : \"\";\n super(`[${code}] ${message}${tag}`);\n this.name = \"MinerUError\";\n this.code = String(code);\n this.traceId = traceId;\n }\n}\n\nexport class AuthError extends MinerUError {\n constructor(code: string | number, message: string, traceId = \"\") {\n super(code, message, traceId);\n this.name = \"AuthError\";\n }\n}\n\nexport class ParamError extends MinerUError {\n constructor(code: string | number, message: string, traceId = \"\") {\n super(code, message, traceId);\n this.name = \"ParamError\";\n }\n}\n\nexport class FileTooLargeError extends MinerUError {\n constructor(code: string | number, message: string, traceId = \"\") {\n super(code, message, traceId);\n this.name = \"FileTooLargeError\";\n }\n}\n\nexport class PageLimitError extends MinerUError {\n constructor(code: string | number, message: string, traceId = \"\") {\n super(code, message, traceId);\n this.name = \"PageLimitError\";\n }\n}\n\nexport class TaskNotFoundError extends MinerUError {\n constructor(code: string | number, message: string, traceId = \"\") {\n super(code, message, traceId);\n this.name = \"TaskNotFoundError\";\n }\n}\n\nexport class ExtractFailedError extends MinerUError {\n constructor(code: string | number, message: string, traceId = \"\") {\n super(code, message, traceId);\n this.name = \"ExtractFailedError\";\n }\n}\n\nexport class TimeoutError extends MinerUError {\n readonly timeout: number;\n readonly taskId: string;\n\n constructor(timeout: number, taskId: string) {\n super(\"TIMEOUT\", `Task ${taskId} did not complete within ${timeout}s`);\n this.name = \"TimeoutError\";\n this.timeout = timeout;\n this.taskId = taskId;\n }\n}\n\nexport class QuotaExceededError extends MinerUError {\n constructor(code: string | number, message: string, traceId = \"\") {\n super(code, message, traceId);\n this.name = \"QuotaExceededError\";\n }\n}\n\n// Flash API specific errors\n\nexport class FlashFileTooLargeError extends MinerUError {\n constructor(code: string | number, message: string, traceId = \"\") {\n super(code, message, traceId);\n this.name = \"FlashFileTooLargeError\";\n }\n}\n\nexport class FlashUnsupportedTypeError extends MinerUError {\n constructor(code: string | number, message: string, traceId = \"\") {\n super(code, message, traceId);\n this.name = \"FlashUnsupportedTypeError\";\n }\n}\n\nexport class FlashPageLimitError extends MinerUError {\n constructor(code: string | number, message: string, traceId = \"\") {\n super(code, message, traceId);\n this.name = \"FlashPageLimitError\";\n }\n}\n\nexport class FlashParamError extends MinerUError {\n constructor(code: string | number, message: string, traceId = \"\") {\n super(code, message, traceId);\n this.name = \"FlashParamError\";\n }\n}\n\nexport class NoAuthClientError extends MinerUError {\n constructor() {\n super(\n \"-1\",\n \"This operation requires an authenticated client; pass token to MinerU() or set MINERU_TOKEN env var.\",\n );\n this.name = \"NoAuthClientError\";\n }\n}\n\nconst CODE_TO_ERROR: Record<string, typeof MinerUError> = {\n A0202: AuthError,\n A0211: AuthError,\n \"-500\": ParamError,\n \"-10002\": ParamError,\n \"-60005\": FileTooLargeError,\n \"-60006\": PageLimitError,\n \"-60010\": ExtractFailedError,\n \"-60012\": TaskNotFoundError,\n \"-60013\": MinerUError,\n \"-60018\": QuotaExceededError,\n \"-60019\": QuotaExceededError,\n \"-30001\": FlashFileTooLargeError,\n \"-30002\": FlashUnsupportedTypeError,\n \"-30003\": FlashPageLimitError,\n \"-30004\": FlashParamError,\n};\n\nexport function raiseForCode(\n code: number | string,\n msg: string,\n traceId = \"\",\n): never {\n const ErrorClass = CODE_TO_ERROR[String(code)] ?? MinerUError;\n throw new ErrorClass(code, msg, traceId);\n}\n","import { raiseForCode } from \"./errors.js\";\nimport { UPLOAD_TIMEOUT_MS } from \"./constants.js\";\n\ninterface ApiResponse {\n code: number;\n msg?: string;\n trace_id?: string;\n data: Record<string, unknown>;\n}\n\nexport class ApiClient {\n private readonly baseUrl: string;\n private readonly headers: Record<string, string>;\n private source: string;\n\n constructor(token: string, baseUrl: string, source = \"\") {\n this.baseUrl = baseUrl;\n this.headers = {\n Authorization: `Bearer ${token}`,\n \"Content-Type\": \"application/json\",\n };\n this.source = source;\n }\n\n setSource(source: string): void {\n this.source = source;\n }\n\n async post(\n path: string,\n json: Record<string, unknown>,\n ): Promise<ApiResponse> {\n const headers: Record<string, string> = { ...this.headers };\n if (this.source) {\n headers[\"source\"] = this.source;\n }\n const resp = await fetch(`${this.baseUrl}${path}`, {\n method: \"POST\",\n headers,\n body: JSON.stringify(json),\n });\n return this.handle(resp);\n }\n\n async get(path: string): Promise<ApiResponse> {\n const resp = await fetch(`${this.baseUrl}${path}`, {\n method: \"GET\",\n headers: this.headers,\n });\n return this.handle(resp);\n }\n\n async putFile(url: string, data: Uint8Array): Promise<void> {\n const resp = await fetch(url, {\n method: \"PUT\",\n body: data,\n signal: AbortSignal.timeout(UPLOAD_TIMEOUT_MS),\n });\n if (!resp.ok) {\n throw new Error(`Upload failed: ${resp.status} ${resp.statusText}`);\n }\n }\n\n async download(url: string): Promise<Uint8Array> {\n const resp = await fetch(url, { redirect: \"follow\" });\n if (!resp.ok) {\n throw new Error(`Download failed: ${resp.status} ${resp.statusText}`);\n }\n return new Uint8Array(await resp.arrayBuffer());\n }\n\n private async handle(resp: Response): Promise<ApiResponse> {\n if (!resp.ok) {\n const text = await resp.text().catch(() => \"\");\n throw new Error(\n `HTTP ${resp.status}: ${resp.statusText}${text ? ` — ${text}` : \"\"}`,\n );\n }\n const body = (await resp.json()) as ApiResponse;\n if (body.code !== 0) {\n raiseForCode(body.code, body.msg ?? \"unknown error\", body.trace_id ?? \"\");\n }\n return body;\n }\n}\n","import { raiseForCode } from \"./errors.js\";\nimport { DEFAULT_FLASH_BASE_URL, UPLOAD_TIMEOUT_MS } from \"./constants.js\";\n\ninterface FlashApiResponse {\n code: number;\n msg?: string;\n trace_id?: string;\n data: Record<string, unknown>;\n}\n\nexport class FlashApiClient {\n private readonly baseUrl: string;\n private readonly headers: Record<string, string>;\n private source: string;\n\n constructor(baseUrl: string = DEFAULT_FLASH_BASE_URL, source = \"\") {\n this.baseUrl = baseUrl;\n this.headers = { \"Content-Type\": \"application/json\" };\n this.source = source;\n }\n\n setSource(source: string): void {\n this.source = source;\n }\n\n async post(\n path: string,\n json: Record<string, unknown>,\n ): Promise<FlashApiResponse> {\n const headers: Record<string, string> = { ...this.headers };\n if (this.source) {\n headers[\"source\"] = this.source;\n }\n const resp = await fetch(`${this.baseUrl}${path}`, {\n method: \"POST\",\n headers,\n body: JSON.stringify(json),\n });\n return this.handle(resp);\n }\n\n async get(path: string): Promise<FlashApiResponse> {\n const resp = await fetch(`${this.baseUrl}${path}`, {\n method: \"GET\",\n });\n return this.handle(resp);\n }\n\n async putFile(url: string, data: Uint8Array): Promise<void> {\n const resp = await fetch(url, { method: \"PUT\", body: data, signal: AbortSignal.timeout(UPLOAD_TIMEOUT_MS) });\n if (!resp.ok) {\n throw new Error(`Upload failed: ${resp.status} ${resp.statusText}`);\n }\n }\n\n async downloadText(url: string): Promise<string> {\n const resp = await fetch(url, { redirect: \"follow\" });\n if (!resp.ok) {\n throw new Error(`Download failed: ${resp.status} ${resp.statusText}`);\n }\n return resp.text();\n }\n\n private async handle(resp: Response): Promise<FlashApiResponse> {\n if (resp.status === 429) {\n raiseForCode(\n \"RATE_LIMITED\",\n \"flash API rate limit exceeded; try again later\",\n );\n }\n if (!resp.ok) {\n const text = await resp.text().catch(() => \"\");\n throw new Error(\n `HTTP ${resp.status}: ${resp.statusText}${text ? ` — ${text}` : \"\"}`,\n );\n }\n const body = (await resp.json()) as FlashApiResponse;\n if (body.code !== 0) {\n raiseForCode(body.code, body.msg ?? \"unknown error\", body.trace_id ?? \"\");\n }\n return body;\n }\n}\n","import { writeFile, mkdir } from \"node:fs/promises\";\nimport { dirname, join } from \"node:path\";\n\nexport interface Image {\n name: string;\n data: Uint8Array;\n path: string;\n}\n\nexport interface Progress {\n extractedPages: number;\n totalPages: number;\n startTime: string;\n}\n\nexport function progressPercent(p: Progress): number {\n if (p.totalPages === 0) return 0;\n return (p.extractedPages / p.totalPages) * 100;\n}\n\nexport function progressToString(p: Progress): string {\n return `${p.extractedPages}/${p.totalPages} (${progressPercent(p).toFixed(0)}%)`;\n}\n\nexport interface ExtractResult {\n taskId: string;\n state: string;\n filename: string | null;\n errCode: string;\n error: string | null;\n zipUrl: string | null;\n\n progress: Progress | null;\n\n markdown: string | null;\n contentList: Record<string, unknown>[] | null;\n images: Image[];\n\n docx: Uint8Array | null;\n html: string | null;\n latex: string | null;\n\n /** @internal */\n _zipBytes: Uint8Array | null;\n}\n\nexport function createEmptyResult(\n taskId: string,\n state: string,\n): ExtractResult {\n return {\n taskId,\n state,\n filename: null,\n errCode: \"\",\n error: null,\n zipUrl: null,\n progress: null,\n markdown: null,\n contentList: null,\n images: [],\n docx: null,\n html: null,\n latex: null,\n _zipBytes: null,\n };\n}\n\nasync function ensureDir(filePath: string): Promise<void> {\n await mkdir(dirname(filePath), { recursive: true });\n}\n\nexport async function saveMarkdown(\n result: ExtractResult,\n path: string,\n withImages = true,\n): Promise<void> {\n if (result.markdown == null) {\n throw new Error(\"No markdown content available (state != done)\");\n }\n await ensureDir(path);\n await writeFile(path, result.markdown, \"utf-8\");\n if (withImages && result.images.length > 0) {\n const imgDir = join(dirname(path), \"images\");\n await mkdir(imgDir, { recursive: true });\n for (const img of result.images) {\n await writeFile(join(imgDir, img.name), img.data);\n }\n }\n}\n\nexport async function saveDocx(\n result: ExtractResult,\n path: string,\n): Promise<void> {\n if (result.docx == null) {\n throw new Error(\n \"No docx content available\",\n );\n }\n await ensureDir(path);\n await writeFile(path, result.docx);\n}\n\nexport async function saveHtml(\n result: ExtractResult,\n path: string,\n): Promise<void> {\n if (result.html == null) {\n throw new Error(\n \"No html content available\",\n );\n }\n await ensureDir(path);\n await writeFile(path, result.html, \"utf-8\");\n}\n\nexport async function saveLatex(\n result: ExtractResult,\n path: string,\n): Promise<void> {\n if (result.latex == null) {\n throw new Error(\n \"No latex content available\",\n );\n }\n await ensureDir(path);\n await writeFile(path, result.latex, \"utf-8\");\n}\n\nexport async function saveAll(\n result: ExtractResult,\n dir: string,\n): Promise<void> {\n if (result._zipBytes == null) {\n throw new Error(\"No zip data available (state != done)\");\n }\n const { unzipSync } = await import(\"fflate\");\n const entries = unzipSync(new Uint8Array(result._zipBytes));\n await mkdir(dir, { recursive: true });\n for (const [relativePath, content] of Object.entries(entries)) {\n if (relativePath.endsWith(\"/\")) continue;\n const fullPath = join(dir, relativePath);\n await ensureDir(fullPath);\n await writeFile(fullPath, content);\n }\n}\n","import { unzipSync } from \"fflate\";\nimport type { ExtractResult, Image } from \"./models.js\";\nimport { createEmptyResult } from \"./models.js\";\n\nconst IMAGE_EXTENSIONS = new Set([\n \".png\", \".jpg\", \".jpeg\", \".gif\", \".bmp\", \".svg\", \".webp\",\n]);\n\nfunction extname(filename: string): string {\n const dot = filename.lastIndexOf(\".\");\n return dot === -1 ? \"\" : filename.slice(dot).toLowerCase();\n}\n\nfunction basename(filepath: string): string {\n const parts = filepath.replace(/\\\\/g, \"/\").split(\"/\");\n return parts[parts.length - 1] ?? \"\";\n}\n\nexport function parseZip(\n zipBytes: Uint8Array,\n taskId: string,\n filename: string | null = null,\n): ExtractResult {\n const result = createEmptyResult(taskId, \"done\");\n result.filename = filename;\n result._zipBytes = zipBytes;\n\n const entries = unzipSync(zipBytes);\n const images: Image[] = [];\n let contentList: Record<string, unknown>[] | null = null;\n\n for (const [relPath, data] of Object.entries(entries)) {\n if (relPath.endsWith(\"/\")) continue;\n\n const name = basename(relPath);\n const ext = extname(name);\n const text = () => new TextDecoder().decode(data);\n\n if (ext === \".md\") {\n result.markdown = text();\n } else if (\n name.endsWith(\"_content_list.json\") ||\n name === \"content_list.json\"\n ) {\n contentList = JSON.parse(text()) as Record<string, unknown>[];\n } else if (ext === \".json\" && contentList == null) {\n try {\n const parsed: unknown = JSON.parse(text());\n if (Array.isArray(parsed)) {\n contentList = parsed as Record<string, unknown>[];\n }\n } catch {\n // not a valid JSON array — skip\n }\n } else if (IMAGE_EXTENSIONS.has(ext)) {\n images.push({ name, data: new Uint8Array(data), path: relPath });\n } else if (ext === \".docx\") {\n result.docx = new Uint8Array(data);\n } else if (ext === \".html\" || ext === \".htm\") {\n result.html = text();\n } else if (ext === \".tex\") {\n result.latex = text();\n }\n }\n\n result.contentList = contentList;\n result.images = images;\n return result;\n}\n"],"mappings":"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","names":["basename","extname","unzipSync","extname","basename"]}
|