@uploadista/flow-documents-pdflib 0.0.20 → 0.1.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.
@@ -1,15 +1,14 @@
1
1
 
2
- > @uploadista/flow-documents-pdflib@0.0.20-beta.9 build /Users/denislaboureyras/Documents/uploadista/dev/uploadista-workspace/uploadista-sdk/packages/flow/documents/pdflib
2
+ > @uploadista/flow-documents-pdflib@0.1.0 build /home/runner/work/uploadista-sdk/uploadista-sdk/packages/flow/documents/pdflib
3
3
  > tsc --noEmit && tsdown
4
4
 
5
- ℹ tsdown v0.18.0 powered by rolldown v1.0.0-beta.53
5
+ ℹ tsdown v0.19.0 powered by rolldown v1.0.0-beta.59
6
6
  ℹ entry: src/index.ts
7
7
  ℹ tsconfig: tsconfig.json
8
8
  ℹ Build start
9
- ℹ Cleaning 4 files
10
9
  ℹ dist/index.mjs  8.68 kB │ gzip: 1.99 kB
11
- ℹ dist/index.mjs.map 17.07 kB │ gzip: 3.74 kB
10
+ ℹ dist/index.mjs.map 17.05 kB │ gzip: 3.73 kB
12
11
  ℹ dist/index.d.mts.map  0.33 kB │ gzip: 0.23 kB
13
12
  ℹ dist/index.d.mts  0.83 kB │ gzip: 0.37 kB
14
- ℹ 4 files, total: 26.91 kB
15
- ✔ Build complete in 10776ms
13
+ ℹ 4 files, total: 26.89 kB
14
+ ✔ Build complete in 31360ms
@@ -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 { 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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"}
1
+ {"version":3,"file":"index.mjs","names":["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.20",
4
+ "version": "0.1.0",
5
5
  "description": "pdf-lib plugin for Uploadista document processing",
6
6
  "license": "MIT",
7
7
  "author": "Uploadista",
@@ -15,19 +15,19 @@
15
15
  },
16
16
  "dependencies": {
17
17
  "pdf-lib": "^1.17.1",
18
- "@uploadista/core": "0.0.20",
19
- "@uploadista/observability": "0.0.20"
18
+ "@uploadista/core": "0.1.0",
19
+ "@uploadista/observability": "0.1.0"
20
20
  },
21
21
  "peerDependencies": {
22
22
  "effect": "^3.0.0"
23
23
  },
24
24
  "devDependencies": {
25
25
  "@effect/vitest": "0.27.0",
26
- "@types/node": "24.10.4",
27
- "effect": "3.19.12",
28
- "tsdown": "0.18.0",
29
- "vitest": "4.0.15",
30
- "@uploadista/typescript-config": "0.0.20"
26
+ "@types/node": "24.10.8",
27
+ "effect": "3.19.14",
28
+ "tsdown": "0.19.0",
29
+ "vitest": "4.0.17",
30
+ "@uploadista/typescript-config": "0.1.0"
31
31
  },
32
32
  "scripts": {
33
33
  "build": "tsc --noEmit && tsdown",
package/src/index.ts CHANGED
@@ -1,2 +1,5 @@
1
- export { pdfLibDocumentPlugin, PdfLibDocumentPluginLive } from "./document-plugin";
1
+ export {
2
+ PdfLibDocumentPluginLive,
3
+ pdfLibDocumentPlugin,
4
+ } from "./document-plugin";
2
5
  export * from "./utils/format-mappings";