@uploadista/flow-documents-nodes 0.0.17-beta.2 → 0.0.17-beta.4
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/.turbo/turbo-build.log +17 -17
- package/dist/{index-DN0piYEv.d.cts → index-CN8GG19X.d.cts} +3 -3
- package/dist/{index-DN0piYEv.d.cts.map → index-CN8GG19X.d.cts.map} +1 -1
- package/dist/{index-aD9vy0kH.d.mts → index-DXwYQF9t.d.mts} +3 -3
- package/dist/{index-aD9vy0kH.d.mts.map → index-DXwYQF9t.d.mts.map} +1 -1
- package/dist/index.cjs +2 -2
- package/dist/index.d.cts +14 -6
- package/dist/index.d.cts.map +1 -1
- package/dist/index.d.mts +14 -6
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs +2 -2
- package/dist/index.mjs.map +1 -1
- package/dist/types/index.d.cts +1 -1
- package/dist/types/index.d.mts +1 -1
- package/package.json +3 -3
- package/src/convert-to-markdown-node.ts +2 -0
- package/src/describe-document-node.ts +5 -2
- package/src/extract-text-node.ts +5 -2
- package/src/merge-pdf-node.ts +3 -1
- package/src/ocr-node.ts +2 -0
- package/src/split-pdf-node.ts +2 -0
package/.turbo/turbo-build.log
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
|
|
2
2
|
|
|
3
|
-
> @uploadista/flow-documents-nodes@0.0.17-beta.
|
|
3
|
+
> @uploadista/flow-documents-nodes@0.0.17-beta.3 build /Users/denislaboureyras/Documents/uploadista/dev/uploadista-workspace/uploadista-sdk/packages/flow/documents/nodes
|
|
4
4
|
> tsdown
|
|
5
5
|
|
|
6
6
|
[34mℹ[39m tsdown [2mv0.16.5[22m powered by rolldown [2mv1.0.0-beta.50[22m
|
|
@@ -9,25 +9,25 @@
|
|
|
9
9
|
[34mℹ[39m tsconfig: [34mtsconfig.json[39m
|
|
10
10
|
[34mℹ[39m Build start
|
|
11
11
|
[34mℹ[39m Cleaning 19 files
|
|
12
|
-
[34mℹ[39m [33m[CJS][39m [2mdist/[22m[1mindex.cjs[22m [2m10.
|
|
12
|
+
[34mℹ[39m [33m[CJS][39m [2mdist/[22m[1mindex.cjs[22m [2m10.49 kB[22m [2m│ gzip: 2.50 kB[22m
|
|
13
13
|
[34mℹ[39m [33m[CJS][39m [2mdist/[22m[1mtypes/index.cjs[22m [2m 0.25 kB[22m [2m│ gzip: 0.15 kB[22m
|
|
14
14
|
[34mℹ[39m [33m[CJS][39m [2mdist/[22mtypes-CdmvDfq8.cjs [2m 1.09 kB[22m [2m│ gzip: 0.36 kB[22m
|
|
15
|
-
[34mℹ[39m [33m[CJS][39m 3 files, total: 11.
|
|
16
|
-
[34mℹ[39m [34m[ESM][39m [2mdist/[22m[1mindex.mjs[22m [2m 9.
|
|
15
|
+
[34mℹ[39m [33m[CJS][39m 3 files, total: 11.83 kB
|
|
16
|
+
[34mℹ[39m [34m[ESM][39m [2mdist/[22m[1mindex.mjs[22m [2m 9.27 kB[22m [2m│ gzip: 2.57 kB[22m
|
|
17
17
|
[34mℹ[39m [34m[ESM][39m [2mdist/[22m[1mtypes/index.mjs[22m [2m 0.25 kB[22m [2m│ gzip: 0.17 kB[22m
|
|
18
|
-
[34mℹ[39m [34m[ESM][39m [2mdist/[22mindex.mjs.map [2m33.
|
|
19
|
-
[34mℹ[39m [34m[ESM][39m [2mdist/[22mindex.d.mts.map [2m 6.
|
|
18
|
+
[34mℹ[39m [34m[ESM][39m [2mdist/[22mindex.mjs.map [2m33.82 kB[22m [2m│ gzip: 5.79 kB[22m
|
|
19
|
+
[34mℹ[39m [34m[ESM][39m [2mdist/[22mindex.d.mts.map [2m 6.28 kB[22m [2m│ gzip: 0.95 kB[22m
|
|
20
20
|
[34mℹ[39m [34m[ESM][39m [2mdist/[22mtypes-rDFmPO7S.mjs.map [2m 2.57 kB[22m [2m│ gzip: 0.77 kB[22m
|
|
21
|
-
[34mℹ[39m [34m[ESM][39m [2mdist/[22mindex-
|
|
21
|
+
[34mℹ[39m [34m[ESM][39m [2mdist/[22mindex-DXwYQF9t.d.mts.map [2m 1.02 kB[22m [2m│ gzip: 0.46 kB[22m
|
|
22
22
|
[34mℹ[39m [34m[ESM][39m [2mdist/[22mtypes-rDFmPO7S.mjs [2m 0.70 kB[22m [2m│ gzip: 0.35 kB[22m
|
|
23
|
-
[34mℹ[39m [34m[ESM][39m [2mdist/[22m[32m[1mindex.d.mts[22m[39m [2m31.
|
|
23
|
+
[34mℹ[39m [34m[ESM][39m [2mdist/[22m[32m[1mindex.d.mts[22m[39m [2m31.85 kB[22m [2m│ gzip: 1.74 kB[22m
|
|
24
24
|
[34mℹ[39m [34m[ESM][39m [2mdist/[22m[32m[1mtypes/index.d.mts[22m[39m [2m 0.63 kB[22m [2m│ gzip: 0.24 kB[22m
|
|
25
|
-
[34mℹ[39m [34m[ESM][39m [2mdist/[22m[32mindex-
|
|
26
|
-
[34mℹ[39m [34m[ESM][39m 10 files, total: 88.
|
|
27
|
-
[34mℹ[39m [33m[CJS][39m [2mdist/[22mindex.d.cts.map [2m 6.
|
|
28
|
-
[34mℹ[39m [33m[CJS][39m [2mdist/[22mindex-
|
|
29
|
-
[34mℹ[39m [33m[CJS][39m [2mdist/[22m[32m[1mindex.d.cts[22m[39m [2m31.
|
|
30
|
-
[34mℹ[39m [33m[CJS][39m [2mdist/[22m[32m[1mtypes/index.d.cts[22m[39m [2m 0.63 kB[22m [2m│ gzip: 0.
|
|
31
|
-
[34mℹ[39m [33m[CJS][39m [2mdist/[22m[32mindex-
|
|
32
|
-
[34mℹ[39m [33m[CJS][39m 5 files, total: 42.
|
|
33
|
-
[32m✔[39m Build complete in [
|
|
25
|
+
[34mℹ[39m [34m[ESM][39m [2mdist/[22m[32mindex-DXwYQF9t.d.mts[39m [2m 2.33 kB[22m [2m│ gzip: 0.64 kB[22m
|
|
26
|
+
[34mℹ[39m [34m[ESM][39m 10 files, total: 88.72 kB
|
|
27
|
+
[34mℹ[39m [33m[CJS][39m [2mdist/[22mindex.d.cts.map [2m 6.28 kB[22m [2m│ gzip: 0.95 kB[22m
|
|
28
|
+
[34mℹ[39m [33m[CJS][39m [2mdist/[22mindex-CN8GG19X.d.cts.map [2m 1.02 kB[22m [2m│ gzip: 0.46 kB[22m
|
|
29
|
+
[34mℹ[39m [33m[CJS][39m [2mdist/[22m[32m[1mindex.d.cts[22m[39m [2m31.85 kB[22m [2m│ gzip: 1.74 kB[22m
|
|
30
|
+
[34mℹ[39m [33m[CJS][39m [2mdist/[22m[32m[1mtypes/index.d.cts[22m[39m [2m 0.63 kB[22m [2m│ gzip: 0.24 kB[22m
|
|
31
|
+
[34mℹ[39m [33m[CJS][39m [2mdist/[22m[32mindex-CN8GG19X.d.cts[39m [2m 2.33 kB[22m [2m│ gzip: 0.64 kB[22m
|
|
32
|
+
[34mℹ[39m [33m[CJS][39m 5 files, total: 42.11 kB
|
|
33
|
+
[32m✔[39m Build complete in [32m1670ms[39m
|
|
@@ -4,8 +4,8 @@ import { z } from "zod";
|
|
|
4
4
|
declare const convertToMarkdownParamsSchema: z.ZodObject<{
|
|
5
5
|
credentialId: z.ZodOptional<z.ZodString>;
|
|
6
6
|
resolution: z.ZodOptional<z.ZodEnum<{
|
|
7
|
-
tiny: "tiny";
|
|
8
7
|
small: "small";
|
|
8
|
+
tiny: "tiny";
|
|
9
9
|
base: "base";
|
|
10
10
|
gundam: "gundam";
|
|
11
11
|
large: "large";
|
|
@@ -36,8 +36,8 @@ declare const ocrParamsSchema: z.ZodObject<{
|
|
|
36
36
|
locateObject: "locateObject";
|
|
37
37
|
}>;
|
|
38
38
|
resolution: z.ZodOptional<z.ZodEnum<{
|
|
39
|
-
tiny: "tiny";
|
|
40
39
|
small: "small";
|
|
40
|
+
tiny: "tiny";
|
|
41
41
|
base: "base";
|
|
42
42
|
gundam: "gundam";
|
|
43
43
|
large: "large";
|
|
@@ -59,4 +59,4 @@ declare const splitPdfParamsSchema: z.ZodObject<{
|
|
|
59
59
|
type SplitPdfParams = z.infer<typeof splitPdfParamsSchema>;
|
|
60
60
|
//#endregion
|
|
61
61
|
export { MergePdfParams as a, extractTextParamsSchema as c, ConvertToMarkdownParams as d, convertToMarkdownParamsSchema as f, ocrParamsSchema as i, DescribeDocumentParams as l, splitPdfParamsSchema as n, mergePdfParamsSchema as o, OcrParams as r, ExtractTextParams as s, SplitPdfParams as t, describeDocumentParamsSchema as u };
|
|
62
|
-
//# sourceMappingURL=index-
|
|
62
|
+
//# sourceMappingURL=index-CN8GG19X.d.cts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index-
|
|
1
|
+
{"version":3,"file":"index-CN8GG19X.d.cts","names":[],"sources":["../src/types/convert-to-markdown-node.ts","../src/types/describe-document-node.ts","../src/types/extract-text-node.ts","../src/types/merge-pdf-node.ts","../src/types/ocr-node.ts","../src/types/split-pdf-node.ts"],"sourcesContent":[],"mappings":";;;cAEa,+BAA6B,CAAA,CAAA;;EAA7B,UAAA,eAAA,UAKX,CAAA;;;;;;EALwC,CAAA,CAAA,CAAA;CAAA,eAAA,CAAA;AAO9B,KAAA,uBAAA,GAA0B,CAAA,CAAE,KAC/B,CAAA,OAAA,6BADoC,CAAA;;;cCPhC,8BAA4B,CAAA,CAAA,cAAA,CAAA,CAAA,IAAA,CAAA;KAE7B,sBAAA,GAAyB,CAAA,CAAE,aAC9B;;;cCHI,yBAAuB,CAAA,CAAA,cAAA,CAAA,CAAA,IAAA,CAAA;KAExB,iBAAA,GAAoB,CAAA,CAAE,aAAa;;;cCFlC,sBAAoB,CAAA,CAAA;;AHAjC,CAAA,eAAa,CAAA;KGID,cAAA,GAAiB,CAAA,CAAE,aAAa;;;cCJ/B,iBAAe,CAAA,CAAA;;IJAf,iBAAA,EAAA,mBAKX;;;;;;IALwC,KAAA,EAAA,OAAA;IAAA,IAAA,EAAA,MAAA;IAO9B,IAAA,EAAA,MAAA;;;;ECPC,YAAA,eAAA,YAA2C,CAAA;EAE5C,aAAA,eAAsB,YACzB,CAAA;;KGWG,SAAA,GAAY,CAAA,CAAE,aAAa;;;cCd1B,sBAAoB,CAAA,CAAA;;ILApB,KAAA,EAAA,OAAA;;;;;;AAA6B,KKM9B,cAAA,GAAiB,CAAA,CAAE,KLNW,CAAA,OKME,oBLNF,CAAA"}
|
|
@@ -4,8 +4,8 @@ import { z } from "zod";
|
|
|
4
4
|
declare const convertToMarkdownParamsSchema: z.ZodObject<{
|
|
5
5
|
credentialId: z.ZodOptional<z.ZodString>;
|
|
6
6
|
resolution: z.ZodOptional<z.ZodEnum<{
|
|
7
|
-
tiny: "tiny";
|
|
8
7
|
small: "small";
|
|
8
|
+
tiny: "tiny";
|
|
9
9
|
base: "base";
|
|
10
10
|
gundam: "gundam";
|
|
11
11
|
large: "large";
|
|
@@ -36,8 +36,8 @@ declare const ocrParamsSchema: z.ZodObject<{
|
|
|
36
36
|
locateObject: "locateObject";
|
|
37
37
|
}>;
|
|
38
38
|
resolution: z.ZodOptional<z.ZodEnum<{
|
|
39
|
-
tiny: "tiny";
|
|
40
39
|
small: "small";
|
|
40
|
+
tiny: "tiny";
|
|
41
41
|
base: "base";
|
|
42
42
|
gundam: "gundam";
|
|
43
43
|
large: "large";
|
|
@@ -59,4 +59,4 @@ declare const splitPdfParamsSchema: z.ZodObject<{
|
|
|
59
59
|
type SplitPdfParams = z.infer<typeof splitPdfParamsSchema>;
|
|
60
60
|
//#endregion
|
|
61
61
|
export { MergePdfParams as a, extractTextParamsSchema as c, ConvertToMarkdownParams as d, convertToMarkdownParamsSchema as f, ocrParamsSchema as i, DescribeDocumentParams as l, splitPdfParamsSchema as n, mergePdfParamsSchema as o, OcrParams as r, ExtractTextParams as s, SplitPdfParams as t, describeDocumentParamsSchema as u };
|
|
62
|
-
//# sourceMappingURL=index-
|
|
62
|
+
//# sourceMappingURL=index-DXwYQF9t.d.mts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index-
|
|
1
|
+
{"version":3,"file":"index-DXwYQF9t.d.mts","names":[],"sources":["../src/types/convert-to-markdown-node.ts","../src/types/describe-document-node.ts","../src/types/extract-text-node.ts","../src/types/merge-pdf-node.ts","../src/types/ocr-node.ts","../src/types/split-pdf-node.ts"],"sourcesContent":[],"mappings":";;;cAEa,+BAA6B,CAAA,CAAA;;EAA7B,UAAA,eAAA,UAKX,CAAA;;;;;;EALwC,CAAA,CAAA,CAAA;CAAA,eAAA,CAAA;AAO9B,KAAA,uBAAA,GAA0B,CAAA,CAAE,KAC/B,CAAA,OAAA,6BADoC,CAAA;;;cCPhC,8BAA4B,CAAA,CAAA,cAAA,CAAA,CAAA,IAAA,CAAA;KAE7B,sBAAA,GAAyB,CAAA,CAAE,aAC9B;;;cCHI,yBAAuB,CAAA,CAAA,cAAA,CAAA,CAAA,IAAA,CAAA;KAExB,iBAAA,GAAoB,CAAA,CAAE,aAAa;;;cCFlC,sBAAoB,CAAA,CAAA;;AHAjC,CAAA,eAAa,CAAA;KGID,cAAA,GAAiB,CAAA,CAAE,aAAa;;;cCJ/B,iBAAe,CAAA,CAAA;;IJAf,iBAAA,EAAA,mBAKX;;;;;;IALwC,KAAA,EAAA,OAAA;IAAA,IAAA,EAAA,MAAA;IAO9B,IAAA,EAAA,MAAA;;;;ECPC,YAAA,eAAA,YAA2C,CAAA;EAE5C,aAAA,eAAsB,YACzB,CAAA;;KGWG,SAAA,GAAY,CAAA,CAAE,aAAa;;;cCd1B,sBAAoB,CAAA,CAAA;;ILApB,KAAA,EAAA,OAAA;;;;;;AAA6B,KKM9B,cAAA,GAAiB,CAAA,CAAE,KLNW,CAAA,OKME,oBLNF,CAAA"}
|
package/dist/index.cjs
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
const e=require(`./types-CdmvDfq8.cjs`);let t=require(`@uploadista/core/errors`),n=require(`@uploadista/core/flow`),r=require(`@uploadista/core/types`),i=require(`@uploadista/core/upload`),a=require(`effect`),o=require(`zod`);function s(e,o={}){return a.Effect.gen(function*(){let s=yield*n.DocumentPlugin,c=yield*n.DocumentAiPlugin,l=yield*i.UploadServer;return yield*(0,n.createFlowNode)({id:e,name:`Convert to Markdown`,description:`Convert documents to Markdown format (intelligently uses OCR if needed)`,type:n.NodeType.process,nodeTypeId:n.STORAGE_OUTPUT_TYPE_ID,inputSchema:r.uploadFileSchema,outputSchema:r.uploadFileSchema,run:({data:r,flowId:i,jobId:u,clientId:d})=>a.Effect.gen(function*(){let f={flowId:i,nodeId:e,jobId:u};yield*a.Effect.logInfo(`Converting file ${r.id} to Markdown`);let p=yield*l.read(r.id,d),m=yield*s.extractText(p).pipe(a.Effect.either),h,g;if(a.Either.isRight(m)&&m.right.trim().length>0){let e=m.right;yield*a.Effect.logInfo(`Successfully extracted ${e.length} characters from searchable PDF`),h=e.split(`
|
|
1
|
+
const e=require(`./types-CdmvDfq8.cjs`);let t=require(`@uploadista/core/errors`),n=require(`@uploadista/core/flow`),r=require(`@uploadista/core/types`),i=require(`@uploadista/core/upload`),a=require(`effect`),o=require(`zod`);function s(e,o={}){return a.Effect.gen(function*(){let s=yield*n.DocumentPlugin,c=yield*n.DocumentAiPlugin,l=yield*i.UploadServer;return yield*(0,n.createFlowNode)({id:e,name:`Convert to Markdown`,description:`Convert documents to Markdown format (intelligently uses OCR if needed)`,type:n.NodeType.process,nodeTypeId:n.STORAGE_OUTPUT_TYPE_ID,keepOutput:o.keepOutput,inputSchema:r.uploadFileSchema,outputSchema:r.uploadFileSchema,run:({data:r,flowId:i,jobId:u,clientId:d})=>a.Effect.gen(function*(){let f={flowId:i,nodeId:e,jobId:u};yield*a.Effect.logInfo(`Converting file ${r.id} to Markdown`);let p=yield*l.read(r.id,d),m=yield*s.extractText(p).pipe(a.Effect.either),h,g;if(a.Either.isRight(m)&&m.right.trim().length>0){let e=m.right;yield*a.Effect.logInfo(`Successfully extracted ${e.length} characters from searchable PDF`),h=e.split(`
|
|
2
2
|
|
|
3
3
|
`).map(e=>e.trim()).filter(e=>e.length>0).join(`
|
|
4
4
|
|
|
5
|
-
`),g=`text`,yield*a.Effect.logInfo(`Converted text to Markdown (${h.length} characters)`)}else{yield*a.Effect.logInfo(`Text extraction failed or returned empty, falling back to OCR`);let e=r.url;if(!e)return yield*t.UploadistaError.fromCode(`FLOW_NODE_ERROR`,{cause:`URL is required for OCR-based markdown conversion`}).toEffect();let n={clientId:d,credentialId:o.credentialId};h=(yield*c.performOCR(e,{taskType:`convertToMarkdown`,resolution:o.resolution||`gundam`},n).pipe(a.Effect.catchAll(e=>a.Effect.gen(function*(){return yield*a.Effect.logError(`Failed to perform OCR`,e),yield*t.UploadistaError.fromCode(`FLOW_NODE_ERROR`,{cause:e instanceof Error?e.message:`Failed to perform OCR for markdown conversion`}).toEffect()})))).extractedText,g=`ocr`,yield*a.Effect.logInfo(`Successfully converted scanned document to Markdown using OCR (${h.length} characters)`)}let{metadata:_}=(0,n.resolveUploadMetadata)(r.metadata),v={...r.metadata,..._,markdown:h,markdownSource:g};return yield*a.Effect.logInfo(`Successfully converted file ${r.id} to Markdown via ${g}`),(0,n.completeNodeExecution)({...r,metadata:v,flow:f})})})})}function c(e,o={}){return a.Effect.gen(function*(){let
|
|
5
|
+
`),g=`text`,yield*a.Effect.logInfo(`Converted text to Markdown (${h.length} characters)`)}else{yield*a.Effect.logInfo(`Text extraction failed or returned empty, falling back to OCR`);let e=r.url;if(!e)return yield*t.UploadistaError.fromCode(`FLOW_NODE_ERROR`,{cause:`URL is required for OCR-based markdown conversion`}).toEffect();let n={clientId:d,credentialId:o.credentialId};h=(yield*c.performOCR(e,{taskType:`convertToMarkdown`,resolution:o.resolution||`gundam`},n).pipe(a.Effect.catchAll(e=>a.Effect.gen(function*(){return yield*a.Effect.logError(`Failed to perform OCR`,e),yield*t.UploadistaError.fromCode(`FLOW_NODE_ERROR`,{cause:e instanceof Error?e.message:`Failed to perform OCR for markdown conversion`}).toEffect()})))).extractedText,g=`ocr`,yield*a.Effect.logInfo(`Successfully converted scanned document to Markdown using OCR (${h.length} characters)`)}let{metadata:_}=(0,n.resolveUploadMetadata)(r.metadata),v={...r.metadata,..._,markdown:h,markdownSource:g};return yield*a.Effect.logInfo(`Successfully converted file ${r.id} to Markdown via ${g}`),(0,n.completeNodeExecution)({...r,metadata:v,flow:f})})})})}function c(e,o={}){return a.Effect.gen(function*(){let s=yield*n.DocumentPlugin,c=yield*i.UploadServer;return yield*(0,n.createFlowNode)({id:e,name:`Describe Document`,description:`Extract metadata from PDF documents`,type:n.NodeType.process,keepOutput:o.keepOutput,inputSchema:r.uploadFileSchema,outputSchema:r.uploadFileSchema,run:({data:r,flowId:i,jobId:o,clientId:l})=>a.Effect.gen(function*(){let u={flowId:i,nodeId:e,jobId:o};yield*a.Effect.logInfo(`Extracting metadata from PDF file ${r.id}`);let d=yield*c.read(r.id,l),f=yield*s.getMetadata(d).pipe(a.Effect.catchAll(e=>a.Effect.gen(function*(){return yield*a.Effect.logError(`Failed to extract metadata`,e),yield*t.UploadistaError.fromCode(`FLOW_NODE_ERROR`,{cause:e instanceof Error?e.message:`Failed to extract metadata`}).toEffect()}))),{metadata:p}=(0,n.resolveUploadMetadata)(r.metadata),m={...r.metadata,...p,pageCount:f.pageCount,format:f.format,...f.author&&{author:f.author},...f.title&&{title:f.title},...f.subject&&{subject:f.subject},...f.creator&&{creator:f.creator},...f.creationDate&&{creationDate:f.creationDate},...f.modifiedDate&&{modifiedDate:f.modifiedDate},fileSize:f.fileSize};return yield*a.Effect.logInfo(`Successfully extracted metadata from file ${r.id}: ${f.pageCount} pages`),(0,n.completeNodeExecution)({...r,metadata:m,flow:u})})})})}function l(e,o={}){return a.Effect.gen(function*(){let s=yield*n.DocumentPlugin,c=yield*i.UploadServer;return yield*(0,n.createFlowNode)({id:e,name:`Extract Text`,description:`Extract text from searchable PDF documents`,type:n.NodeType.process,nodeTypeId:n.STORAGE_OUTPUT_TYPE_ID,keepOutput:o.keepOutput,inputSchema:r.uploadFileSchema,outputSchema:r.uploadFileSchema,run:({data:r,flowId:i,jobId:o,clientId:l})=>a.Effect.gen(function*(){let u={flowId:i,nodeId:e,jobId:o};yield*a.Effect.logInfo(`Extracting text from PDF file ${r.id}`);let d=yield*c.read(r.id,l),f=yield*s.extractText(d).pipe(a.Effect.catchAll(e=>a.Effect.gen(function*(){return yield*a.Effect.logError(`Failed to extract text`,e),yield*t.UploadistaError.fromCode(`FLOW_NODE_ERROR`,{cause:e instanceof Error?e.message:`Failed to extract text`}).toEffect()}))),{metadata:p}=(0,n.resolveUploadMetadata)(r.metadata),m={...r.metadata,...p,extractedText:f};return!f||f.trim().length===0?yield*a.Effect.logWarning(`No text extracted from file ${r.id}. This might be a scanned document. Consider using the OCR node instead.`):yield*a.Effect.logInfo(`Successfully extracted ${f.length} characters from file ${r.id}`),(0,n.completeNodeExecution)({...r,metadata:m,flow:u})})})})}const u=o.z.array(r.uploadFileSchema);function d(e,o={}){return a.Effect.gen(function*(){let s=yield*n.DocumentPlugin,c=yield*i.UploadServer;return yield*(0,n.createFlowNode)({id:e,name:`Merge PDFs`,description:`Merge multiple PDF documents into one`,type:n.NodeType.process,nodeTypeId:n.STORAGE_OUTPUT_TYPE_ID,keepOutput:o.keepOutput,inputSchema:u,outputSchema:r.uploadFileSchema,run:({data:r,flowId:i,jobId:o,clientId:l})=>a.Effect.gen(function*(){let u={flowId:i,nodeId:e,jobId:o};if(!Array.isArray(r))return yield*t.UploadistaError.fromCode(`FLOW_NODE_ERROR`,{cause:`Merge PDF node requires an array of files from a Merge utility node`}).toEffect();if(r.length===0)return yield*t.UploadistaError.fromCode(`FLOW_NODE_ERROR`,{cause:`At least one PDF file is required for merging`}).toEffect();let d=[],f=0;for(let e of r){let t=yield*c.read(e.id,l);d.push(t);let r=(0,n.resolveUploadMetadata)(e.metadata).metadata;r?.pageCount&&typeof r.pageCount==`number`&&(f+=r.pageCount)}yield*a.Effect.logInfo(`Merging ${r.length} PDF files`);let p=yield*s.mergePdfs({pdfs:d}).pipe(a.Effect.catchAll(e=>a.Effect.gen(function*(){return yield*a.Effect.logError(`Failed to merge PDFs`,e),yield*t.UploadistaError.fromCode(`FLOW_NODE_ERROR`,{cause:e instanceof Error?e.message:`Failed to merge PDFs`}).toEffect()}))),m=r[0],{metadata:h}=(0,n.resolveUploadMetadata)(m.metadata),g=new ReadableStream({start(e){e.enqueue(p),e.close()}}),_=yield*c.upload({storageId:m.storage.id,size:p.byteLength,type:`application/pdf`,fileName:`merged-${r.length}-documents.pdf`,lastModified:0,metadata:JSON.stringify({...h,pageCount:f,mergedFrom:r.length}),flow:u},l,g),v={...h,pageCount:f,mergedFrom:r.length,fileName:`merged-${r.length}-documents.pdf`};return yield*a.Effect.logInfo(`Successfully merged ${r.length} PDFs into one document with ${f} pages`),(0,n.completeNodeExecution)({..._,metadata:v})})})})}function f(e,i){return a.Effect.gen(function*(){let o=yield*n.DocumentAiPlugin;return yield*(0,n.createFlowNode)({id:e,name:`OCR`,description:`Extract text from scanned documents using AI`,type:n.NodeType.process,nodeTypeId:n.OCR_OUTPUT_TYPE_ID,keepOutput:i.keepOutput,inputSchema:r.uploadFileSchema,outputSchema:n.ocrOutputSchema,run:({data:r,flowId:s,jobId:c,clientId:l})=>a.Effect.gen(function*(){let u={flowId:s,nodeId:e,jobId:c},d=r.url;if(!d)return yield*t.UploadistaError.fromCode(`FLOW_NODE_ERROR`,{cause:`URL is required for OCR operation`}).toEffect();yield*a.Effect.logInfo(`Starting OCR for file ${r.id} with task type: ${i.taskType}`);let f={clientId:l,credentialId:i.credentialId},p=yield*o.performOCR(d,{taskType:i.taskType,resolution:i.resolution,referenceText:i.referenceText},f).pipe(a.Effect.catchAll(e=>a.Effect.gen(function*(){return yield*a.Effect.logError(`Failed to perform OCR`,e),yield*t.UploadistaError.fromCode(`FLOW_NODE_ERROR`,{cause:e instanceof Error?e.message:`Failed to perform OCR`}).toEffect()})));return yield*a.Effect.logInfo(`Successfully completed OCR for file ${r.id}, extracted ${p.extractedText.length} characters`),(0,n.completeNodeExecution)({extractedText:p.extractedText,format:p.format,taskType:i.taskType,confidence:p.confidence,flow:u})})})})}function p(e,o){return a.Effect.gen(function*(){let s=yield*n.DocumentPlugin,c=yield*i.UploadServer;return yield*(0,n.createFlowNode)({id:e,name:`Split PDF`,description:`Split PDF into pages or page ranges`,type:n.NodeType.process,nodeTypeId:n.STORAGE_OUTPUT_TYPE_ID,keepOutput:o.keepOutput,inputSchema:r.uploadFileSchema,outputSchema:r.uploadFileSchema,run:({data:r,flowId:i,jobId:l,clientId:u})=>a.Effect.gen(function*(){let d={flowId:i,nodeId:e,jobId:l};yield*a.Effect.logInfo(`Splitting PDF file ${r.id} in ${o.mode} mode`);let f=yield*c.read(r.id,u),p=yield*s.splitPdf(f,o).pipe(a.Effect.catchAll(e=>a.Effect.gen(function*(){return yield*a.Effect.logError(`Failed to split PDF`,e),yield*t.UploadistaError.fromCode(`FLOW_NODE_ERROR`,{cause:e instanceof Error?e.message:`Failed to split PDF`}).toEffect()}))),{metadata:m}=(0,n.resolveUploadMetadata)(r.metadata);if(p.mode===`individual`){yield*a.Effect.logInfo(`Successfully split PDF into ${p.pdfs.length} individual pages`),yield*a.Effect.logWarning(`Individual page mode returns multiple files - flow engine support required`);let e=p.pdfs[0],t=new ReadableStream({start(t){t.enqueue(e),t.close()}}),i=yield*c.upload({storageId:r.storage.id,size:e.byteLength,type:`application/pdf`,fileName:`${m?.fileName||`document`}-page-1.pdf`,lastModified:0,metadata:JSON.stringify({...m,pageCount:1,splitMode:`individual`}),flow:d},u,t),o={...m,pageCount:1,splitMode:`individual`};return(0,n.completeNodeExecution)({...i,metadata:o})}let h=o.endPage&&o.startPage?o.endPage-o.startPage+1:1,g=p.pdf,_=new ReadableStream({start(e){e.enqueue(g),e.close()}}),v=yield*c.upload({storageId:r.storage.id,size:g.byteLength,type:`application/pdf`,fileName:`${m?.fileName||`document`}-pages-${o.startPage}-${o.endPage}.pdf`,lastModified:0,metadata:JSON.stringify({...m,pageCount:h,splitMode:`range`,splitRange:`${o.startPage}-${o.endPage}`}),flow:d},u,_),y={...m,pageCount:h,splitMode:`range`,splitRange:`${o.startPage}-${o.endPage}`};return yield*a.Effect.logInfo(`Successfully split PDF to pages ${o.startPage}-${o.endPage}`),(0,n.completeNodeExecution)({...v,metadata:y})})})})}exports.convertToMarkdownParamsSchema=e.o,exports.createConvertToMarkdownNode=s,exports.createDescribeDocumentNode=c,exports.createExtractTextNode=l,exports.createMergePdfNode=d,exports.createOcrNode=f,exports.createSplitPdfNode=p,exports.describeDocumentParamsSchema=e.a,exports.extractTextParamsSchema=e.i,exports.mergePdfParamsSchema=e.r,exports.ocrParamsSchema=e.n,exports.splitPdfParamsSchema=e.t;
|
package/dist/index.d.cts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { a as MergePdfParams, c as extractTextParamsSchema, d as ConvertToMarkdownParams, f as convertToMarkdownParamsSchema, i as ocrParamsSchema, l as DescribeDocumentParams, n as splitPdfParamsSchema, o as mergePdfParamsSchema, r as OcrParams, s as ExtractTextParams, t as SplitPdfParams, u as describeDocumentParamsSchema } from "./index-
|
|
1
|
+
import { a as MergePdfParams, c as extractTextParamsSchema, d as ConvertToMarkdownParams, f as convertToMarkdownParamsSchema, i as ocrParamsSchema, l as DescribeDocumentParams, n as splitPdfParamsSchema, o as mergePdfParamsSchema, r as OcrParams, s as ExtractTextParams, t as SplitPdfParams, u as describeDocumentParamsSchema } from "./index-CN8GG19X.cjs";
|
|
2
2
|
import * as _uploadista_core_flow1 from "@uploadista/core/flow";
|
|
3
3
|
import { DocumentAiPlugin, DocumentPlugin, NodeType, OcrResolution, OcrTaskType } from "@uploadista/core/flow";
|
|
4
4
|
import * as zod_v4_core1 from "zod/v4/core";
|
|
@@ -12,6 +12,7 @@ import { Effect } from "effect";
|
|
|
12
12
|
type ConvertToMarkdownNodeParams = {
|
|
13
13
|
credentialId?: string;
|
|
14
14
|
resolution?: "tiny" | "small" | "base" | "gundam" | "large";
|
|
15
|
+
keepOutput?: boolean;
|
|
15
16
|
};
|
|
16
17
|
declare function createConvertToMarkdownNode(id: string, params?: ConvertToMarkdownNodeParams): Effect.Effect<_uploadista_core_flow1.FlowNodeData & {
|
|
17
18
|
inputSchema: zod1.ZodType<{
|
|
@@ -204,8 +205,10 @@ declare function createConvertToMarkdownNode(id: string, params?: ConvertToMarkd
|
|
|
204
205
|
}, UploadistaError, UploadServer | DocumentPlugin | DocumentAiPlugin>;
|
|
205
206
|
//#endregion
|
|
206
207
|
//#region src/describe-document-node.d.ts
|
|
207
|
-
type DescribeDocumentNodeParams =
|
|
208
|
-
|
|
208
|
+
type DescribeDocumentNodeParams = {
|
|
209
|
+
keepOutput?: boolean;
|
|
210
|
+
};
|
|
211
|
+
declare function createDescribeDocumentNode(id: string, params?: DescribeDocumentNodeParams): Effect.Effect<_uploadista_core_flow1.FlowNodeData & {
|
|
209
212
|
inputSchema: zod1.ZodType<{
|
|
210
213
|
id: string;
|
|
211
214
|
offset: number;
|
|
@@ -396,8 +399,10 @@ declare function createDescribeDocumentNode(id: string, _params?: DescribeDocume
|
|
|
396
399
|
}, UploadistaError, UploadServer | DocumentPlugin>;
|
|
397
400
|
//#endregion
|
|
398
401
|
//#region src/extract-text-node.d.ts
|
|
399
|
-
type ExtractTextNodeParams =
|
|
400
|
-
|
|
402
|
+
type ExtractTextNodeParams = {
|
|
403
|
+
keepOutput?: boolean;
|
|
404
|
+
};
|
|
405
|
+
declare function createExtractTextNode(id: string, params?: ExtractTextNodeParams): Effect.Effect<_uploadista_core_flow1.FlowNodeData & {
|
|
401
406
|
inputSchema: zod1.ZodType<{
|
|
402
407
|
id: string;
|
|
403
408
|
offset: number;
|
|
@@ -590,8 +595,9 @@ declare function createExtractTextNode(id: string, _params?: ExtractTextNodePara
|
|
|
590
595
|
//#region src/merge-pdf-node.d.ts
|
|
591
596
|
type MergePdfNodeParams = {
|
|
592
597
|
inputCount?: number;
|
|
598
|
+
keepOutput?: boolean;
|
|
593
599
|
};
|
|
594
|
-
declare function createMergePdfNode(id: string,
|
|
600
|
+
declare function createMergePdfNode(id: string, params?: MergePdfNodeParams): Effect.Effect<_uploadista_core_flow1.FlowNodeData & {
|
|
595
601
|
inputSchema: z.ZodType<{
|
|
596
602
|
id: string;
|
|
597
603
|
offset: number;
|
|
@@ -787,6 +793,7 @@ type OcrNodeParams = {
|
|
|
787
793
|
resolution?: OcrResolution;
|
|
788
794
|
credentialId?: string;
|
|
789
795
|
referenceText?: string;
|
|
796
|
+
keepOutput?: boolean;
|
|
790
797
|
};
|
|
791
798
|
declare function createOcrNode(id: string, params: OcrNodeParams): Effect.Effect<_uploadista_core_flow1.FlowNodeData & {
|
|
792
799
|
inputSchema: zod1.ZodType<{
|
|
@@ -917,6 +924,7 @@ type SplitPdfNodeParams = {
|
|
|
917
924
|
mode: "range" | "individual";
|
|
918
925
|
startPage?: number;
|
|
919
926
|
endPage?: number;
|
|
927
|
+
keepOutput?: boolean;
|
|
920
928
|
};
|
|
921
929
|
declare function createSplitPdfNode(id: string, params: SplitPdfNodeParams): Effect.Effect<_uploadista_core_flow1.FlowNodeData & {
|
|
922
930
|
inputSchema: zod1.ZodType<{
|
package/dist/index.d.cts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.cts","names":[],"sources":["../src/convert-to-markdown-node.ts","../src/describe-document-node.ts","../src/extract-text-node.ts","../src/merge-pdf-node.ts","../src/ocr-node.ts","../src/split-pdf-node.ts"],"sourcesContent":[],"mappings":";;;;;;;;;;;KAcY,2BAAA
|
|
1
|
+
{"version":3,"file":"index.d.cts","names":[],"sources":["../src/convert-to-markdown-node.ts","../src/describe-document-node.ts","../src/extract-text-node.ts","../src/merge-pdf-node.ts","../src/ocr-node.ts","../src/split-pdf-node.ts"],"sourcesContent":[],"mappings":"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"}
|
package/dist/index.d.mts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { a as MergePdfParams, c as extractTextParamsSchema, d as ConvertToMarkdownParams, f as convertToMarkdownParamsSchema, i as ocrParamsSchema, l as DescribeDocumentParams, n as splitPdfParamsSchema, o as mergePdfParamsSchema, r as OcrParams, s as ExtractTextParams, t as SplitPdfParams, u as describeDocumentParamsSchema } from "./index-
|
|
1
|
+
import { a as MergePdfParams, c as extractTextParamsSchema, d as ConvertToMarkdownParams, f as convertToMarkdownParamsSchema, i as ocrParamsSchema, l as DescribeDocumentParams, n as splitPdfParamsSchema, o as mergePdfParamsSchema, r as OcrParams, s as ExtractTextParams, t as SplitPdfParams, u as describeDocumentParamsSchema } from "./index-DXwYQF9t.mjs";
|
|
2
2
|
import { UploadistaError } from "@uploadista/core/errors";
|
|
3
3
|
import * as _uploadista_core_flow1 from "@uploadista/core/flow";
|
|
4
4
|
import { DocumentAiPlugin, DocumentPlugin, NodeType, OcrResolution, OcrTaskType } from "@uploadista/core/flow";
|
|
@@ -12,6 +12,7 @@ import * as zod_v4_core1 from "zod/v4/core";
|
|
|
12
12
|
type ConvertToMarkdownNodeParams = {
|
|
13
13
|
credentialId?: string;
|
|
14
14
|
resolution?: "tiny" | "small" | "base" | "gundam" | "large";
|
|
15
|
+
keepOutput?: boolean;
|
|
15
16
|
};
|
|
16
17
|
declare function createConvertToMarkdownNode(id: string, params?: ConvertToMarkdownNodeParams): Effect.Effect<_uploadista_core_flow1.FlowNodeData & {
|
|
17
18
|
inputSchema: zod1.ZodType<{
|
|
@@ -204,8 +205,10 @@ declare function createConvertToMarkdownNode(id: string, params?: ConvertToMarkd
|
|
|
204
205
|
}, UploadistaError, UploadServer | DocumentPlugin | DocumentAiPlugin>;
|
|
205
206
|
//#endregion
|
|
206
207
|
//#region src/describe-document-node.d.ts
|
|
207
|
-
type DescribeDocumentNodeParams =
|
|
208
|
-
|
|
208
|
+
type DescribeDocumentNodeParams = {
|
|
209
|
+
keepOutput?: boolean;
|
|
210
|
+
};
|
|
211
|
+
declare function createDescribeDocumentNode(id: string, params?: DescribeDocumentNodeParams): Effect.Effect<_uploadista_core_flow1.FlowNodeData & {
|
|
209
212
|
inputSchema: zod1.ZodType<{
|
|
210
213
|
id: string;
|
|
211
214
|
offset: number;
|
|
@@ -396,8 +399,10 @@ declare function createDescribeDocumentNode(id: string, _params?: DescribeDocume
|
|
|
396
399
|
}, UploadistaError, UploadServer | DocumentPlugin>;
|
|
397
400
|
//#endregion
|
|
398
401
|
//#region src/extract-text-node.d.ts
|
|
399
|
-
type ExtractTextNodeParams =
|
|
400
|
-
|
|
402
|
+
type ExtractTextNodeParams = {
|
|
403
|
+
keepOutput?: boolean;
|
|
404
|
+
};
|
|
405
|
+
declare function createExtractTextNode(id: string, params?: ExtractTextNodeParams): Effect.Effect<_uploadista_core_flow1.FlowNodeData & {
|
|
401
406
|
inputSchema: zod1.ZodType<{
|
|
402
407
|
id: string;
|
|
403
408
|
offset: number;
|
|
@@ -590,8 +595,9 @@ declare function createExtractTextNode(id: string, _params?: ExtractTextNodePara
|
|
|
590
595
|
//#region src/merge-pdf-node.d.ts
|
|
591
596
|
type MergePdfNodeParams = {
|
|
592
597
|
inputCount?: number;
|
|
598
|
+
keepOutput?: boolean;
|
|
593
599
|
};
|
|
594
|
-
declare function createMergePdfNode(id: string,
|
|
600
|
+
declare function createMergePdfNode(id: string, params?: MergePdfNodeParams): Effect.Effect<_uploadista_core_flow1.FlowNodeData & {
|
|
595
601
|
inputSchema: z.ZodType<{
|
|
596
602
|
id: string;
|
|
597
603
|
offset: number;
|
|
@@ -787,6 +793,7 @@ type OcrNodeParams = {
|
|
|
787
793
|
resolution?: OcrResolution;
|
|
788
794
|
credentialId?: string;
|
|
789
795
|
referenceText?: string;
|
|
796
|
+
keepOutput?: boolean;
|
|
790
797
|
};
|
|
791
798
|
declare function createOcrNode(id: string, params: OcrNodeParams): Effect.Effect<_uploadista_core_flow1.FlowNodeData & {
|
|
792
799
|
inputSchema: zod1.ZodType<{
|
|
@@ -917,6 +924,7 @@ type SplitPdfNodeParams = {
|
|
|
917
924
|
mode: "range" | "individual";
|
|
918
925
|
startPage?: number;
|
|
919
926
|
endPage?: number;
|
|
927
|
+
keepOutput?: boolean;
|
|
920
928
|
};
|
|
921
929
|
declare function createSplitPdfNode(id: string, params: SplitPdfNodeParams): Effect.Effect<_uploadista_core_flow1.FlowNodeData & {
|
|
922
930
|
inputSchema: zod1.ZodType<{
|
package/dist/index.d.mts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.mts","names":[],"sources":["../src/convert-to-markdown-node.ts","../src/describe-document-node.ts","../src/extract-text-node.ts","../src/merge-pdf-node.ts","../src/ocr-node.ts","../src/split-pdf-node.ts"],"sourcesContent":[],"mappings":";;;;;;;;;;;KAcY,2BAAA
|
|
1
|
+
{"version":3,"file":"index.d.mts","names":[],"sources":["../src/convert-to-markdown-node.ts","../src/describe-document-node.ts","../src/extract-text-node.ts","../src/merge-pdf-node.ts","../src/ocr-node.ts","../src/split-pdf-node.ts"],"sourcesContent":[],"mappings":"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"}
|
package/dist/index.mjs
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import{a as e,i as t,n,o as r,r as i,t as a}from"./types-rDFmPO7S.mjs";import{UploadistaError as o}from"@uploadista/core/errors";import{DocumentAiPlugin as s,DocumentPlugin as c,NodeType as l,OCR_OUTPUT_TYPE_ID as u,STORAGE_OUTPUT_TYPE_ID as d,completeNodeExecution as f,createFlowNode as p,ocrOutputSchema as m,resolveUploadMetadata as h}from"@uploadista/core/flow";import{uploadFileSchema as g}from"@uploadista/core/types";import{UploadServer as _}from"@uploadista/core/upload";import{Effect as v,Either as y}from"effect";import{z as b}from"zod";function x(e,t={}){return v.gen(function*(){let n=yield*c,r=yield*s,i=yield*_;return yield*p({id:e,name:`Convert to Markdown`,description:`Convert documents to Markdown format (intelligently uses OCR if needed)`,type:l.process,nodeTypeId:d,inputSchema:g,outputSchema:g,run:({data:a,flowId:s,jobId:c,clientId:l})=>v.gen(function*(){let u={flowId:s,nodeId:e,jobId:c};yield*v.logInfo(`Converting file ${a.id} to Markdown`);let d=yield*i.read(a.id,l),p=yield*n.extractText(d).pipe(v.either),m,g;if(y.isRight(p)&&p.right.trim().length>0){let e=p.right;yield*v.logInfo(`Successfully extracted ${e.length} characters from searchable PDF`),m=e.split(`
|
|
1
|
+
import{a as e,i as t,n,o as r,r as i,t as a}from"./types-rDFmPO7S.mjs";import{UploadistaError as o}from"@uploadista/core/errors";import{DocumentAiPlugin as s,DocumentPlugin as c,NodeType as l,OCR_OUTPUT_TYPE_ID as u,STORAGE_OUTPUT_TYPE_ID as d,completeNodeExecution as f,createFlowNode as p,ocrOutputSchema as m,resolveUploadMetadata as h}from"@uploadista/core/flow";import{uploadFileSchema as g}from"@uploadista/core/types";import{UploadServer as _}from"@uploadista/core/upload";import{Effect as v,Either as y}from"effect";import{z as b}from"zod";function x(e,t={}){return v.gen(function*(){let n=yield*c,r=yield*s,i=yield*_;return yield*p({id:e,name:`Convert to Markdown`,description:`Convert documents to Markdown format (intelligently uses OCR if needed)`,type:l.process,nodeTypeId:d,keepOutput:t.keepOutput,inputSchema:g,outputSchema:g,run:({data:a,flowId:s,jobId:c,clientId:l})=>v.gen(function*(){let u={flowId:s,nodeId:e,jobId:c};yield*v.logInfo(`Converting file ${a.id} to Markdown`);let d=yield*i.read(a.id,l),p=yield*n.extractText(d).pipe(v.either),m,g;if(y.isRight(p)&&p.right.trim().length>0){let e=p.right;yield*v.logInfo(`Successfully extracted ${e.length} characters from searchable PDF`),m=e.split(`
|
|
2
2
|
|
|
3
3
|
`).map(e=>e.trim()).filter(e=>e.length>0).join(`
|
|
4
4
|
|
|
5
|
-
`),g=`text`,yield*v.logInfo(`Converted text to Markdown (${m.length} characters)`)}else{yield*v.logInfo(`Text extraction failed or returned empty, falling back to OCR`);let e=a.url;if(!e)return yield*o.fromCode(`FLOW_NODE_ERROR`,{cause:`URL is required for OCR-based markdown conversion`}).toEffect();let n={clientId:l,credentialId:t.credentialId};m=(yield*r.performOCR(e,{taskType:`convertToMarkdown`,resolution:t.resolution||`gundam`},n).pipe(v.catchAll(e=>v.gen(function*(){return yield*v.logError(`Failed to perform OCR`,e),yield*o.fromCode(`FLOW_NODE_ERROR`,{cause:e instanceof Error?e.message:`Failed to perform OCR for markdown conversion`}).toEffect()})))).extractedText,g=`ocr`,yield*v.logInfo(`Successfully converted scanned document to Markdown using OCR (${m.length} characters)`)}let{metadata:_}=h(a.metadata),b={...a.metadata,..._,markdown:m,markdownSource:g};return yield*v.logInfo(`Successfully converted file ${a.id} to Markdown via ${g}`),f({...a,metadata:b,flow:u})})})})}function S(e,t={}){return v.gen(function*(){let
|
|
5
|
+
`),g=`text`,yield*v.logInfo(`Converted text to Markdown (${m.length} characters)`)}else{yield*v.logInfo(`Text extraction failed or returned empty, falling back to OCR`);let e=a.url;if(!e)return yield*o.fromCode(`FLOW_NODE_ERROR`,{cause:`URL is required for OCR-based markdown conversion`}).toEffect();let n={clientId:l,credentialId:t.credentialId};m=(yield*r.performOCR(e,{taskType:`convertToMarkdown`,resolution:t.resolution||`gundam`},n).pipe(v.catchAll(e=>v.gen(function*(){return yield*v.logError(`Failed to perform OCR`,e),yield*o.fromCode(`FLOW_NODE_ERROR`,{cause:e instanceof Error?e.message:`Failed to perform OCR for markdown conversion`}).toEffect()})))).extractedText,g=`ocr`,yield*v.logInfo(`Successfully converted scanned document to Markdown using OCR (${m.length} characters)`)}let{metadata:_}=h(a.metadata),b={...a.metadata,..._,markdown:m,markdownSource:g};return yield*v.logInfo(`Successfully converted file ${a.id} to Markdown via ${g}`),f({...a,metadata:b,flow:u})})})})}function S(e,t={}){return v.gen(function*(){let n=yield*c,r=yield*_;return yield*p({id:e,name:`Describe Document`,description:`Extract metadata from PDF documents`,type:l.process,keepOutput:t.keepOutput,inputSchema:g,outputSchema:g,run:({data:t,flowId:i,jobId:a,clientId:s})=>v.gen(function*(){let c={flowId:i,nodeId:e,jobId:a};yield*v.logInfo(`Extracting metadata from PDF file ${t.id}`);let l=yield*r.read(t.id,s),u=yield*n.getMetadata(l).pipe(v.catchAll(e=>v.gen(function*(){return yield*v.logError(`Failed to extract metadata`,e),yield*o.fromCode(`FLOW_NODE_ERROR`,{cause:e instanceof Error?e.message:`Failed to extract metadata`}).toEffect()}))),{metadata:d}=h(t.metadata),p={...t.metadata,...d,pageCount:u.pageCount,format:u.format,...u.author&&{author:u.author},...u.title&&{title:u.title},...u.subject&&{subject:u.subject},...u.creator&&{creator:u.creator},...u.creationDate&&{creationDate:u.creationDate},...u.modifiedDate&&{modifiedDate:u.modifiedDate},fileSize:u.fileSize};return yield*v.logInfo(`Successfully extracted metadata from file ${t.id}: ${u.pageCount} pages`),f({...t,metadata:p,flow:c})})})})}function C(e,t={}){return v.gen(function*(){let n=yield*c,r=yield*_;return yield*p({id:e,name:`Extract Text`,description:`Extract text from searchable PDF documents`,type:l.process,nodeTypeId:d,keepOutput:t.keepOutput,inputSchema:g,outputSchema:g,run:({data:t,flowId:i,jobId:a,clientId:s})=>v.gen(function*(){let c={flowId:i,nodeId:e,jobId:a};yield*v.logInfo(`Extracting text from PDF file ${t.id}`);let l=yield*r.read(t.id,s),u=yield*n.extractText(l).pipe(v.catchAll(e=>v.gen(function*(){return yield*v.logError(`Failed to extract text`,e),yield*o.fromCode(`FLOW_NODE_ERROR`,{cause:e instanceof Error?e.message:`Failed to extract text`}).toEffect()}))),{metadata:d}=h(t.metadata),p={...t.metadata,...d,extractedText:u};return!u||u.trim().length===0?yield*v.logWarning(`No text extracted from file ${t.id}. This might be a scanned document. Consider using the OCR node instead.`):yield*v.logInfo(`Successfully extracted ${u.length} characters from file ${t.id}`),f({...t,metadata:p,flow:c})})})})}const w=b.array(g);function T(e,t={}){return v.gen(function*(){let n=yield*c,r=yield*_;return yield*p({id:e,name:`Merge PDFs`,description:`Merge multiple PDF documents into one`,type:l.process,nodeTypeId:d,keepOutput:t.keepOutput,inputSchema:w,outputSchema:g,run:({data:t,flowId:i,jobId:a,clientId:s})=>v.gen(function*(){let c={flowId:i,nodeId:e,jobId:a};if(!Array.isArray(t))return yield*o.fromCode(`FLOW_NODE_ERROR`,{cause:`Merge PDF node requires an array of files from a Merge utility node`}).toEffect();if(t.length===0)return yield*o.fromCode(`FLOW_NODE_ERROR`,{cause:`At least one PDF file is required for merging`}).toEffect();let l=[],u=0;for(let e of t){let t=yield*r.read(e.id,s);l.push(t);let n=h(e.metadata).metadata;n?.pageCount&&typeof n.pageCount==`number`&&(u+=n.pageCount)}yield*v.logInfo(`Merging ${t.length} PDF files`);let d=yield*n.mergePdfs({pdfs:l}).pipe(v.catchAll(e=>v.gen(function*(){return yield*v.logError(`Failed to merge PDFs`,e),yield*o.fromCode(`FLOW_NODE_ERROR`,{cause:e instanceof Error?e.message:`Failed to merge PDFs`}).toEffect()}))),p=t[0],{metadata:m}=h(p.metadata),g=new ReadableStream({start(e){e.enqueue(d),e.close()}}),_=yield*r.upload({storageId:p.storage.id,size:d.byteLength,type:`application/pdf`,fileName:`merged-${t.length}-documents.pdf`,lastModified:0,metadata:JSON.stringify({...m,pageCount:u,mergedFrom:t.length}),flow:c},s,g),y={...m,pageCount:u,mergedFrom:t.length,fileName:`merged-${t.length}-documents.pdf`};return yield*v.logInfo(`Successfully merged ${t.length} PDFs into one document with ${u} pages`),f({..._,metadata:y})})})})}function E(e,t){return v.gen(function*(){let n=yield*s;return yield*p({id:e,name:`OCR`,description:`Extract text from scanned documents using AI`,type:l.process,nodeTypeId:u,keepOutput:t.keepOutput,inputSchema:g,outputSchema:m,run:({data:r,flowId:i,jobId:a,clientId:s})=>v.gen(function*(){let c={flowId:i,nodeId:e,jobId:a},l=r.url;if(!l)return yield*o.fromCode(`FLOW_NODE_ERROR`,{cause:`URL is required for OCR operation`}).toEffect();yield*v.logInfo(`Starting OCR for file ${r.id} with task type: ${t.taskType}`);let u={clientId:s,credentialId:t.credentialId},d=yield*n.performOCR(l,{taskType:t.taskType,resolution:t.resolution,referenceText:t.referenceText},u).pipe(v.catchAll(e=>v.gen(function*(){return yield*v.logError(`Failed to perform OCR`,e),yield*o.fromCode(`FLOW_NODE_ERROR`,{cause:e instanceof Error?e.message:`Failed to perform OCR`}).toEffect()})));return yield*v.logInfo(`Successfully completed OCR for file ${r.id}, extracted ${d.extractedText.length} characters`),f({extractedText:d.extractedText,format:d.format,taskType:t.taskType,confidence:d.confidence,flow:c})})})})}function D(e,t){return v.gen(function*(){let n=yield*c,r=yield*_;return yield*p({id:e,name:`Split PDF`,description:`Split PDF into pages or page ranges`,type:l.process,nodeTypeId:d,keepOutput:t.keepOutput,inputSchema:g,outputSchema:g,run:({data:i,flowId:a,jobId:s,clientId:c})=>v.gen(function*(){let l={flowId:a,nodeId:e,jobId:s};yield*v.logInfo(`Splitting PDF file ${i.id} in ${t.mode} mode`);let u=yield*r.read(i.id,c),d=yield*n.splitPdf(u,t).pipe(v.catchAll(e=>v.gen(function*(){return yield*v.logError(`Failed to split PDF`,e),yield*o.fromCode(`FLOW_NODE_ERROR`,{cause:e instanceof Error?e.message:`Failed to split PDF`}).toEffect()}))),{metadata:p}=h(i.metadata);if(d.mode===`individual`){yield*v.logInfo(`Successfully split PDF into ${d.pdfs.length} individual pages`),yield*v.logWarning(`Individual page mode returns multiple files - flow engine support required`);let e=d.pdfs[0],t=new ReadableStream({start(t){t.enqueue(e),t.close()}}),n=yield*r.upload({storageId:i.storage.id,size:e.byteLength,type:`application/pdf`,fileName:`${p?.fileName||`document`}-page-1.pdf`,lastModified:0,metadata:JSON.stringify({...p,pageCount:1,splitMode:`individual`}),flow:l},c,t),a={...p,pageCount:1,splitMode:`individual`};return f({...n,metadata:a})}let m=t.endPage&&t.startPage?t.endPage-t.startPage+1:1,g=d.pdf,_=new ReadableStream({start(e){e.enqueue(g),e.close()}}),y=yield*r.upload({storageId:i.storage.id,size:g.byteLength,type:`application/pdf`,fileName:`${p?.fileName||`document`}-pages-${t.startPage}-${t.endPage}.pdf`,lastModified:0,metadata:JSON.stringify({...p,pageCount:m,splitMode:`range`,splitRange:`${t.startPage}-${t.endPage}`}),flow:l},c,_),b={...p,pageCount:m,splitMode:`range`,splitRange:`${t.startPage}-${t.endPage}`};return yield*v.logInfo(`Successfully split PDF to pages ${t.startPage}-${t.endPage}`),f({...y,metadata:b})})})})}export{r as convertToMarkdownParamsSchema,x as createConvertToMarkdownNode,S as createDescribeDocumentNode,C as createExtractTextNode,T as createMergePdfNode,E as createOcrNode,D as createSplitPdfNode,e as describeDocumentParamsSchema,t as extractTextParamsSchema,i as mergePdfParamsSchema,n as ocrParamsSchema,a as splitPdfParamsSchema};
|
|
6
6
|
//# sourceMappingURL=index.mjs.map
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","names":["markdown: string","markdownSource: \"text\" | \"ocr\"","pdfBuffers: Uint8Array[]","pdfBytes","stream","uploadResult","newMetadata"],"sources":["../src/convert-to-markdown-node.ts","../src/describe-document-node.ts","../src/extract-text-node.ts","../src/merge-pdf-node.ts","../src/ocr-node.ts","../src/split-pdf-node.ts"],"sourcesContent":["import { UploadistaError } from \"@uploadista/core/errors\";\nimport {\n completeNodeExecution,\n createFlowNode,\n DocumentAiPlugin,\n DocumentPlugin,\n NodeType,\n resolveUploadMetadata,\n STORAGE_OUTPUT_TYPE_ID,\n} from \"@uploadista/core/flow\";\nimport { uploadFileSchema } from \"@uploadista/core/types\";\nimport { UploadServer } from \"@uploadista/core/upload\";\nimport { Effect, Either } from \"effect\";\n\nexport type ConvertToMarkdownNodeParams = {\n credentialId?: string;\n resolution?: \"tiny\" | \"small\" | \"base\" | \"gundam\" | \"large\";\n};\n\nexport function createConvertToMarkdownNode(\n id: string,\n params: ConvertToMarkdownNodeParams = {},\n) {\n return Effect.gen(function* () {\n const documentService = yield* DocumentPlugin;\n const documentAiService = yield* DocumentAiPlugin;\n const uploadServer = yield* UploadServer;\n\n return yield* createFlowNode({\n id,\n name: \"Convert to Markdown\",\n description:\n \"Convert documents to Markdown format (intelligently uses OCR if needed)\",\n type: NodeType.process,\n nodeTypeId: STORAGE_OUTPUT_TYPE_ID,\n inputSchema: uploadFileSchema,\n outputSchema: uploadFileSchema,\n run: ({ data: file, flowId, jobId, clientId }) => {\n return Effect.gen(function* () {\n const flow = {\n flowId,\n nodeId: id,\n jobId,\n };\n\n yield* Effect.logInfo(`Converting file ${file.id} to Markdown`);\n\n // Read file bytes from upload server\n const fileBytes = yield* uploadServer.read(file.id, clientId);\n\n // Try to extract text first (for searchable PDFs)\n const extractResult = yield* documentService\n .extractText(fileBytes)\n .pipe(Effect.either);\n\n let markdown: string;\n let markdownSource: \"text\" | \"ocr\";\n\n if (\n Either.isRight(extractResult) &&\n extractResult.right.trim().length > 0\n ) {\n // Successfully extracted text from searchable PDF\n const text = extractResult.right;\n\n yield* Effect.logInfo(\n `Successfully extracted ${text.length} characters from searchable PDF`,\n );\n\n // Simple text-to-markdown conversion\n // In a real implementation, this could be more sophisticated\n markdown = text\n .split(\"\\n\\n\")\n .map((para: string) => para.trim())\n .filter((para: string) => para.length > 0)\n .join(\"\\n\\n\");\n\n markdownSource = \"text\";\n\n yield* Effect.logInfo(\n `Converted text to Markdown (${markdown.length} characters)`,\n );\n } else {\n // Text extraction failed or returned empty - use OCR\n yield* Effect.logInfo(\n \"Text extraction failed or returned empty, falling back to OCR\",\n );\n\n const fileUrl = file.url;\n\n if (!fileUrl) {\n return yield* UploadistaError.fromCode(\"FLOW_NODE_ERROR\", {\n cause: \"URL is required for OCR-based markdown conversion\",\n }).toEffect();\n }\n\n // Build context for DocumentAI plugin\n const context = {\n clientId,\n credentialId: params.credentialId,\n };\n\n // Perform OCR with markdown conversion\n const ocrResult = yield* documentAiService\n .performOCR(\n fileUrl,\n {\n taskType: \"convertToMarkdown\",\n resolution: params.resolution || \"gundam\",\n },\n context,\n )\n .pipe(\n Effect.catchAll((error) =>\n Effect.gen(function* () {\n yield* Effect.logError(\"Failed to perform OCR\", error);\n return yield* UploadistaError.fromCode(\"FLOW_NODE_ERROR\", {\n cause:\n error instanceof Error\n ? error.message\n : \"Failed to perform OCR for markdown conversion\",\n }).toEffect();\n }),\n ),\n );\n\n markdown = ocrResult.extractedText;\n markdownSource = \"ocr\";\n\n yield* Effect.logInfo(\n `Successfully converted scanned document to Markdown using OCR (${markdown.length} characters)`,\n );\n }\n\n const { metadata } = resolveUploadMetadata(file.metadata);\n\n // Add markdown to metadata\n const newMetadata = {\n ...file.metadata,\n ...metadata,\n markdown,\n markdownSource,\n };\n\n yield* Effect.logInfo(\n `Successfully converted file ${file.id} to Markdown via ${markdownSource}`,\n );\n\n return completeNodeExecution({\n ...file,\n metadata: newMetadata,\n flow,\n });\n });\n },\n });\n });\n}\n","import { UploadistaError } from \"@uploadista/core/errors\";\nimport {\n completeNodeExecution,\n createFlowNode,\n DocumentPlugin,\n NodeType,\n resolveUploadMetadata,\n} from \"@uploadista/core/flow\";\nimport { uploadFileSchema } from \"@uploadista/core/types\";\nimport { UploadServer } from \"@uploadista/core/upload\";\nimport { Effect } from \"effect\";\n\nexport type DescribeDocumentNodeParams = Record<string, never>; // No parameters needed\n\nexport function createDescribeDocumentNode(\n id: string,\n _params: DescribeDocumentNodeParams = {},\n) {\n return Effect.gen(function* () {\n const documentService = yield* DocumentPlugin;\n const uploadServer = yield* UploadServer;\n\n return yield* createFlowNode({\n id,\n name: \"Describe Document\",\n description: \"Extract metadata from PDF documents\",\n type: NodeType.process,\n inputSchema: uploadFileSchema,\n outputSchema: uploadFileSchema,\n run: ({ data: file, flowId, jobId, clientId }) => {\n return Effect.gen(function* () {\n const flow = {\n flowId,\n nodeId: id,\n jobId,\n };\n\n yield* Effect.logInfo(\n `Extracting metadata from PDF file ${file.id}`,\n );\n\n // Read file bytes from upload server\n const fileBytes = yield* uploadServer.read(file.id, clientId);\n\n // Get metadata with error handling\n const documentMetadata = yield* documentService\n .getMetadata(fileBytes)\n .pipe(\n Effect.catchAll((error) =>\n Effect.gen(function* () {\n yield* Effect.logError(\"Failed to extract metadata\", error);\n return yield* UploadistaError.fromCode(\"FLOW_NODE_ERROR\", {\n cause:\n error instanceof Error\n ? error.message\n : \"Failed to extract metadata\",\n }).toEffect();\n }),\n ),\n );\n\n const { metadata } = resolveUploadMetadata(file.metadata);\n\n // Add document metadata to file metadata (filter out null values)\n const newMetadata = {\n ...file.metadata,\n ...metadata,\n pageCount: documentMetadata.pageCount,\n format: documentMetadata.format,\n ...(documentMetadata.author && { author: documentMetadata.author }),\n ...(documentMetadata.title && { title: documentMetadata.title }),\n ...(documentMetadata.subject && { subject: documentMetadata.subject }),\n ...(documentMetadata.creator && { creator: documentMetadata.creator }),\n ...(documentMetadata.creationDate && { creationDate: documentMetadata.creationDate }),\n ...(documentMetadata.modifiedDate && { modifiedDate: documentMetadata.modifiedDate }),\n fileSize: documentMetadata.fileSize,\n };\n\n yield* Effect.logInfo(\n `Successfully extracted metadata from file ${file.id}: ${documentMetadata.pageCount} pages`,\n );\n\n return completeNodeExecution({\n ...file,\n metadata: newMetadata,\n flow,\n });\n });\n },\n });\n });\n}\n","import { UploadistaError } from \"@uploadista/core/errors\";\nimport {\n completeNodeExecution,\n createFlowNode,\n DocumentPlugin,\n NodeType,\n resolveUploadMetadata,\n STORAGE_OUTPUT_TYPE_ID,\n} from \"@uploadista/core/flow\";\nimport { uploadFileSchema } from \"@uploadista/core/types\";\nimport { UploadServer } from \"@uploadista/core/upload\";\nimport { Effect } from \"effect\";\n\nexport type ExtractTextNodeParams = Record<string, never>; // No parameters needed\n\nexport function createExtractTextNode(\n id: string,\n _params: ExtractTextNodeParams = {},\n) {\n return Effect.gen(function* () {\n const documentService = yield* DocumentPlugin;\n const uploadServer = yield* UploadServer;\n\n return yield* createFlowNode({\n id,\n name: \"Extract Text\",\n description: \"Extract text from searchable PDF documents\",\n type: NodeType.process,\n nodeTypeId: STORAGE_OUTPUT_TYPE_ID,\n inputSchema: uploadFileSchema,\n outputSchema: uploadFileSchema,\n run: ({ data: file, flowId, jobId, clientId }) => {\n return Effect.gen(function* () {\n const flow = {\n flowId,\n nodeId: id,\n jobId,\n };\n\n yield* Effect.logInfo(`Extracting text from PDF file ${file.id}`);\n\n // Read file bytes from upload server\n const fileBytes = yield* uploadServer.read(file.id, clientId);\n\n // Extract text with error handling\n const extractedText = yield* documentService\n .extractText(fileBytes)\n .pipe(\n Effect.catchAll((error) =>\n Effect.gen(function* () {\n yield* Effect.logError(\"Failed to extract text\", error);\n return yield* UploadistaError.fromCode(\"FLOW_NODE_ERROR\", {\n cause:\n error instanceof Error\n ? error.message\n : \"Failed to extract text\",\n }).toEffect();\n }),\n ),\n );\n\n const { metadata } = resolveUploadMetadata(file.metadata);\n\n // Add extracted text to metadata\n const newMetadata = {\n ...file.metadata,\n ...metadata,\n extractedText,\n };\n\n if (!extractedText || extractedText.trim().length === 0) {\n yield* Effect.logWarning(\n `No text extracted from file ${file.id}. This might be a scanned document. Consider using the OCR node instead.`,\n );\n } else {\n yield* Effect.logInfo(\n `Successfully extracted ${extractedText.length} characters from file ${file.id}`,\n );\n }\n\n return completeNodeExecution({\n ...file,\n metadata: newMetadata,\n flow,\n });\n });\n },\n });\n });\n}\n","import { UploadistaError } from \"@uploadista/core/errors\";\nimport {\n completeNodeExecution,\n createFlowNode,\n DocumentPlugin,\n NodeType,\n resolveUploadMetadata,\n STORAGE_OUTPUT_TYPE_ID,\n} from \"@uploadista/core/flow\";\nimport { uploadFileSchema } from \"@uploadista/core/types\";\nimport { UploadServer } from \"@uploadista/core/upload\";\nimport { Effect } from \"effect\";\nimport { z } from \"zod\";\n\nexport type MergePdfNodeParams = {\n inputCount?: number;\n};\n\n// Schema for multiple file inputs\nconst multipleFilesSchema = z.array(uploadFileSchema);\n\nexport function createMergePdfNode(\n id: string,\n _params: MergePdfNodeParams = {},\n) {\n return Effect.gen(function* () {\n const documentService = yield* DocumentPlugin;\n const uploadServer = yield* UploadServer;\n\n return yield* createFlowNode({\n id,\n name: \"Merge PDFs\",\n description: \"Merge multiple PDF documents into one\",\n type: NodeType.process,\n nodeTypeId: STORAGE_OUTPUT_TYPE_ID,\n inputSchema: multipleFilesSchema,\n outputSchema: uploadFileSchema,\n run: ({ data: files, flowId, jobId, clientId }) => {\n return Effect.gen(function* () {\n const flow = {\n flowId,\n nodeId: id,\n jobId,\n };\n\n // Validate that we have an array of files\n if (!Array.isArray(files)) {\n return yield* UploadistaError.fromCode(\"FLOW_NODE_ERROR\", {\n cause:\n \"Merge PDF node requires an array of files from a Merge utility node\",\n }).toEffect();\n }\n\n if (files.length === 0) {\n return yield* UploadistaError.fromCode(\"FLOW_NODE_ERROR\", {\n cause: \"At least one PDF file is required for merging\",\n }).toEffect();\n }\n\n // Read buffers from all files\n const pdfBuffers: Uint8Array[] = [];\n let totalPages = 0;\n\n for (const file of files) {\n // Read file bytes from upload server\n const fileBytes = yield* uploadServer.read(file.id, clientId);\n pdfBuffers.push(fileBytes);\n\n // Sum up page counts if available\n const fileMetadata = resolveUploadMetadata(file.metadata).metadata;\n if (\n fileMetadata?.pageCount &&\n typeof fileMetadata.pageCount === \"number\"\n ) {\n totalPages += fileMetadata.pageCount;\n }\n }\n\n yield* Effect.logInfo(`Merging ${files.length} PDF files`);\n\n // Merge PDFs with error handling\n const mergedPdf = yield* documentService\n .mergePdfs({ pdfs: pdfBuffers })\n .pipe(\n Effect.catchAll((error) =>\n Effect.gen(function* () {\n yield* Effect.logError(\"Failed to merge PDFs\", error);\n return yield* UploadistaError.fromCode(\"FLOW_NODE_ERROR\", {\n cause:\n error instanceof Error\n ? error.message\n : \"Failed to merge PDFs\",\n }).toEffect();\n }),\n ),\n );\n\n // Use metadata from first file as base\n const firstFile = files[0];\n const { metadata } = resolveUploadMetadata(firstFile.metadata);\n\n // Create a stream from the merged PDF bytes\n const stream = new ReadableStream({\n start(controller) {\n controller.enqueue(mergedPdf);\n controller.close();\n },\n });\n\n // Upload the merged PDF back to the upload server\n const result = yield* uploadServer.upload(\n {\n storageId: firstFile.storage.id,\n size: mergedPdf.byteLength,\n type: \"application/pdf\",\n fileName: `merged-${files.length}-documents.pdf`,\n lastModified: 0,\n metadata: JSON.stringify({\n ...metadata,\n pageCount: totalPages,\n mergedFrom: files.length,\n }),\n flow,\n },\n clientId,\n stream,\n );\n\n const newMetadata = {\n ...metadata,\n pageCount: totalPages,\n mergedFrom: files.length,\n fileName: `merged-${files.length}-documents.pdf`,\n };\n\n yield* Effect.logInfo(\n `Successfully merged ${files.length} PDFs into one document with ${totalPages} pages`,\n );\n\n return completeNodeExecution({\n ...result,\n metadata: newMetadata,\n });\n });\n },\n });\n });\n}\n","import { UploadistaError } from \"@uploadista/core/errors\";\nimport {\n completeNodeExecution,\n createFlowNode,\n DocumentAiPlugin,\n NodeType,\n OCR_OUTPUT_TYPE_ID,\n type OcrResolution,\n type OcrTaskType,\n ocrOutputSchema,\n} from \"@uploadista/core/flow\";\nimport { uploadFileSchema } from \"@uploadista/core/types\";\nimport { Effect } from \"effect\";\n\nexport type OcrNodeParams = {\n taskType: OcrTaskType;\n resolution?: OcrResolution;\n credentialId?: string;\n referenceText?: string;\n};\n\nexport function createOcrNode(id: string, params: OcrNodeParams) {\n return Effect.gen(function* () {\n const documentAiService = yield* DocumentAiPlugin;\n\n return yield* createFlowNode({\n id,\n name: \"OCR\",\n description: \"Extract text from scanned documents using AI\",\n type: NodeType.process,\n nodeTypeId: OCR_OUTPUT_TYPE_ID,\n inputSchema: uploadFileSchema,\n outputSchema: ocrOutputSchema,\n run: ({ data: file, flowId, jobId, clientId }) => {\n return Effect.gen(function* () {\n const flow = {\n flowId,\n nodeId: id,\n jobId,\n };\n\n const fileUrl = file.url;\n\n // Validate input\n if (!fileUrl) {\n return yield* UploadistaError.fromCode(\"FLOW_NODE_ERROR\", {\n cause: \"URL is required for OCR operation\",\n }).toEffect();\n }\n\n yield* Effect.logInfo(\n `Starting OCR for file ${file.id} with task type: ${params.taskType}`,\n );\n\n // Build context for DocumentAI plugin\n const context = {\n clientId,\n credentialId: params.credentialId,\n };\n\n // Perform OCR with error handling\n const ocrResult = yield* documentAiService\n .performOCR(\n fileUrl,\n {\n taskType: params.taskType,\n resolution: params.resolution,\n referenceText: params.referenceText,\n },\n context,\n )\n .pipe(\n Effect.catchAll((error) =>\n Effect.gen(function* () {\n yield* Effect.logError(\"Failed to perform OCR\", error);\n return yield* UploadistaError.fromCode(\"FLOW_NODE_ERROR\", {\n cause:\n error instanceof Error\n ? error.message\n : \"Failed to perform OCR\",\n }).toEffect();\n }),\n ),\n );\n\n yield* Effect.logInfo(\n `Successfully completed OCR for file ${file.id}, extracted ${ocrResult.extractedText.length} characters`,\n );\n\n // Return structured OCR output (not UploadFile)\n return completeNodeExecution({\n extractedText: ocrResult.extractedText,\n format: ocrResult.format,\n taskType: params.taskType,\n confidence: ocrResult.confidence,\n flow,\n });\n });\n },\n });\n });\n}\n","import { UploadistaError } from \"@uploadista/core/errors\";\nimport {\n completeNodeExecution,\n createFlowNode,\n DocumentPlugin,\n NodeType,\n resolveUploadMetadata,\n STORAGE_OUTPUT_TYPE_ID,\n} from \"@uploadista/core/flow\";\nimport { uploadFileSchema } from \"@uploadista/core/types\";\nimport { UploadServer } from \"@uploadista/core/upload\";\nimport { Effect } from \"effect\";\n\nexport type SplitPdfNodeParams = {\n mode: \"range\" | \"individual\";\n startPage?: number;\n endPage?: number;\n};\n\nexport function createSplitPdfNode(id: string, params: SplitPdfNodeParams) {\n return Effect.gen(function* () {\n const documentService = yield* DocumentPlugin;\n const uploadServer = yield* UploadServer;\n\n return yield* createFlowNode({\n id,\n name: \"Split PDF\",\n description: \"Split PDF into pages or page ranges\",\n type: NodeType.process,\n nodeTypeId: STORAGE_OUTPUT_TYPE_ID,\n inputSchema: uploadFileSchema,\n outputSchema: uploadFileSchema,\n run: ({ data: file, flowId, jobId, clientId }) => {\n return Effect.gen(function* () {\n const flow = {\n flowId,\n nodeId: id,\n jobId,\n };\n\n yield* Effect.logInfo(\n `Splitting PDF file ${file.id} in ${params.mode} mode`,\n );\n\n // Read file bytes from upload server\n const fileBytes = yield* uploadServer.read(file.id, clientId);\n\n // Split PDF with error handling\n const result = yield* documentService\n .splitPdf(fileBytes, params)\n .pipe(\n Effect.catchAll((error) =>\n Effect.gen(function* () {\n yield* Effect.logError(\"Failed to split PDF\", error);\n return yield* UploadistaError.fromCode(\"FLOW_NODE_ERROR\", {\n cause:\n error instanceof Error\n ? error.message\n : \"Failed to split PDF\",\n }).toEffect();\n }),\n ),\n );\n\n const { metadata } = resolveUploadMetadata(file.metadata);\n\n if (result.mode === \"individual\") {\n // Return array of files (one per page)\n yield* Effect.logInfo(\n `Successfully split PDF into ${result.pdfs.length} individual pages`,\n );\n\n // For individual mode, we'd need to return multiple files\n // This requires special handling in the flow engine\n // For now, we'll return the first page and log a warning\n yield* Effect.logWarning(\n \"Individual page mode returns multiple files - flow engine support required\",\n );\n\n const pdfBytes = result.pdfs[0];\n\n // Create a stream from the PDF bytes\n const stream = new ReadableStream({\n start(controller) {\n controller.enqueue(pdfBytes);\n controller.close();\n },\n });\n\n // Upload the split PDF back to the upload server\n const uploadResult = yield* uploadServer.upload(\n {\n storageId: file.storage.id,\n size: pdfBytes.byteLength,\n type: \"application/pdf\",\n fileName: `${metadata?.fileName || \"document\"}-page-1.pdf`,\n lastModified: 0,\n metadata: JSON.stringify({\n ...metadata,\n pageCount: 1,\n splitMode: \"individual\",\n }),\n flow,\n },\n clientId,\n stream,\n );\n\n const newMetadata = {\n ...metadata,\n pageCount: 1,\n splitMode: \"individual\",\n };\n\n return completeNodeExecution({\n ...uploadResult,\n metadata: newMetadata,\n });\n }\n\n // Range mode - return single PDF with selected pages\n const pageCount =\n params.endPage && params.startPage\n ? params.endPage - params.startPage + 1\n : 1;\n\n const pdfBytes = result.pdf;\n\n // Create a stream from the PDF bytes\n const stream = new ReadableStream({\n start(controller) {\n controller.enqueue(pdfBytes);\n controller.close();\n },\n });\n\n // Upload the split PDF back to the upload server\n const uploadResult = yield* uploadServer.upload(\n {\n storageId: file.storage.id,\n size: pdfBytes.byteLength,\n type: \"application/pdf\",\n fileName: `${metadata?.fileName || \"document\"}-pages-${params.startPage}-${params.endPage}.pdf`,\n lastModified: 0,\n metadata: JSON.stringify({\n ...metadata,\n pageCount,\n splitMode: \"range\",\n splitRange: `${params.startPage}-${params.endPage}`,\n }),\n flow,\n },\n clientId,\n stream,\n );\n\n const newMetadata = {\n ...metadata,\n pageCount,\n splitMode: \"range\",\n splitRange: `${params.startPage}-${params.endPage}`,\n };\n\n yield* Effect.logInfo(\n `Successfully split PDF to pages ${params.startPage}-${params.endPage}`,\n );\n\n return completeNodeExecution({\n ...uploadResult,\n metadata: newMetadata,\n });\n });\n },\n });\n });\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.mjs","names":["markdown: string","markdownSource: \"text\" | \"ocr\"","pdfBuffers: Uint8Array[]","pdfBytes","stream","uploadResult","newMetadata"],"sources":["../src/convert-to-markdown-node.ts","../src/describe-document-node.ts","../src/extract-text-node.ts","../src/merge-pdf-node.ts","../src/ocr-node.ts","../src/split-pdf-node.ts"],"sourcesContent":["import { UploadistaError } from \"@uploadista/core/errors\";\nimport {\n completeNodeExecution,\n createFlowNode,\n DocumentAiPlugin,\n DocumentPlugin,\n NodeType,\n resolveUploadMetadata,\n STORAGE_OUTPUT_TYPE_ID,\n} from \"@uploadista/core/flow\";\nimport { uploadFileSchema } from \"@uploadista/core/types\";\nimport { UploadServer } from \"@uploadista/core/upload\";\nimport { Effect, Either } from \"effect\";\n\nexport type ConvertToMarkdownNodeParams = {\n credentialId?: string;\n resolution?: \"tiny\" | \"small\" | \"base\" | \"gundam\" | \"large\";\n keepOutput?: boolean;\n};\n\nexport function createConvertToMarkdownNode(\n id: string,\n params: ConvertToMarkdownNodeParams = {},\n) {\n return Effect.gen(function* () {\n const documentService = yield* DocumentPlugin;\n const documentAiService = yield* DocumentAiPlugin;\n const uploadServer = yield* UploadServer;\n\n return yield* createFlowNode({\n id,\n name: \"Convert to Markdown\",\n description:\n \"Convert documents to Markdown format (intelligently uses OCR if needed)\",\n type: NodeType.process,\n nodeTypeId: STORAGE_OUTPUT_TYPE_ID,\n keepOutput: params.keepOutput,\n inputSchema: uploadFileSchema,\n outputSchema: uploadFileSchema,\n run: ({ data: file, flowId, jobId, clientId }) => {\n return Effect.gen(function* () {\n const flow = {\n flowId,\n nodeId: id,\n jobId,\n };\n\n yield* Effect.logInfo(`Converting file ${file.id} to Markdown`);\n\n // Read file bytes from upload server\n const fileBytes = yield* uploadServer.read(file.id, clientId);\n\n // Try to extract text first (for searchable PDFs)\n const extractResult = yield* documentService\n .extractText(fileBytes)\n .pipe(Effect.either);\n\n let markdown: string;\n let markdownSource: \"text\" | \"ocr\";\n\n if (\n Either.isRight(extractResult) &&\n extractResult.right.trim().length > 0\n ) {\n // Successfully extracted text from searchable PDF\n const text = extractResult.right;\n\n yield* Effect.logInfo(\n `Successfully extracted ${text.length} characters from searchable PDF`,\n );\n\n // Simple text-to-markdown conversion\n // In a real implementation, this could be more sophisticated\n markdown = text\n .split(\"\\n\\n\")\n .map((para: string) => para.trim())\n .filter((para: string) => para.length > 0)\n .join(\"\\n\\n\");\n\n markdownSource = \"text\";\n\n yield* Effect.logInfo(\n `Converted text to Markdown (${markdown.length} characters)`,\n );\n } else {\n // Text extraction failed or returned empty - use OCR\n yield* Effect.logInfo(\n \"Text extraction failed or returned empty, falling back to OCR\",\n );\n\n const fileUrl = file.url;\n\n if (!fileUrl) {\n return yield* UploadistaError.fromCode(\"FLOW_NODE_ERROR\", {\n cause: \"URL is required for OCR-based markdown conversion\",\n }).toEffect();\n }\n\n // Build context for DocumentAI plugin\n const context = {\n clientId,\n credentialId: params.credentialId,\n };\n\n // Perform OCR with markdown conversion\n const ocrResult = yield* documentAiService\n .performOCR(\n fileUrl,\n {\n taskType: \"convertToMarkdown\",\n resolution: params.resolution || \"gundam\",\n },\n context,\n )\n .pipe(\n Effect.catchAll((error) =>\n Effect.gen(function* () {\n yield* Effect.logError(\"Failed to perform OCR\", error);\n return yield* UploadistaError.fromCode(\"FLOW_NODE_ERROR\", {\n cause:\n error instanceof Error\n ? error.message\n : \"Failed to perform OCR for markdown conversion\",\n }).toEffect();\n }),\n ),\n );\n\n markdown = ocrResult.extractedText;\n markdownSource = \"ocr\";\n\n yield* Effect.logInfo(\n `Successfully converted scanned document to Markdown using OCR (${markdown.length} characters)`,\n );\n }\n\n const { metadata } = resolveUploadMetadata(file.metadata);\n\n // Add markdown to metadata\n const newMetadata = {\n ...file.metadata,\n ...metadata,\n markdown,\n markdownSource,\n };\n\n yield* Effect.logInfo(\n `Successfully converted file ${file.id} to Markdown via ${markdownSource}`,\n );\n\n return completeNodeExecution({\n ...file,\n metadata: newMetadata,\n flow,\n });\n });\n },\n });\n });\n}\n","import { UploadistaError } from \"@uploadista/core/errors\";\nimport {\n completeNodeExecution,\n createFlowNode,\n DocumentPlugin,\n NodeType,\n resolveUploadMetadata,\n} from \"@uploadista/core/flow\";\nimport { uploadFileSchema } from \"@uploadista/core/types\";\nimport { UploadServer } from \"@uploadista/core/upload\";\nimport { Effect } from \"effect\";\n\nexport type DescribeDocumentNodeParams = {\n keepOutput?: boolean;\n};\n\nexport function createDescribeDocumentNode(\n id: string,\n params: DescribeDocumentNodeParams = {},\n) {\n return Effect.gen(function* () {\n const documentService = yield* DocumentPlugin;\n const uploadServer = yield* UploadServer;\n\n return yield* createFlowNode({\n id,\n name: \"Describe Document\",\n description: \"Extract metadata from PDF documents\",\n type: NodeType.process,\n keepOutput: params.keepOutput,\n inputSchema: uploadFileSchema,\n outputSchema: uploadFileSchema,\n run: ({ data: file, flowId, jobId, clientId }) => {\n return Effect.gen(function* () {\n const flow = {\n flowId,\n nodeId: id,\n jobId,\n };\n\n yield* Effect.logInfo(\n `Extracting metadata from PDF file ${file.id}`,\n );\n\n // Read file bytes from upload server\n const fileBytes = yield* uploadServer.read(file.id, clientId);\n\n // Get metadata with error handling\n const documentMetadata = yield* documentService\n .getMetadata(fileBytes)\n .pipe(\n Effect.catchAll((error) =>\n Effect.gen(function* () {\n yield* Effect.logError(\"Failed to extract metadata\", error);\n return yield* UploadistaError.fromCode(\"FLOW_NODE_ERROR\", {\n cause:\n error instanceof Error\n ? error.message\n : \"Failed to extract metadata\",\n }).toEffect();\n }),\n ),\n );\n\n const { metadata } = resolveUploadMetadata(file.metadata);\n\n // Add document metadata to file metadata (filter out null values)\n const newMetadata = {\n ...file.metadata,\n ...metadata,\n pageCount: documentMetadata.pageCount,\n format: documentMetadata.format,\n ...(documentMetadata.author && { author: documentMetadata.author }),\n ...(documentMetadata.title && { title: documentMetadata.title }),\n ...(documentMetadata.subject && { subject: documentMetadata.subject }),\n ...(documentMetadata.creator && { creator: documentMetadata.creator }),\n ...(documentMetadata.creationDate && { creationDate: documentMetadata.creationDate }),\n ...(documentMetadata.modifiedDate && { modifiedDate: documentMetadata.modifiedDate }),\n fileSize: documentMetadata.fileSize,\n };\n\n yield* Effect.logInfo(\n `Successfully extracted metadata from file ${file.id}: ${documentMetadata.pageCount} pages`,\n );\n\n return completeNodeExecution({\n ...file,\n metadata: newMetadata,\n flow,\n });\n });\n },\n });\n });\n}\n","import { UploadistaError } from \"@uploadista/core/errors\";\nimport {\n completeNodeExecution,\n createFlowNode,\n DocumentPlugin,\n NodeType,\n resolveUploadMetadata,\n STORAGE_OUTPUT_TYPE_ID,\n} from \"@uploadista/core/flow\";\nimport { uploadFileSchema } from \"@uploadista/core/types\";\nimport { UploadServer } from \"@uploadista/core/upload\";\nimport { Effect } from \"effect\";\n\nexport type ExtractTextNodeParams = {\n keepOutput?: boolean;\n};\n\nexport function createExtractTextNode(\n id: string,\n params: ExtractTextNodeParams = {},\n) {\n return Effect.gen(function* () {\n const documentService = yield* DocumentPlugin;\n const uploadServer = yield* UploadServer;\n\n return yield* createFlowNode({\n id,\n name: \"Extract Text\",\n description: \"Extract text from searchable PDF documents\",\n type: NodeType.process,\n nodeTypeId: STORAGE_OUTPUT_TYPE_ID,\n keepOutput: params.keepOutput,\n inputSchema: uploadFileSchema,\n outputSchema: uploadFileSchema,\n run: ({ data: file, flowId, jobId, clientId }) => {\n return Effect.gen(function* () {\n const flow = {\n flowId,\n nodeId: id,\n jobId,\n };\n\n yield* Effect.logInfo(`Extracting text from PDF file ${file.id}`);\n\n // Read file bytes from upload server\n const fileBytes = yield* uploadServer.read(file.id, clientId);\n\n // Extract text with error handling\n const extractedText = yield* documentService\n .extractText(fileBytes)\n .pipe(\n Effect.catchAll((error) =>\n Effect.gen(function* () {\n yield* Effect.logError(\"Failed to extract text\", error);\n return yield* UploadistaError.fromCode(\"FLOW_NODE_ERROR\", {\n cause:\n error instanceof Error\n ? error.message\n : \"Failed to extract text\",\n }).toEffect();\n }),\n ),\n );\n\n const { metadata } = resolveUploadMetadata(file.metadata);\n\n // Add extracted text to metadata\n const newMetadata = {\n ...file.metadata,\n ...metadata,\n extractedText,\n };\n\n if (!extractedText || extractedText.trim().length === 0) {\n yield* Effect.logWarning(\n `No text extracted from file ${file.id}. This might be a scanned document. Consider using the OCR node instead.`,\n );\n } else {\n yield* Effect.logInfo(\n `Successfully extracted ${extractedText.length} characters from file ${file.id}`,\n );\n }\n\n return completeNodeExecution({\n ...file,\n metadata: newMetadata,\n flow,\n });\n });\n },\n });\n });\n}\n","import { UploadistaError } from \"@uploadista/core/errors\";\nimport {\n completeNodeExecution,\n createFlowNode,\n DocumentPlugin,\n NodeType,\n resolveUploadMetadata,\n STORAGE_OUTPUT_TYPE_ID,\n} from \"@uploadista/core/flow\";\nimport { uploadFileSchema } from \"@uploadista/core/types\";\nimport { UploadServer } from \"@uploadista/core/upload\";\nimport { Effect } from \"effect\";\nimport { z } from \"zod\";\n\nexport type MergePdfNodeParams = {\n inputCount?: number;\n keepOutput?: boolean;\n};\n\n// Schema for multiple file inputs\nconst multipleFilesSchema = z.array(uploadFileSchema);\n\nexport function createMergePdfNode(\n id: string,\n params: MergePdfNodeParams = {},\n) {\n return Effect.gen(function* () {\n const documentService = yield* DocumentPlugin;\n const uploadServer = yield* UploadServer;\n\n return yield* createFlowNode({\n id,\n name: \"Merge PDFs\",\n description: \"Merge multiple PDF documents into one\",\n type: NodeType.process,\n nodeTypeId: STORAGE_OUTPUT_TYPE_ID,\n keepOutput: params.keepOutput,\n inputSchema: multipleFilesSchema,\n outputSchema: uploadFileSchema,\n run: ({ data: files, flowId, jobId, clientId }) => {\n return Effect.gen(function* () {\n const flow = {\n flowId,\n nodeId: id,\n jobId,\n };\n\n // Validate that we have an array of files\n if (!Array.isArray(files)) {\n return yield* UploadistaError.fromCode(\"FLOW_NODE_ERROR\", {\n cause:\n \"Merge PDF node requires an array of files from a Merge utility node\",\n }).toEffect();\n }\n\n if (files.length === 0) {\n return yield* UploadistaError.fromCode(\"FLOW_NODE_ERROR\", {\n cause: \"At least one PDF file is required for merging\",\n }).toEffect();\n }\n\n // Read buffers from all files\n const pdfBuffers: Uint8Array[] = [];\n let totalPages = 0;\n\n for (const file of files) {\n // Read file bytes from upload server\n const fileBytes = yield* uploadServer.read(file.id, clientId);\n pdfBuffers.push(fileBytes);\n\n // Sum up page counts if available\n const fileMetadata = resolveUploadMetadata(file.metadata).metadata;\n if (\n fileMetadata?.pageCount &&\n typeof fileMetadata.pageCount === \"number\"\n ) {\n totalPages += fileMetadata.pageCount;\n }\n }\n\n yield* Effect.logInfo(`Merging ${files.length} PDF files`);\n\n // Merge PDFs with error handling\n const mergedPdf = yield* documentService\n .mergePdfs({ pdfs: pdfBuffers })\n .pipe(\n Effect.catchAll((error) =>\n Effect.gen(function* () {\n yield* Effect.logError(\"Failed to merge PDFs\", error);\n return yield* UploadistaError.fromCode(\"FLOW_NODE_ERROR\", {\n cause:\n error instanceof Error\n ? error.message\n : \"Failed to merge PDFs\",\n }).toEffect();\n }),\n ),\n );\n\n // Use metadata from first file as base\n const firstFile = files[0];\n const { metadata } = resolveUploadMetadata(firstFile.metadata);\n\n // Create a stream from the merged PDF bytes\n const stream = new ReadableStream({\n start(controller) {\n controller.enqueue(mergedPdf);\n controller.close();\n },\n });\n\n // Upload the merged PDF back to the upload server\n const result = yield* uploadServer.upload(\n {\n storageId: firstFile.storage.id,\n size: mergedPdf.byteLength,\n type: \"application/pdf\",\n fileName: `merged-${files.length}-documents.pdf`,\n lastModified: 0,\n metadata: JSON.stringify({\n ...metadata,\n pageCount: totalPages,\n mergedFrom: files.length,\n }),\n flow,\n },\n clientId,\n stream,\n );\n\n const newMetadata = {\n ...metadata,\n pageCount: totalPages,\n mergedFrom: files.length,\n fileName: `merged-${files.length}-documents.pdf`,\n };\n\n yield* Effect.logInfo(\n `Successfully merged ${files.length} PDFs into one document with ${totalPages} pages`,\n );\n\n return completeNodeExecution({\n ...result,\n metadata: newMetadata,\n });\n });\n },\n });\n });\n}\n","import { UploadistaError } from \"@uploadista/core/errors\";\nimport {\n completeNodeExecution,\n createFlowNode,\n DocumentAiPlugin,\n NodeType,\n OCR_OUTPUT_TYPE_ID,\n type OcrResolution,\n type OcrTaskType,\n ocrOutputSchema,\n} from \"@uploadista/core/flow\";\nimport { uploadFileSchema } from \"@uploadista/core/types\";\nimport { Effect } from \"effect\";\n\nexport type OcrNodeParams = {\n taskType: OcrTaskType;\n resolution?: OcrResolution;\n credentialId?: string;\n referenceText?: string;\n keepOutput?: boolean;\n};\n\nexport function createOcrNode(id: string, params: OcrNodeParams) {\n return Effect.gen(function* () {\n const documentAiService = yield* DocumentAiPlugin;\n\n return yield* createFlowNode({\n id,\n name: \"OCR\",\n description: \"Extract text from scanned documents using AI\",\n type: NodeType.process,\n nodeTypeId: OCR_OUTPUT_TYPE_ID,\n keepOutput: params.keepOutput,\n inputSchema: uploadFileSchema,\n outputSchema: ocrOutputSchema,\n run: ({ data: file, flowId, jobId, clientId }) => {\n return Effect.gen(function* () {\n const flow = {\n flowId,\n nodeId: id,\n jobId,\n };\n\n const fileUrl = file.url;\n\n // Validate input\n if (!fileUrl) {\n return yield* UploadistaError.fromCode(\"FLOW_NODE_ERROR\", {\n cause: \"URL is required for OCR operation\",\n }).toEffect();\n }\n\n yield* Effect.logInfo(\n `Starting OCR for file ${file.id} with task type: ${params.taskType}`,\n );\n\n // Build context for DocumentAI plugin\n const context = {\n clientId,\n credentialId: params.credentialId,\n };\n\n // Perform OCR with error handling\n const ocrResult = yield* documentAiService\n .performOCR(\n fileUrl,\n {\n taskType: params.taskType,\n resolution: params.resolution,\n referenceText: params.referenceText,\n },\n context,\n )\n .pipe(\n Effect.catchAll((error) =>\n Effect.gen(function* () {\n yield* Effect.logError(\"Failed to perform OCR\", error);\n return yield* UploadistaError.fromCode(\"FLOW_NODE_ERROR\", {\n cause:\n error instanceof Error\n ? error.message\n : \"Failed to perform OCR\",\n }).toEffect();\n }),\n ),\n );\n\n yield* Effect.logInfo(\n `Successfully completed OCR for file ${file.id}, extracted ${ocrResult.extractedText.length} characters`,\n );\n\n // Return structured OCR output (not UploadFile)\n return completeNodeExecution({\n extractedText: ocrResult.extractedText,\n format: ocrResult.format,\n taskType: params.taskType,\n confidence: ocrResult.confidence,\n flow,\n });\n });\n },\n });\n });\n}\n","import { UploadistaError } from \"@uploadista/core/errors\";\nimport {\n completeNodeExecution,\n createFlowNode,\n DocumentPlugin,\n NodeType,\n resolveUploadMetadata,\n STORAGE_OUTPUT_TYPE_ID,\n} from \"@uploadista/core/flow\";\nimport { uploadFileSchema } from \"@uploadista/core/types\";\nimport { UploadServer } from \"@uploadista/core/upload\";\nimport { Effect } from \"effect\";\n\nexport type SplitPdfNodeParams = {\n mode: \"range\" | \"individual\";\n startPage?: number;\n endPage?: number;\n keepOutput?: boolean;\n};\n\nexport function createSplitPdfNode(id: string, params: SplitPdfNodeParams) {\n return Effect.gen(function* () {\n const documentService = yield* DocumentPlugin;\n const uploadServer = yield* UploadServer;\n\n return yield* createFlowNode({\n id,\n name: \"Split PDF\",\n description: \"Split PDF into pages or page ranges\",\n type: NodeType.process,\n nodeTypeId: STORAGE_OUTPUT_TYPE_ID,\n keepOutput: params.keepOutput,\n inputSchema: uploadFileSchema,\n outputSchema: uploadFileSchema,\n run: ({ data: file, flowId, jobId, clientId }) => {\n return Effect.gen(function* () {\n const flow = {\n flowId,\n nodeId: id,\n jobId,\n };\n\n yield* Effect.logInfo(\n `Splitting PDF file ${file.id} in ${params.mode} mode`,\n );\n\n // Read file bytes from upload server\n const fileBytes = yield* uploadServer.read(file.id, clientId);\n\n // Split PDF with error handling\n const result = yield* documentService\n .splitPdf(fileBytes, params)\n .pipe(\n Effect.catchAll((error) =>\n Effect.gen(function* () {\n yield* Effect.logError(\"Failed to split PDF\", error);\n return yield* UploadistaError.fromCode(\"FLOW_NODE_ERROR\", {\n cause:\n error instanceof Error\n ? error.message\n : \"Failed to split PDF\",\n }).toEffect();\n }),\n ),\n );\n\n const { metadata } = resolveUploadMetadata(file.metadata);\n\n if (result.mode === \"individual\") {\n // Return array of files (one per page)\n yield* Effect.logInfo(\n `Successfully split PDF into ${result.pdfs.length} individual pages`,\n );\n\n // For individual mode, we'd need to return multiple files\n // This requires special handling in the flow engine\n // For now, we'll return the first page and log a warning\n yield* Effect.logWarning(\n \"Individual page mode returns multiple files - flow engine support required\",\n );\n\n const pdfBytes = result.pdfs[0];\n\n // Create a stream from the PDF bytes\n const stream = new ReadableStream({\n start(controller) {\n controller.enqueue(pdfBytes);\n controller.close();\n },\n });\n\n // Upload the split PDF back to the upload server\n const uploadResult = yield* uploadServer.upload(\n {\n storageId: file.storage.id,\n size: pdfBytes.byteLength,\n type: \"application/pdf\",\n fileName: `${metadata?.fileName || \"document\"}-page-1.pdf`,\n lastModified: 0,\n metadata: JSON.stringify({\n ...metadata,\n pageCount: 1,\n splitMode: \"individual\",\n }),\n flow,\n },\n clientId,\n stream,\n );\n\n const newMetadata = {\n ...metadata,\n pageCount: 1,\n splitMode: \"individual\",\n };\n\n return completeNodeExecution({\n ...uploadResult,\n metadata: newMetadata,\n });\n }\n\n // Range mode - return single PDF with selected pages\n const pageCount =\n params.endPage && params.startPage\n ? params.endPage - params.startPage + 1\n : 1;\n\n const pdfBytes = result.pdf;\n\n // Create a stream from the PDF bytes\n const stream = new ReadableStream({\n start(controller) {\n controller.enqueue(pdfBytes);\n controller.close();\n },\n });\n\n // Upload the split PDF back to the upload server\n const uploadResult = yield* uploadServer.upload(\n {\n storageId: file.storage.id,\n size: pdfBytes.byteLength,\n type: \"application/pdf\",\n fileName: `${metadata?.fileName || \"document\"}-pages-${params.startPage}-${params.endPage}.pdf`,\n lastModified: 0,\n metadata: JSON.stringify({\n ...metadata,\n pageCount,\n splitMode: \"range\",\n splitRange: `${params.startPage}-${params.endPage}`,\n }),\n flow,\n },\n clientId,\n stream,\n );\n\n const newMetadata = {\n ...metadata,\n pageCount,\n splitMode: \"range\",\n splitRange: `${params.startPage}-${params.endPage}`,\n };\n\n yield* Effect.logInfo(\n `Successfully split PDF to pages ${params.startPage}-${params.endPage}`,\n );\n\n return completeNodeExecution({\n ...uploadResult,\n metadata: newMetadata,\n });\n });\n },\n });\n });\n}\n"],"mappings":"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"}
|
package/dist/types/index.d.cts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { a as MergePdfParams, c as extractTextParamsSchema, d as ConvertToMarkdownParams, f as convertToMarkdownParamsSchema, i as ocrParamsSchema, l as DescribeDocumentParams, n as splitPdfParamsSchema, o as mergePdfParamsSchema, r as OcrParams, s as ExtractTextParams, t as SplitPdfParams, u as describeDocumentParamsSchema } from "../index-
|
|
1
|
+
import { a as MergePdfParams, c as extractTextParamsSchema, d as ConvertToMarkdownParams, f as convertToMarkdownParamsSchema, i as ocrParamsSchema, l as DescribeDocumentParams, n as splitPdfParamsSchema, o as mergePdfParamsSchema, r as OcrParams, s as ExtractTextParams, t as SplitPdfParams, u as describeDocumentParamsSchema } from "../index-CN8GG19X.cjs";
|
|
2
2
|
export { ConvertToMarkdownParams, DescribeDocumentParams, ExtractTextParams, MergePdfParams, OcrParams, SplitPdfParams, convertToMarkdownParamsSchema, describeDocumentParamsSchema, extractTextParamsSchema, mergePdfParamsSchema, ocrParamsSchema, splitPdfParamsSchema };
|
package/dist/types/index.d.mts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { a as MergePdfParams, c as extractTextParamsSchema, d as ConvertToMarkdownParams, f as convertToMarkdownParamsSchema, i as ocrParamsSchema, l as DescribeDocumentParams, n as splitPdfParamsSchema, o as mergePdfParamsSchema, r as OcrParams, s as ExtractTextParams, t as SplitPdfParams, u as describeDocumentParamsSchema } from "../index-
|
|
1
|
+
import { a as MergePdfParams, c as extractTextParamsSchema, d as ConvertToMarkdownParams, f as convertToMarkdownParamsSchema, i as ocrParamsSchema, l as DescribeDocumentParams, n as splitPdfParamsSchema, o as mergePdfParamsSchema, r as OcrParams, s as ExtractTextParams, t as SplitPdfParams, u as describeDocumentParamsSchema } from "../index-DXwYQF9t.mjs";
|
|
2
2
|
export { ConvertToMarkdownParams, DescribeDocumentParams, ExtractTextParams, MergePdfParams, OcrParams, SplitPdfParams, convertToMarkdownParamsSchema, describeDocumentParamsSchema, extractTextParamsSchema, mergePdfParamsSchema, ocrParamsSchema, splitPdfParamsSchema };
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@uploadista/flow-documents-nodes",
|
|
3
3
|
"type": "module",
|
|
4
|
-
"version": "0.0.17-beta.
|
|
4
|
+
"version": "0.0.17-beta.4",
|
|
5
5
|
"description": "Document processing nodes for Uploadista Flow",
|
|
6
6
|
"license": "MIT",
|
|
7
7
|
"author": "Uploadista",
|
|
@@ -22,14 +22,14 @@
|
|
|
22
22
|
"dependencies": {
|
|
23
23
|
"effect": "3.19.4",
|
|
24
24
|
"zod": "4.1.12",
|
|
25
|
-
"@uploadista/core": "0.0.17-beta.
|
|
25
|
+
"@uploadista/core": "0.0.17-beta.4"
|
|
26
26
|
},
|
|
27
27
|
"devDependencies": {
|
|
28
28
|
"@effect/vitest": "0.27.0",
|
|
29
29
|
"@types/node": "24.10.1",
|
|
30
30
|
"tsdown": "0.16.5",
|
|
31
31
|
"vitest": "4.0.10",
|
|
32
|
-
"@uploadista/typescript-config": "0.0.17-beta.
|
|
32
|
+
"@uploadista/typescript-config": "0.0.17-beta.4"
|
|
33
33
|
},
|
|
34
34
|
"scripts": {
|
|
35
35
|
"build": "tsdown",
|
|
@@ -15,6 +15,7 @@ import { Effect, Either } from "effect";
|
|
|
15
15
|
export type ConvertToMarkdownNodeParams = {
|
|
16
16
|
credentialId?: string;
|
|
17
17
|
resolution?: "tiny" | "small" | "base" | "gundam" | "large";
|
|
18
|
+
keepOutput?: boolean;
|
|
18
19
|
};
|
|
19
20
|
|
|
20
21
|
export function createConvertToMarkdownNode(
|
|
@@ -33,6 +34,7 @@ export function createConvertToMarkdownNode(
|
|
|
33
34
|
"Convert documents to Markdown format (intelligently uses OCR if needed)",
|
|
34
35
|
type: NodeType.process,
|
|
35
36
|
nodeTypeId: STORAGE_OUTPUT_TYPE_ID,
|
|
37
|
+
keepOutput: params.keepOutput,
|
|
36
38
|
inputSchema: uploadFileSchema,
|
|
37
39
|
outputSchema: uploadFileSchema,
|
|
38
40
|
run: ({ data: file, flowId, jobId, clientId }) => {
|
|
@@ -10,11 +10,13 @@ import { uploadFileSchema } from "@uploadista/core/types";
|
|
|
10
10
|
import { UploadServer } from "@uploadista/core/upload";
|
|
11
11
|
import { Effect } from "effect";
|
|
12
12
|
|
|
13
|
-
export type DescribeDocumentNodeParams =
|
|
13
|
+
export type DescribeDocumentNodeParams = {
|
|
14
|
+
keepOutput?: boolean;
|
|
15
|
+
};
|
|
14
16
|
|
|
15
17
|
export function createDescribeDocumentNode(
|
|
16
18
|
id: string,
|
|
17
|
-
|
|
19
|
+
params: DescribeDocumentNodeParams = {},
|
|
18
20
|
) {
|
|
19
21
|
return Effect.gen(function* () {
|
|
20
22
|
const documentService = yield* DocumentPlugin;
|
|
@@ -25,6 +27,7 @@ export function createDescribeDocumentNode(
|
|
|
25
27
|
name: "Describe Document",
|
|
26
28
|
description: "Extract metadata from PDF documents",
|
|
27
29
|
type: NodeType.process,
|
|
30
|
+
keepOutput: params.keepOutput,
|
|
28
31
|
inputSchema: uploadFileSchema,
|
|
29
32
|
outputSchema: uploadFileSchema,
|
|
30
33
|
run: ({ data: file, flowId, jobId, clientId }) => {
|
package/src/extract-text-node.ts
CHANGED
|
@@ -11,11 +11,13 @@ import { uploadFileSchema } from "@uploadista/core/types";
|
|
|
11
11
|
import { UploadServer } from "@uploadista/core/upload";
|
|
12
12
|
import { Effect } from "effect";
|
|
13
13
|
|
|
14
|
-
export type ExtractTextNodeParams =
|
|
14
|
+
export type ExtractTextNodeParams = {
|
|
15
|
+
keepOutput?: boolean;
|
|
16
|
+
};
|
|
15
17
|
|
|
16
18
|
export function createExtractTextNode(
|
|
17
19
|
id: string,
|
|
18
|
-
|
|
20
|
+
params: ExtractTextNodeParams = {},
|
|
19
21
|
) {
|
|
20
22
|
return Effect.gen(function* () {
|
|
21
23
|
const documentService = yield* DocumentPlugin;
|
|
@@ -27,6 +29,7 @@ export function createExtractTextNode(
|
|
|
27
29
|
description: "Extract text from searchable PDF documents",
|
|
28
30
|
type: NodeType.process,
|
|
29
31
|
nodeTypeId: STORAGE_OUTPUT_TYPE_ID,
|
|
32
|
+
keepOutput: params.keepOutput,
|
|
30
33
|
inputSchema: uploadFileSchema,
|
|
31
34
|
outputSchema: uploadFileSchema,
|
|
32
35
|
run: ({ data: file, flowId, jobId, clientId }) => {
|
package/src/merge-pdf-node.ts
CHANGED
|
@@ -14,6 +14,7 @@ import { z } from "zod";
|
|
|
14
14
|
|
|
15
15
|
export type MergePdfNodeParams = {
|
|
16
16
|
inputCount?: number;
|
|
17
|
+
keepOutput?: boolean;
|
|
17
18
|
};
|
|
18
19
|
|
|
19
20
|
// Schema for multiple file inputs
|
|
@@ -21,7 +22,7 @@ const multipleFilesSchema = z.array(uploadFileSchema);
|
|
|
21
22
|
|
|
22
23
|
export function createMergePdfNode(
|
|
23
24
|
id: string,
|
|
24
|
-
|
|
25
|
+
params: MergePdfNodeParams = {},
|
|
25
26
|
) {
|
|
26
27
|
return Effect.gen(function* () {
|
|
27
28
|
const documentService = yield* DocumentPlugin;
|
|
@@ -33,6 +34,7 @@ export function createMergePdfNode(
|
|
|
33
34
|
description: "Merge multiple PDF documents into one",
|
|
34
35
|
type: NodeType.process,
|
|
35
36
|
nodeTypeId: STORAGE_OUTPUT_TYPE_ID,
|
|
37
|
+
keepOutput: params.keepOutput,
|
|
36
38
|
inputSchema: multipleFilesSchema,
|
|
37
39
|
outputSchema: uploadFileSchema,
|
|
38
40
|
run: ({ data: files, flowId, jobId, clientId }) => {
|
package/src/ocr-node.ts
CHANGED
|
@@ -17,6 +17,7 @@ export type OcrNodeParams = {
|
|
|
17
17
|
resolution?: OcrResolution;
|
|
18
18
|
credentialId?: string;
|
|
19
19
|
referenceText?: string;
|
|
20
|
+
keepOutput?: boolean;
|
|
20
21
|
};
|
|
21
22
|
|
|
22
23
|
export function createOcrNode(id: string, params: OcrNodeParams) {
|
|
@@ -29,6 +30,7 @@ export function createOcrNode(id: string, params: OcrNodeParams) {
|
|
|
29
30
|
description: "Extract text from scanned documents using AI",
|
|
30
31
|
type: NodeType.process,
|
|
31
32
|
nodeTypeId: OCR_OUTPUT_TYPE_ID,
|
|
33
|
+
keepOutput: params.keepOutput,
|
|
32
34
|
inputSchema: uploadFileSchema,
|
|
33
35
|
outputSchema: ocrOutputSchema,
|
|
34
36
|
run: ({ data: file, flowId, jobId, clientId }) => {
|
package/src/split-pdf-node.ts
CHANGED
|
@@ -15,6 +15,7 @@ export type SplitPdfNodeParams = {
|
|
|
15
15
|
mode: "range" | "individual";
|
|
16
16
|
startPage?: number;
|
|
17
17
|
endPage?: number;
|
|
18
|
+
keepOutput?: boolean;
|
|
18
19
|
};
|
|
19
20
|
|
|
20
21
|
export function createSplitPdfNode(id: string, params: SplitPdfNodeParams) {
|
|
@@ -28,6 +29,7 @@ export function createSplitPdfNode(id: string, params: SplitPdfNodeParams) {
|
|
|
28
29
|
description: "Split PDF into pages or page ranges",
|
|
29
30
|
type: NodeType.process,
|
|
30
31
|
nodeTypeId: STORAGE_OUTPUT_TYPE_ID,
|
|
32
|
+
keepOutput: params.keepOutput,
|
|
31
33
|
inputSchema: uploadFileSchema,
|
|
32
34
|
outputSchema: uploadFileSchema,
|
|
33
35
|
run: ({ data: file, flowId, jobId, clientId }) => {
|