@uploadista/flow-documents-pdflib 0.0.18-beta.8 → 0.0.18

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.
@@ -1,6 +1,6 @@
1
1
 
2
2
  
3
- > @uploadista/flow-documents-pdflib@0.0.18-beta.7 build /Users/denislaboureyras/Documents/uploadista/dev/uploadista-workspace/uploadista-sdk/packages/flow/documents/pdflib
3
+ > @uploadista/flow-documents-pdflib@0.0.18-beta.17 build /Users/denislaboureyras/Documents/uploadista/dev/uploadista-workspace/uploadista-sdk/packages/flow/documents/pdflib
4
4
  > tsdown
5
5
 
6
6
  ℹ tsdown v0.16.8 powered by rolldown v1.0.0-beta.52
@@ -8,9 +8,17 @@
8
8
  ℹ tsconfig: tsconfig.json
9
9
  ℹ Build start
10
10
  ℹ Cleaning 4 files
11
- ℹ dist/index.mjs  8.20 kB │ gzip: 1.87 kB
12
- ℹ dist/index.mjs.map 16.18 kB │ gzip: 3.54 kB
11
+ ℹ dist/index.mjs  8.68 kB │ gzip: 1.99 kB
12
+ ℹ dist/index.mjs.map 17.07 kB │ gzip: 3.74 kB
13
13
  ℹ dist/index.d.mts.map  0.33 kB │ gzip: 0.23 kB
14
14
  ℹ dist/index.d.mts  0.83 kB │ gzip: 0.37 kB
15
- ℹ 4 files, total: 25.54 kB
16
- ✔ Build complete in 5415ms
15
+ ℹ 4 files, total: 26.91 kB
16
+ [UNRESOLVED_IMPORT] Warning: Could not resolve '@uploadista/observability' in src/document-plugin.ts
17
+ ╭─[ src/document-plugin.ts:7:35 ]
18
+ │
19
+ 7 │ import { withOperationSpan } from "@uploadista/observability";
20
+  │ ─────────────┬─────────────
21
+  │ ╰─────────────── Module not found, treating it as an external dependency
22
+ ───╯
23
+
24
+ ✔ Build complete in 4944ms
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.mts","names":[],"sources":["../src/document-plugin.ts","../src/utils/format-mappings.ts"],"sourcesContent":[],"mappings":";;;;cAiCa,sBAAoB,KAAA,CAAA,MAAA;cA4RpB,0BAAwB,KAAA,CAAA,MAAA;;;;;;cC1TxB,aAAA;AD8Bb;AA4RA;;cCrTa,aAAA;;AALb;AAKA;AAKgB,iBAAA,cAAA,CAAA,CAAc,EAAA,MAAA;AAO9B;;;iBAAgB,eAAA,CAAA"}
1
+ {"version":3,"file":"index.d.mts","names":[],"sources":["../src/document-plugin.ts","../src/utils/format-mappings.ts"],"sourcesContent":[],"mappings":";;;;cAkCa,sBAAoB,KAAA,CAAA,MAAA;cA2SpB,0BAAwB,KAAA,CAAA,MAAA;;;;;;cC1UxB,aAAA;AD+Bb;AA2SA;;cCrUa,aAAA;;AALb;AAKA;AAKgB,iBAAA,cAAA,CAAA,CAAc,EAAA,MAAA;AAO9B;;;iBAAgB,eAAA,CAAA"}
package/dist/index.mjs CHANGED
@@ -1,5 +1,6 @@
1
1
  import { UploadistaError } from "@uploadista/core/errors";
2
2
  import { DocumentPlugin } from "@uploadista/core/flow";
3
+ import { withOperationSpan } from "@uploadista/observability";
3
4
  import { Effect, Layer } from "effect";
4
5
  import { PDFDocument } from "pdf-lib";
5
6
 
@@ -53,7 +54,7 @@ const pdfLibDocumentPlugin = Layer.succeed(DocumentPlugin, DocumentPlugin.of({
53
54
  modifiedDate: modificationDateStr ? parsePdfDate(modificationDateStr.toString()) : null,
54
55
  fileSize: input.byteLength
55
56
  };
56
- });
57
+ }).pipe(withOperationSpan("document", "get-metadata", { "document.input_size": input.byteLength }));
57
58
  },
58
59
  splitPdf: (input, options) => {
59
60
  return Effect.gen(function* () {
@@ -121,7 +122,12 @@ const pdfLibDocumentPlugin = Layer.succeed(DocumentPlugin, DocumentPlugin.of({
121
122
  mode: "range",
122
123
  pdf: new Uint8Array(pdfBytes)
123
124
  };
124
- });
125
+ }).pipe(withOperationSpan("document", "split-pdf", {
126
+ "document.mode": options.mode,
127
+ "document.start_page": options.startPage,
128
+ "document.end_page": options.endPage,
129
+ "document.input_size": input.byteLength
130
+ }));
125
131
  },
126
132
  mergePdfs: (options) => {
127
133
  return Effect.gen(function* () {
@@ -162,7 +168,7 @@ const pdfLibDocumentPlugin = Layer.succeed(DocumentPlugin, DocumentPlugin.of({
162
168
  }
163
169
  });
164
170
  return new Uint8Array(mergedBytes);
165
- });
171
+ }).pipe(withOperationSpan("document", "merge-pdfs", { "document.input_count": options.pdfs.length }));
166
172
  }
167
173
  }));
168
174
  const PdfLibDocumentPluginLive = pdfLibDocumentPlugin;
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","names":["pdfs: Uint8Array[]","newPdf","pdfBytes"],"sources":["../src/document-plugin.ts","../src/utils/format-mappings.ts"],"sourcesContent":["import { UploadistaError } from \"@uploadista/core/errors\";\nimport {\n type DocumentMetadata,\n DocumentPlugin,\n type SplitPdfResult,\n} from \"@uploadista/core/flow\";\nimport { Effect, Layer } from \"effect\";\nimport { PDFDocument } from \"pdf-lib\";\n\n/**\n * Helper to parse date from PDF date string format\n */\nfunction parsePdfDate(dateStr: string | undefined): string | null {\n if (!dateStr) return null;\n try {\n // PDF date format: D:YYYYMMDDHHmmSSOHH'mm'\n // Example: D:20230101120000Z\n const match = dateStr.match(\n /D:(\\d{4})(\\d{2})(\\d{2})(\\d{2})?(\\d{2})?(\\d{2})?/,\n );\n if (!match) return null;\n\n const [, year, month, day, hour = \"00\", minute = \"00\", second = \"00\"] =\n match;\n const date = new Date(\n `${year}-${month}-${day}T${hour}:${minute}:${second}Z`,\n );\n return date.toISOString();\n } catch {\n return null;\n }\n}\n\nexport const pdfLibDocumentPlugin = Layer.succeed(\n DocumentPlugin,\n DocumentPlugin.of({\n extractText: (_input) => {\n return Effect.gen(function* () {\n // pdf-lib has very limited text extraction capabilities\n // Return an error indicating that unpdf should be used instead\n return yield* UploadistaError.fromCode(\"DOCUMENT_PROCESSING_FAILED\", {\n cause:\n \"pdf-lib does not support text extraction. Use @uploadista/flow-documents-unpdf instead.\",\n }).toEffect();\n });\n },\n\n getMetadata: (input) => {\n return Effect.gen(function* () {\n const pdfDoc = yield* Effect.tryPromise({\n try: async () =>\n await PDFDocument.load(input, { ignoreEncryption: false }),\n catch: (error) => {\n const errorMessage =\n error instanceof Error ? error.message : String(error);\n\n if (errorMessage.toLowerCase().includes(\"encrypt\")) {\n return UploadistaError.fromCode(\"PDF_ENCRYPTED\", {\n cause: errorMessage,\n });\n }\n\n if (\n errorMessage.toLowerCase().includes(\"corrupt\") ||\n errorMessage.toLowerCase().includes(\"invalid\")\n ) {\n return UploadistaError.fromCode(\"PDF_CORRUPTED\", {\n cause: errorMessage,\n });\n }\n\n return UploadistaError.fromCode(\"DOCUMENT_PROCESSING_FAILED\", {\n cause: errorMessage,\n });\n },\n });\n\n const pageCount = pdfDoc.getPageCount();\n const author = pdfDoc.getAuthor() || null;\n const title = pdfDoc.getTitle() || null;\n const subject = pdfDoc.getSubject() || null;\n const creator = pdfDoc.getCreator() || null;\n const creationDateStr = pdfDoc.getCreationDate();\n const modificationDateStr = pdfDoc.getModificationDate();\n\n const creationDate = creationDateStr\n ? parsePdfDate(creationDateStr.toString())\n : null;\n const modifiedDate = modificationDateStr\n ? parsePdfDate(modificationDateStr.toString())\n : null;\n\n const metadata: DocumentMetadata = {\n pageCount,\n format: \"pdf\",\n author,\n title,\n subject,\n creator,\n creationDate,\n modifiedDate,\n fileSize: input.byteLength,\n };\n\n return metadata;\n });\n },\n\n splitPdf: (input, options) => {\n return Effect.gen(function* () {\n const pdfDoc = yield* Effect.tryPromise({\n try: async () =>\n await PDFDocument.load(input, { ignoreEncryption: false }),\n catch: (error) => {\n const errorMessage =\n error instanceof Error ? error.message : String(error);\n\n if (errorMessage.toLowerCase().includes(\"encrypt\")) {\n return UploadistaError.fromCode(\"PDF_ENCRYPTED\", {\n cause: errorMessage,\n });\n }\n\n return UploadistaError.fromCode(\"DOCUMENT_PROCESSING_FAILED\", {\n cause: errorMessage,\n });\n },\n });\n\n const totalPages = pdfDoc.getPageCount();\n\n if (options.mode === \"individual\") {\n // Split into individual pages\n const pdfs: Uint8Array[] = [];\n\n for (let i = 0; i < totalPages; i++) {\n const newPdf = yield* Effect.tryPromise({\n try: async () => await PDFDocument.create(),\n catch: (error) => {\n return UploadistaError.fromCode(\"DOCUMENT_PROCESSING_FAILED\", {\n cause: error instanceof Error ? error.message : String(error),\n });\n },\n });\n\n const [copiedPage] = yield* Effect.tryPromise({\n try: async () => await newPdf.copyPages(pdfDoc, [i]),\n catch: (error) => {\n return UploadistaError.fromCode(\"DOCUMENT_PROCESSING_FAILED\", {\n cause: error instanceof Error ? error.message : String(error),\n });\n },\n });\n\n newPdf.addPage(copiedPage);\n\n const pdfBytes = yield* Effect.tryPromise({\n try: async () => await newPdf.save(),\n catch: (error) => {\n return UploadistaError.fromCode(\"DOCUMENT_PROCESSING_FAILED\", {\n cause: error instanceof Error ? error.message : String(error),\n });\n },\n });\n\n pdfs.push(new Uint8Array(pdfBytes));\n }\n\n const result: SplitPdfResult = {\n mode: \"individual\",\n pdfs,\n };\n\n return result;\n }\n\n // Range mode\n if (!options.startPage || !options.endPage) {\n return yield* UploadistaError.fromCode(\"PAGE_RANGE_INVALID\", {\n cause: \"startPage and endPage are required for range mode\",\n }).toEffect();\n }\n\n // Validate page range (1-indexed)\n if (\n options.startPage < 1 ||\n options.endPage > totalPages ||\n options.startPage > options.endPage\n ) {\n return yield* UploadistaError.fromCode(\"PAGE_RANGE_INVALID\", {\n cause: `Invalid page range: ${options.startPage}-${options.endPage}. Document has ${totalPages} pages.`,\n }).toEffect();\n }\n\n const newPdf = yield* Effect.tryPromise({\n try: async () => await PDFDocument.create(),\n catch: (error) => {\n return UploadistaError.fromCode(\"DOCUMENT_PROCESSING_FAILED\", {\n cause: error instanceof Error ? error.message : String(error),\n });\n },\n });\n\n // Convert from 1-indexed to 0-indexed\n const pageIndices = Array.from(\n { length: options.endPage - options.startPage + 1 },\n (_, i) => (options.startPage ?? 1) - 1 + i,\n );\n\n const copiedPages = yield* Effect.tryPromise({\n try: async () => await newPdf.copyPages(pdfDoc, pageIndices),\n catch: (error) => {\n return UploadistaError.fromCode(\"DOCUMENT_PROCESSING_FAILED\", {\n cause: error instanceof Error ? error.message : String(error),\n });\n },\n });\n\n for (const page of copiedPages) {\n newPdf.addPage(page);\n }\n\n const pdfBytes = yield* Effect.tryPromise({\n try: async () => await newPdf.save(),\n catch: (error) => {\n return UploadistaError.fromCode(\"DOCUMENT_PROCESSING_FAILED\", {\n cause: error instanceof Error ? error.message : String(error),\n });\n },\n });\n\n const result: SplitPdfResult = {\n mode: \"range\",\n pdf: new Uint8Array(pdfBytes),\n };\n\n return result;\n });\n },\n\n mergePdfs: (options) => {\n return Effect.gen(function* () {\n if (options.pdfs.length === 0) {\n return yield* UploadistaError.fromCode(\"DOCUMENT_PROCESSING_FAILED\", {\n cause: \"At least one PDF is required for merging\",\n }).toEffect();\n }\n\n if (options.pdfs.length === 1) {\n // Single PDF, just return it\n yield* Effect.logWarning(\n \"Only one PDF provided for merging, returning original\",\n );\n return options.pdfs[0];\n }\n\n const mergedPdf = yield* Effect.tryPromise({\n try: async () => await PDFDocument.create(),\n catch: (error) => {\n return UploadistaError.fromCode(\"DOCUMENT_PROCESSING_FAILED\", {\n cause: error instanceof Error ? error.message : String(error),\n });\n },\n });\n\n for (const pdfBytes of options.pdfs) {\n const pdf = yield* Effect.tryPromise({\n try: async () =>\n await PDFDocument.load(pdfBytes, { ignoreEncryption: false }),\n catch: (error) => {\n const errorMessage =\n error instanceof Error ? error.message : String(error);\n\n if (errorMessage.toLowerCase().includes(\"encrypt\")) {\n return UploadistaError.fromCode(\"PDF_ENCRYPTED\", {\n cause: errorMessage,\n });\n }\n\n return UploadistaError.fromCode(\"DOCUMENT_PROCESSING_FAILED\", {\n cause: errorMessage,\n });\n },\n });\n\n const pageCount = pdf.getPageCount();\n const pageIndices = Array.from({ length: pageCount }, (_, i) => i);\n\n const copiedPages = yield* Effect.tryPromise({\n try: async () => await mergedPdf.copyPages(pdf, pageIndices),\n catch: (error) => {\n return UploadistaError.fromCode(\"DOCUMENT_PROCESSING_FAILED\", {\n cause: error instanceof Error ? error.message : String(error),\n });\n },\n });\n\n for (const page of copiedPages) {\n mergedPdf.addPage(page);\n }\n }\n\n const mergedBytes = yield* Effect.tryPromise({\n try: async () => await mergedPdf.save(),\n catch: (error) => {\n return UploadistaError.fromCode(\"DOCUMENT_PROCESSING_FAILED\", {\n cause: error instanceof Error ? error.message : String(error),\n });\n },\n });\n\n return new Uint8Array(mergedBytes);\n });\n },\n }),\n);\n\nexport const PdfLibDocumentPluginLive = pdfLibDocumentPlugin;\n","/**\n * PDF MIME type constant\n */\nexport const PDF_MIME_TYPE = \"application/pdf\";\n\n/**\n * PDF file extension\n */\nexport const PDF_EXTENSION = \".pdf\";\n\n/**\n * Get MIME type for PDF format\n */\nexport function getPdfMimeType(): string {\n return PDF_MIME_TYPE;\n}\n\n/**\n * Get file extension for PDF format\n */\nexport function getPdfExtension(): string {\n return PDF_EXTENSION;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.mjs","names":["pdfs: Uint8Array[]","newPdf","pdfBytes"],"sources":["../src/document-plugin.ts","../src/utils/format-mappings.ts"],"sourcesContent":["import { UploadistaError } from \"@uploadista/core/errors\";\nimport {\n type DocumentMetadata,\n DocumentPlugin,\n type SplitPdfResult,\n} from \"@uploadista/core/flow\";\nimport { withOperationSpan } from \"@uploadista/observability\";\nimport { Effect, Layer } from \"effect\";\nimport { PDFDocument } from \"pdf-lib\";\n\n/**\n * Helper to parse date from PDF date string format\n */\nfunction parsePdfDate(dateStr: string | undefined): string | null {\n if (!dateStr) return null;\n try {\n // PDF date format: D:YYYYMMDDHHmmSSOHH'mm'\n // Example: D:20230101120000Z\n const match = dateStr.match(\n /D:(\\d{4})(\\d{2})(\\d{2})(\\d{2})?(\\d{2})?(\\d{2})?/,\n );\n if (!match) return null;\n\n const [, year, month, day, hour = \"00\", minute = \"00\", second = \"00\"] =\n match;\n const date = new Date(\n `${year}-${month}-${day}T${hour}:${minute}:${second}Z`,\n );\n return date.toISOString();\n } catch {\n return null;\n }\n}\n\nexport const pdfLibDocumentPlugin = Layer.succeed(\n DocumentPlugin,\n DocumentPlugin.of({\n extractText: (_input) => {\n return Effect.gen(function* () {\n // pdf-lib has very limited text extraction capabilities\n // Return an error indicating that unpdf should be used instead\n return yield* UploadistaError.fromCode(\"DOCUMENT_PROCESSING_FAILED\", {\n cause:\n \"pdf-lib does not support text extraction. Use @uploadista/flow-documents-unpdf instead.\",\n }).toEffect();\n });\n },\n\n getMetadata: (input) => {\n return Effect.gen(function* () {\n const pdfDoc = yield* Effect.tryPromise({\n try: async () =>\n await PDFDocument.load(input, { ignoreEncryption: false }),\n catch: (error) => {\n const errorMessage =\n error instanceof Error ? error.message : String(error);\n\n if (errorMessage.toLowerCase().includes(\"encrypt\")) {\n return UploadistaError.fromCode(\"PDF_ENCRYPTED\", {\n cause: errorMessage,\n });\n }\n\n if (\n errorMessage.toLowerCase().includes(\"corrupt\") ||\n errorMessage.toLowerCase().includes(\"invalid\")\n ) {\n return UploadistaError.fromCode(\"PDF_CORRUPTED\", {\n cause: errorMessage,\n });\n }\n\n return UploadistaError.fromCode(\"DOCUMENT_PROCESSING_FAILED\", {\n cause: errorMessage,\n });\n },\n });\n\n const pageCount = pdfDoc.getPageCount();\n const author = pdfDoc.getAuthor() || null;\n const title = pdfDoc.getTitle() || null;\n const subject = pdfDoc.getSubject() || null;\n const creator = pdfDoc.getCreator() || null;\n const creationDateStr = pdfDoc.getCreationDate();\n const modificationDateStr = pdfDoc.getModificationDate();\n\n const creationDate = creationDateStr\n ? parsePdfDate(creationDateStr.toString())\n : null;\n const modifiedDate = modificationDateStr\n ? parsePdfDate(modificationDateStr.toString())\n : null;\n\n const metadata: DocumentMetadata = {\n pageCount,\n format: \"pdf\",\n author,\n title,\n subject,\n creator,\n creationDate,\n modifiedDate,\n fileSize: input.byteLength,\n };\n\n return metadata;\n }).pipe(\n withOperationSpan(\"document\", \"get-metadata\", {\n \"document.input_size\": input.byteLength,\n }),\n );\n },\n\n splitPdf: (input, options) => {\n return Effect.gen(function* () {\n const pdfDoc = yield* Effect.tryPromise({\n try: async () =>\n await PDFDocument.load(input, { ignoreEncryption: false }),\n catch: (error) => {\n const errorMessage =\n error instanceof Error ? error.message : String(error);\n\n if (errorMessage.toLowerCase().includes(\"encrypt\")) {\n return UploadistaError.fromCode(\"PDF_ENCRYPTED\", {\n cause: errorMessage,\n });\n }\n\n return UploadistaError.fromCode(\"DOCUMENT_PROCESSING_FAILED\", {\n cause: errorMessage,\n });\n },\n });\n\n const totalPages = pdfDoc.getPageCount();\n\n if (options.mode === \"individual\") {\n // Split into individual pages\n const pdfs: Uint8Array[] = [];\n\n for (let i = 0; i < totalPages; i++) {\n const newPdf = yield* Effect.tryPromise({\n try: async () => await PDFDocument.create(),\n catch: (error) => {\n return UploadistaError.fromCode(\"DOCUMENT_PROCESSING_FAILED\", {\n cause: error instanceof Error ? error.message : String(error),\n });\n },\n });\n\n const [copiedPage] = yield* Effect.tryPromise({\n try: async () => await newPdf.copyPages(pdfDoc, [i]),\n catch: (error) => {\n return UploadistaError.fromCode(\"DOCUMENT_PROCESSING_FAILED\", {\n cause: error instanceof Error ? error.message : String(error),\n });\n },\n });\n\n newPdf.addPage(copiedPage);\n\n const pdfBytes = yield* Effect.tryPromise({\n try: async () => await newPdf.save(),\n catch: (error) => {\n return UploadistaError.fromCode(\"DOCUMENT_PROCESSING_FAILED\", {\n cause: error instanceof Error ? error.message : String(error),\n });\n },\n });\n\n pdfs.push(new Uint8Array(pdfBytes));\n }\n\n const result: SplitPdfResult = {\n mode: \"individual\",\n pdfs,\n };\n\n return result;\n }\n\n // Range mode\n if (!options.startPage || !options.endPage) {\n return yield* UploadistaError.fromCode(\"PAGE_RANGE_INVALID\", {\n cause: \"startPage and endPage are required for range mode\",\n }).toEffect();\n }\n\n // Validate page range (1-indexed)\n if (\n options.startPage < 1 ||\n options.endPage > totalPages ||\n options.startPage > options.endPage\n ) {\n return yield* UploadistaError.fromCode(\"PAGE_RANGE_INVALID\", {\n cause: `Invalid page range: ${options.startPage}-${options.endPage}. Document has ${totalPages} pages.`,\n }).toEffect();\n }\n\n const newPdf = yield* Effect.tryPromise({\n try: async () => await PDFDocument.create(),\n catch: (error) => {\n return UploadistaError.fromCode(\"DOCUMENT_PROCESSING_FAILED\", {\n cause: error instanceof Error ? error.message : String(error),\n });\n },\n });\n\n // Convert from 1-indexed to 0-indexed\n const pageIndices = Array.from(\n { length: options.endPage - options.startPage + 1 },\n (_, i) => (options.startPage ?? 1) - 1 + i,\n );\n\n const copiedPages = yield* Effect.tryPromise({\n try: async () => await newPdf.copyPages(pdfDoc, pageIndices),\n catch: (error) => {\n return UploadistaError.fromCode(\"DOCUMENT_PROCESSING_FAILED\", {\n cause: error instanceof Error ? error.message : String(error),\n });\n },\n });\n\n for (const page of copiedPages) {\n newPdf.addPage(page);\n }\n\n const pdfBytes = yield* Effect.tryPromise({\n try: async () => await newPdf.save(),\n catch: (error) => {\n return UploadistaError.fromCode(\"DOCUMENT_PROCESSING_FAILED\", {\n cause: error instanceof Error ? error.message : String(error),\n });\n },\n });\n\n const result: SplitPdfResult = {\n mode: \"range\",\n pdf: new Uint8Array(pdfBytes),\n };\n\n return result;\n }).pipe(\n withOperationSpan(\"document\", \"split-pdf\", {\n \"document.mode\": options.mode,\n \"document.start_page\": options.startPage,\n \"document.end_page\": options.endPage,\n \"document.input_size\": input.byteLength,\n }),\n );\n },\n\n mergePdfs: (options) => {\n return Effect.gen(function* () {\n if (options.pdfs.length === 0) {\n return yield* UploadistaError.fromCode(\"DOCUMENT_PROCESSING_FAILED\", {\n cause: \"At least one PDF is required for merging\",\n }).toEffect();\n }\n\n if (options.pdfs.length === 1) {\n // Single PDF, just return it\n yield* Effect.logWarning(\n \"Only one PDF provided for merging, returning original\",\n );\n return options.pdfs[0];\n }\n\n const mergedPdf = yield* Effect.tryPromise({\n try: async () => await PDFDocument.create(),\n catch: (error) => {\n return UploadistaError.fromCode(\"DOCUMENT_PROCESSING_FAILED\", {\n cause: error instanceof Error ? error.message : String(error),\n });\n },\n });\n\n for (const pdfBytes of options.pdfs) {\n const pdf = yield* Effect.tryPromise({\n try: async () =>\n await PDFDocument.load(pdfBytes, { ignoreEncryption: false }),\n catch: (error) => {\n const errorMessage =\n error instanceof Error ? error.message : String(error);\n\n if (errorMessage.toLowerCase().includes(\"encrypt\")) {\n return UploadistaError.fromCode(\"PDF_ENCRYPTED\", {\n cause: errorMessage,\n });\n }\n\n return UploadistaError.fromCode(\"DOCUMENT_PROCESSING_FAILED\", {\n cause: errorMessage,\n });\n },\n });\n\n const pageCount = pdf.getPageCount();\n const pageIndices = Array.from({ length: pageCount }, (_, i) => i);\n\n const copiedPages = yield* Effect.tryPromise({\n try: async () => await mergedPdf.copyPages(pdf, pageIndices),\n catch: (error) => {\n return UploadistaError.fromCode(\"DOCUMENT_PROCESSING_FAILED\", {\n cause: error instanceof Error ? error.message : String(error),\n });\n },\n });\n\n for (const page of copiedPages) {\n mergedPdf.addPage(page);\n }\n }\n\n const mergedBytes = yield* Effect.tryPromise({\n try: async () => await mergedPdf.save(),\n catch: (error) => {\n return UploadistaError.fromCode(\"DOCUMENT_PROCESSING_FAILED\", {\n cause: error instanceof Error ? error.message : String(error),\n });\n },\n });\n\n return new Uint8Array(mergedBytes);\n }).pipe(\n withOperationSpan(\"document\", \"merge-pdfs\", {\n \"document.input_count\": options.pdfs.length,\n }),\n );\n },\n }),\n);\n\nexport const PdfLibDocumentPluginLive = pdfLibDocumentPlugin;\n","/**\n * PDF MIME type constant\n */\nexport const PDF_MIME_TYPE = \"application/pdf\";\n\n/**\n * PDF file extension\n */\nexport const PDF_EXTENSION = \".pdf\";\n\n/**\n * Get MIME type for PDF format\n */\nexport function getPdfMimeType(): string {\n return PDF_MIME_TYPE;\n}\n\n/**\n * Get file extension for PDF format\n */\nexport function getPdfExtension(): string {\n return PDF_EXTENSION;\n}\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@uploadista/flow-documents-pdflib",
3
3
  "type": "module",
4
- "version": "0.0.18-beta.8",
4
+ "version": "0.0.18",
5
5
  "description": "pdf-lib plugin for Uploadista document processing",
6
6
  "license": "MIT",
7
7
  "author": "Uploadista",
@@ -15,7 +15,7 @@
15
15
  },
16
16
  "dependencies": {
17
17
  "pdf-lib": "^1.17.1",
18
- "@uploadista/core": "0.0.18-beta.8"
18
+ "@uploadista/core": "0.0.18"
19
19
  },
20
20
  "peerDependencies": {
21
21
  "effect": "^3.0.0"
@@ -25,8 +25,8 @@
25
25
  "@types/node": "24.10.1",
26
26
  "effect": "3.19.8",
27
27
  "tsdown": "0.16.8",
28
- "vitest": "4.0.14",
29
- "@uploadista/typescript-config": "0.0.18-beta.8"
28
+ "vitest": "4.0.15",
29
+ "@uploadista/typescript-config": "0.0.18"
30
30
  },
31
31
  "scripts": {
32
32
  "build": "tsdown",
@@ -4,6 +4,7 @@ import {
4
4
  DocumentPlugin,
5
5
  type SplitPdfResult,
6
6
  } from "@uploadista/core/flow";
7
+ import { withOperationSpan } from "@uploadista/observability";
7
8
  import { Effect, Layer } from "effect";
8
9
  import { PDFDocument } from "pdf-lib";
9
10
 
@@ -103,7 +104,11 @@ export const pdfLibDocumentPlugin = Layer.succeed(
103
104
  };
104
105
 
105
106
  return metadata;
106
- });
107
+ }).pipe(
108
+ withOperationSpan("document", "get-metadata", {
109
+ "document.input_size": input.byteLength,
110
+ }),
111
+ );
107
112
  },
108
113
 
109
114
  splitPdf: (input, options) => {
@@ -235,7 +240,14 @@ export const pdfLibDocumentPlugin = Layer.succeed(
235
240
  };
236
241
 
237
242
  return result;
238
- });
243
+ }).pipe(
244
+ withOperationSpan("document", "split-pdf", {
245
+ "document.mode": options.mode,
246
+ "document.start_page": options.startPage,
247
+ "document.end_page": options.endPage,
248
+ "document.input_size": input.byteLength,
249
+ }),
250
+ );
239
251
  },
240
252
 
241
253
  mergePdfs: (options) => {
@@ -310,7 +322,11 @@ export const pdfLibDocumentPlugin = Layer.succeed(
310
322
  });
311
323
 
312
324
  return new Uint8Array(mergedBytes);
313
- });
325
+ }).pipe(
326
+ withOperationSpan("document", "merge-pdfs", {
327
+ "document.input_count": options.pdfs.length,
328
+ }),
329
+ );
314
330
  },
315
331
  }),
316
332
  );