@uploadista/flow-utility-nodes 0.0.3 → 0.0.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 +29 -2
- package/dist/chunk-DjWAcSYV.cjs +1 -0
- package/dist/nodes/index.cjs +1 -0
- package/dist/nodes/index.d.cts +36 -0
- package/dist/nodes/index.d.cts.map +1 -0
- package/dist/nodes/index.d.ts +35 -4
- package/dist/nodes/index.d.ts.map +1 -1
- package/dist/nodes/index.js +2 -4
- package/dist/nodes/index.js.map +1 -0
- package/dist/types/index.cjs +2 -0
- package/dist/types/index.d.cts +2 -0
- package/dist/types/index.d.ts +2 -5
- package/dist/types/index.js +3 -4
- package/dist/types/index.js.map +1 -0
- package/dist/zip-node-BbFUu_Oc.d.cts +54 -0
- package/dist/zip-node-BbFUu_Oc.d.cts.map +1 -0
- package/dist/zip-node-BzneQXn3.d.ts +54 -0
- package/dist/zip-node-BzneQXn3.d.ts.map +1 -0
- package/package.json +5 -4
- package/tsdown.config.ts +12 -0
- package/dist/conditional-node.d.ts +0 -25
- package/dist/conditional-node.d.ts.map +0 -1
- package/dist/conditional-node.js +0 -34
- package/dist/index.d.ts +0 -5
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js +0 -4
- package/dist/merge-node.d.ts +0 -12
- package/dist/merge-node.d.ts.map +0 -1
- package/dist/merge-node.js +0 -77
- package/dist/multiplex-node.d.ts +0 -42
- package/dist/multiplex-node.d.ts.map +0 -1
- package/dist/multiplex-node.js +0 -67
- package/dist/nodes/conditional-node.d.ts +0 -5
- package/dist/nodes/conditional-node.d.ts.map +0 -1
- package/dist/nodes/conditional-node.js +0 -19
- package/dist/nodes/merge-node.d.ts +0 -7
- package/dist/nodes/merge-node.d.ts.map +0 -1
- package/dist/nodes/merge-node.js +0 -82
- package/dist/nodes/multiplex-node.d.ts +0 -7
- package/dist/nodes/multiplex-node.d.ts.map +0 -1
- package/dist/nodes/multiplex-node.js +0 -57
- package/dist/nodes/zip-node.d.ts +0 -8
- package/dist/nodes/zip-node.d.ts.map +0 -1
- package/dist/nodes/zip-node.js +0 -64
- package/dist/types/conditional-node.d.ts +0 -21
- package/dist/types/conditional-node.d.ts.map +0 -1
- package/dist/types/conditional-node.js +0 -13
- package/dist/types/index.d.ts.map +0 -1
- package/dist/types/merge-node.d.ts +0 -11
- package/dist/types/merge-node.d.ts.map +0 -1
- package/dist/types/merge-node.js +0 -6
- package/dist/types/multiplex-node.d.ts +0 -10
- package/dist/types/multiplex-node.d.ts.map +0 -1
- package/dist/types/multiplex-node.js +0 -5
- package/dist/types/zip-node.d.ts +0 -8
- package/dist/types/zip-node.d.ts.map +0 -1
- package/dist/types/zip-node.js +0 -6
- package/dist/zip-node.d.ts +0 -9
- package/dist/zip-node.d.ts.map +0 -1
- package/dist/zip-node.js +0 -65
package/.turbo/turbo-build.log
CHANGED
|
@@ -1,5 +1,32 @@
|
|
|
1
1
|
|
|
2
2
|
|
|
3
|
-
> @uploadista/flow-utility-nodes@0.0.
|
|
4
|
-
>
|
|
3
|
+
> @uploadista/flow-utility-nodes@0.0.3 build /Users/denislaboureyras/Documents/uploadista/dev/uploadista-workspace/uploadista-sdk/packages/flow/utility/nodes
|
|
4
|
+
> tsdown
|
|
5
5
|
|
|
6
|
+
[34mℹ[39m tsdown [2mv0.15.9[22m powered by rolldown [2mv1.0.0-beta.44[22m
|
|
7
|
+
[34mℹ[39m Using tsdown config: [4m/Users/denislaboureyras/Documents/uploadista/dev/uploadista-workspace/uploadista-sdk/packages/flow/utility/nodes/tsdown.config.ts[24m
|
|
8
|
+
[34mℹ[39m entry: [34msrc/nodes/index.ts, src/types/index.ts[39m
|
|
9
|
+
[34mℹ[39m tsconfig: [34mtsconfig.json[39m
|
|
10
|
+
[34mℹ[39m Build start
|
|
11
|
+
[34mℹ[39m Cleaning 19 files
|
|
12
|
+
[34mℹ[39m [33m[CJS][39m [2mdist/[22m[1mnodes/index.cjs[22m [2m4.34 kB[22m [2m│ gzip: 1.39 kB[22m
|
|
13
|
+
[34mℹ[39m [33m[CJS][39m [2mdist/[22m[1mtypes/index.cjs[22m [2m0.84 kB[22m [2m│ gzip: 0.42 kB[22m
|
|
14
|
+
[34mℹ[39m [33m[CJS][39m [2mdist/[22mchunk-DjWAcSYV.cjs [2m0.55 kB[22m [2m│ gzip: 0.34 kB[22m
|
|
15
|
+
[34mℹ[39m [33m[CJS][39m 3 files, total: 5.74 kB
|
|
16
|
+
[34mℹ[39m [34m[ESM][39m [2mdist/[22m[1mnodes/index.js[22m [2m 3.77 kB[22m [2m│ gzip: 1.35 kB[22m
|
|
17
|
+
[34mℹ[39m [34m[ESM][39m [2mdist/[22m[1mtypes/index.js[22m [2m 0.78 kB[22m [2m│ gzip: 0.41 kB[22m
|
|
18
|
+
[34mℹ[39m [34m[ESM][39m [2mdist/[22mnodes/index.js.map [2m14.16 kB[22m [2m│ gzip: 3.23 kB[22m
|
|
19
|
+
[34mℹ[39m [34m[ESM][39m [2mdist/[22mtypes/index.js.map [2m 2.26 kB[22m [2m│ gzip: 0.79 kB[22m
|
|
20
|
+
[34mℹ[39m [34m[ESM][39m [2mdist/[22mzip-node-BzneQXn3.d.ts.map [2m 0.65 kB[22m [2m│ gzip: 0.32 kB[22m
|
|
21
|
+
[34mℹ[39m [34m[ESM][39m [2mdist/[22mnodes/index.d.ts.map [2m 0.57 kB[22m [2m│ gzip: 0.26 kB[22m
|
|
22
|
+
[34mℹ[39m [34m[ESM][39m [2mdist/[22m[32m[1mnodes/index.d.ts[22m[39m [2m 1.74 kB[22m [2m│ gzip: 0.52 kB[22m
|
|
23
|
+
[34mℹ[39m [34m[ESM][39m [2mdist/[22m[32m[1mtypes/index.d.ts[22m[39m [2m 0.38 kB[22m [2m│ gzip: 0.18 kB[22m
|
|
24
|
+
[34mℹ[39m [34m[ESM][39m [2mdist/[22m[32mzip-node-BzneQXn3.d.ts[39m [2m 1.79 kB[22m [2m│ gzip: 0.60 kB[22m
|
|
25
|
+
[34mℹ[39m [34m[ESM][39m 9 files, total: 26.10 kB
|
|
26
|
+
[34mℹ[39m [33m[CJS][39m [2mdist/[22mzip-node-BbFUu_Oc.d.cts.map [2m0.65 kB[22m [2m│ gzip: 0.33 kB[22m
|
|
27
|
+
[34mℹ[39m [33m[CJS][39m [2mdist/[22mnodes/index.d.cts.map [2m0.57 kB[22m [2m│ gzip: 0.26 kB[22m
|
|
28
|
+
[34mℹ[39m [33m[CJS][39m [2mdist/[22m[32m[1mnodes/index.d.cts[22m[39m [2m1.75 kB[22m [2m│ gzip: 0.52 kB[22m
|
|
29
|
+
[34mℹ[39m [33m[CJS][39m [2mdist/[22m[32m[1mtypes/index.d.cts[22m[39m [2m0.38 kB[22m [2m│ gzip: 0.18 kB[22m
|
|
30
|
+
[34mℹ[39m [33m[CJS][39m [2mdist/[22m[32mzip-node-BbFUu_Oc.d.cts[39m [2m1.79 kB[22m [2m│ gzip: 0.61 kB[22m
|
|
31
|
+
[34mℹ[39m [33m[CJS][39m 5 files, total: 5.13 kB
|
|
32
|
+
[32m✔[39m Build complete in [32m11681ms[39m
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var e=Object.create,t=Object.defineProperty,n=Object.getOwnPropertyDescriptor,r=Object.getOwnPropertyNames,i=Object.getPrototypeOf,a=Object.prototype.hasOwnProperty,o=(e,i,o,s)=>{if(i&&typeof i==`object`||typeof i==`function`)for(var c=r(i),l=0,u=c.length,d;l<u;l++)d=c[l],!a.call(e,d)&&d!==o&&t(e,d,{get:(e=>i[e]).bind(null,d),enumerable:!(s=n(i,d))||s.enumerable});return e},s=(n,r,a)=>(a=n==null?{}:e(i(n)),o(r||!n||!n.__esModule?t(a,`default`,{value:n,enumerable:!0}):a,n));Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return s}});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
const e=require(`../chunk-DjWAcSYV.cjs`);let t=require(`@uploadista/core/flow`);t=e.t(t);let n=require(`@uploadista/core/types`);n=e.t(n);let r=require(`effect`);r=e.t(r);let i=require(`@uploadista/core/errors`);i=e.t(i);let a=require(`@uploadista/core/upload`);a=e.t(a);let o=require(`zod`);o=e.t(o);function s(e,{field:i,operator:a,value:o}){return(0,t.createFlowNode)({id:e,name:`Conditional Router`,description:`Routes flow based on ${i} ${a} ${o}`,type:t.NodeType.conditional,inputSchema:n.uploadFileSchema,outputSchema:n.uploadFileSchema,condition:{field:i,operator:a,value:o},run:({data:e})=>r.Effect.succeed((0,t.completeNodeExecution)(e))})}const c=o.z.record(o.z.string(),n.uploadFileSchema),l=n.uploadFileSchema;function u(e,{strategy:n,separator:o}){return r.Effect.gen(function*(){let o=yield*a.UploadServer;return yield*(0,t.createFlowNode)({id:e,name:`Merge Files`,description:`Merges multiple files using ${n} strategy`,type:t.NodeType.merge,inputSchema:c,outputSchema:l,multiInput:!0,run:({data:e,storageId:a,clientId:s})=>r.Effect.gen(function*(){if(!e||Object.keys(e).length===0)return yield*r.Effect.fail(i.UploadistaError.fromCode(`VALIDATION_ERROR`,{body:`No inputs provided to merge node`}));let c=Object.values(e);if(c.length===0)return yield*r.Effect.fail(i.UploadistaError.fromCode(`VALIDATION_ERROR`,{body:`No files to merge`}));switch(n){case`concat`:{let e=[],n=0;for(let t of c){let r=yield*o.read(t.id,s);e.push(r),n+=r.byteLength}let r=new Uint8Array(n),i=0;for(let t of e)r.set(t,i),i+=t.byteLength;let l=new ReadableStream({start(e){e.enqueue(r),e.close()}});return(0,t.completeNodeExecution)(yield*o.upload({storageId:a,size:r.byteLength,type:`application/octet-stream`,fileName:`merged_${c.length}_files.bin`,lastModified:0,metadata:JSON.stringify({mimeType:`application/octet-stream`,originalName:`merged_${c.length}_files`,extension:`bin`})},s,l))}default:return yield*r.Effect.fail(i.UploadistaError.fromCode(`VALIDATION_ERROR`,{body:`Unknown merge strategy: ${n}`}))}})})})}function d(e,{outputCount:o,strategy:s}){return r.Effect.gen(function*(){let o=yield*a.UploadServer;return yield*(0,t.createFlowNode)({id:e,name:`Multiplex`,description:`Multiplexes input using ${s} strategy`,type:t.NodeType.multiplex,inputSchema:n.uploadFileSchema,outputSchema:n.uploadFileSchema,multiOutput:!0,run:({data:e,storageId:n,clientId:a})=>r.Effect.gen(function*(){let{type:c,fileName:l,metadata:u,metadataJson:d}=(0,t.resolveUploadMetadata)(e.metadata),f=u?{...e,metadata:u}:e;if(s===`copy`){let e=yield*o.read(f.id,a),r=new ReadableStream({start(t){t.enqueue(e),t.close()}}),i=yield*o.upload({storageId:n,size:e.byteLength,type:c,fileName:l,lastModified:0,metadata:d},a,r),s=(0,t.resolveUploadMetadata)(i.metadata);return(0,t.completeNodeExecution)(s.metadata?{...i,metadata:s.metadata}:i)}else if(s===`split`)return yield*r.Effect.fail(i.UploadistaError.fromCode(`VALIDATION_ERROR`,{body:`Split strategy is not supported with UploadFile pattern`}));return yield*r.Effect.fail(i.UploadistaError.fromCode(`VALIDATION_ERROR`,{body:`Unknown multiplex strategy: ${s}`}))})})})}const f=o.z.record(o.z.string(),n.uploadFileSchema),p=n.uploadFileSchema;function m(e,{zipName:n,includeMetadata:o}){return r.Effect.gen(function*(){let s=yield*a.UploadServer,c=yield*t.ZipPlugin;return yield*(0,t.createFlowNode)({id:e,name:`Zip Files`,description:`Combines multiple files into a zip archive`,type:t.NodeType.process,inputSchema:f,outputSchema:p,multiInput:!0,run:({data:e,storageId:a,clientId:l})=>r.Effect.gen(function*(){if(!e||Object.keys(e).length===0)return yield*r.Effect.fail(i.UploadistaError.fromCode(`VALIDATION_ERROR`,{body:`No inputs provided to zip node`}));let u=yield*r.Effect.forEach(Object.values(e),e=>r.Effect.gen(function*(){let t=yield*s.read(e.id,l);return{id:e.id,data:t,metadata:e.metadata}}),{concurrency:`unbounded`}),d=yield*c.zip(u,{zipName:n,includeMetadata:o}),f=new ReadableStream({start(e){e.enqueue(d),e.close()}});return(0,t.completeNodeExecution)(yield*s.upload({storageId:a,size:d.byteLength,type:`application/zip`,fileName:n,lastModified:0,metadata:JSON.stringify({mimeType:`application/zip`,type:`application/zip`,originalName:n,fileName:n,extension:`zip`})},l,f))})})})}exports.createConditionalNode=s,exports.createMergeNode=u,exports.createMultiplexNode=d,exports.createZipNode=m;
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { a as MergeParams, r as MultiplexParams, s as ConditionalParams, t as ZipParams } from "../zip-node-BbFUu_Oc.cjs";
|
|
2
|
+
import * as _uploadista_core_errors0 from "@uploadista/core/errors";
|
|
3
|
+
import { UploadistaError } from "@uploadista/core/errors";
|
|
4
|
+
import * as _uploadista_core_flow0 from "@uploadista/core/flow";
|
|
5
|
+
import { ZipPlugin } from "@uploadista/core/flow";
|
|
6
|
+
import { UploadFile } from "@uploadista/core/types";
|
|
7
|
+
import { Effect } from "effect";
|
|
8
|
+
import { UploadServer } from "@uploadista/core/upload";
|
|
9
|
+
|
|
10
|
+
//#region src/nodes/conditional-node.d.ts
|
|
11
|
+
declare function createConditionalNode(id: string, {
|
|
12
|
+
field,
|
|
13
|
+
operator,
|
|
14
|
+
value
|
|
15
|
+
}: ConditionalParams): Effect.Effect<_uploadista_core_flow0.FlowNode<UploadFile, UploadFile, _uploadista_core_errors0.UploadistaError>, never, never>;
|
|
16
|
+
//#endregion
|
|
17
|
+
//#region src/nodes/merge-node.d.ts
|
|
18
|
+
declare function createMergeNode(id: string, {
|
|
19
|
+
strategy,
|
|
20
|
+
separator: _separator
|
|
21
|
+
}: MergeParams): Effect.Effect<_uploadista_core_flow0.FlowNode<Record<string, UploadFile>, UploadFile, UploadistaError>, never, UploadServer>;
|
|
22
|
+
//#endregion
|
|
23
|
+
//#region src/nodes/multiplex-node.d.ts
|
|
24
|
+
declare function createMultiplexNode(id: string, {
|
|
25
|
+
outputCount: _outputCount,
|
|
26
|
+
strategy
|
|
27
|
+
}: MultiplexParams): Effect.Effect<_uploadista_core_flow0.FlowNode<UploadFile, UploadFile, UploadistaError>, never, UploadServer>;
|
|
28
|
+
//#endregion
|
|
29
|
+
//#region src/nodes/zip-node.d.ts
|
|
30
|
+
declare function createZipNode(id: string, {
|
|
31
|
+
zipName,
|
|
32
|
+
includeMetadata
|
|
33
|
+
}: ZipParams): Effect.Effect<_uploadista_core_flow0.FlowNode<Record<string, UploadFile>, UploadFile, UploadistaError>, never, UploadServer | ZipPlugin>;
|
|
34
|
+
//#endregion
|
|
35
|
+
export { createConditionalNode, createMergeNode, createMultiplexNode, createZipNode };
|
|
36
|
+
//# sourceMappingURL=index.d.cts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.cts","names":[],"sources":["../../src/nodes/conditional-node.ts","../../src/nodes/merge-node.ts","../../src/nodes/multiplex-node.ts","../../src/nodes/zip-node.ts"],"sourcesContent":[],"mappings":";;;;;;;;;;iBASgB,qBAAA;;;;GAEc,oBAAiB,MAAA,CAAA,OAAA,sBAAA,CAAA,SAAA,YAAA,YAAA,wBAAA,CAAA,eAAA;;;iBCI/B,eAAA;;aAES;GAAc,cAAW,MAAA,CAAA,OAAA,sBAAA,CAAA,SAAA,eAAA,aAAA,YAAA,yBAAA;;;iBCLlC,mBAAA;eAEC;;GAA0B,kBAAe,MAAA,CAAA,OAAA,sBAAA,CAAA,SAAA,YAAA,YAAA,yBAAA;;;iBCE1C,aAAA;;;GAEgB,YAAS,MAAA,CAAA,OAAA,sBAAA,CAAA,SAAA,eAAA,aAAA,YAAA,yBAAA,eAAA"}
|
package/dist/nodes/index.d.ts
CHANGED
|
@@ -1,5 +1,36 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
1
|
+
import { a as MergeParams, r as MultiplexParams, s as ConditionalParams, t as ZipParams } from "../zip-node-BzneQXn3.js";
|
|
2
|
+
import * as _uploadista_core_flow0 from "@uploadista/core/flow";
|
|
3
|
+
import { ZipPlugin } from "@uploadista/core/flow";
|
|
4
|
+
import { UploadFile } from "@uploadista/core/types";
|
|
5
|
+
import { Effect } from "effect";
|
|
6
|
+
import * as _uploadista_core_errors0 from "@uploadista/core/errors";
|
|
7
|
+
import { UploadistaError } from "@uploadista/core/errors";
|
|
8
|
+
import { UploadServer } from "@uploadista/core/upload";
|
|
9
|
+
|
|
10
|
+
//#region src/nodes/conditional-node.d.ts
|
|
11
|
+
declare function createConditionalNode(id: string, {
|
|
12
|
+
field,
|
|
13
|
+
operator,
|
|
14
|
+
value
|
|
15
|
+
}: ConditionalParams): Effect.Effect<_uploadista_core_flow0.FlowNode<UploadFile, UploadFile, _uploadista_core_errors0.UploadistaError>, never, never>;
|
|
16
|
+
//#endregion
|
|
17
|
+
//#region src/nodes/merge-node.d.ts
|
|
18
|
+
declare function createMergeNode(id: string, {
|
|
19
|
+
strategy,
|
|
20
|
+
separator: _separator
|
|
21
|
+
}: MergeParams): Effect.Effect<_uploadista_core_flow0.FlowNode<Record<string, UploadFile>, UploadFile, UploadistaError>, never, UploadServer>;
|
|
22
|
+
//#endregion
|
|
23
|
+
//#region src/nodes/multiplex-node.d.ts
|
|
24
|
+
declare function createMultiplexNode(id: string, {
|
|
25
|
+
outputCount: _outputCount,
|
|
26
|
+
strategy
|
|
27
|
+
}: MultiplexParams): Effect.Effect<_uploadista_core_flow0.FlowNode<UploadFile, UploadFile, UploadistaError>, never, UploadServer>;
|
|
28
|
+
//#endregion
|
|
29
|
+
//#region src/nodes/zip-node.d.ts
|
|
30
|
+
declare function createZipNode(id: string, {
|
|
31
|
+
zipName,
|
|
32
|
+
includeMetadata
|
|
33
|
+
}: ZipParams): Effect.Effect<_uploadista_core_flow0.FlowNode<Record<string, UploadFile>, UploadFile, UploadistaError>, never, UploadServer | ZipPlugin>;
|
|
34
|
+
//#endregion
|
|
35
|
+
export { createConditionalNode, createMergeNode, createMultiplexNode, createZipNode };
|
|
5
36
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","
|
|
1
|
+
{"version":3,"file":"index.d.ts","names":[],"sources":["../../src/nodes/conditional-node.ts","../../src/nodes/merge-node.ts","../../src/nodes/multiplex-node.ts","../../src/nodes/zip-node.ts"],"sourcesContent":[],"mappings":";;;;;;;;;;iBASgB,qBAAA;;;;GAEc,oBAAiB,MAAA,CAAA,OAAA,sBAAA,CAAA,SAAA,YAAA,YAAA,wBAAA,CAAA,eAAA;;;iBCI/B,eAAA;;aAES;GAAc,cAAW,MAAA,CAAA,OAAA,sBAAA,CAAA,SAAA,eAAA,aAAA,YAAA,yBAAA;;;iBCLlC,mBAAA;eAEC;;GAA0B,kBAAe,MAAA,CAAA,OAAA,sBAAA,CAAA,SAAA,YAAA,YAAA,yBAAA;;;iBCE1C,aAAA;;;GAEgB,YAAS,MAAA,CAAA,OAAA,sBAAA,CAAA,SAAA,eAAA,aAAA,YAAA,yBAAA,eAAA"}
|
package/dist/nodes/index.js
CHANGED
|
@@ -1,4 +1,2 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
export * from "./multiplex-node";
|
|
4
|
-
export * from "./zip-node";
|
|
1
|
+
import{NodeType as e,ZipPlugin as t,completeNodeExecution as n,createFlowNode as r,resolveUploadMetadata as i}from"@uploadista/core/flow";import{uploadFileSchema as a}from"@uploadista/core/types";import{Effect as o}from"effect";import{UploadistaError as s}from"@uploadista/core/errors";import{UploadServer as c}from"@uploadista/core/upload";import{z as l}from"zod";function u(t,{field:i,operator:s,value:c}){return r({id:t,name:`Conditional Router`,description:`Routes flow based on ${i} ${s} ${c}`,type:e.conditional,inputSchema:a,outputSchema:a,condition:{field:i,operator:s,value:c},run:({data:e})=>o.succeed(n(e))})}const d=l.record(l.string(),a),f=a;function p(t,{strategy:i,separator:a}){return o.gen(function*(){let a=yield*c;return yield*r({id:t,name:`Merge Files`,description:`Merges multiple files using ${i} strategy`,type:e.merge,inputSchema:d,outputSchema:f,multiInput:!0,run:({data:e,storageId:t,clientId:r})=>o.gen(function*(){if(!e||Object.keys(e).length===0)return yield*o.fail(s.fromCode(`VALIDATION_ERROR`,{body:`No inputs provided to merge node`}));let c=Object.values(e);if(c.length===0)return yield*o.fail(s.fromCode(`VALIDATION_ERROR`,{body:`No files to merge`}));switch(i){case`concat`:{let e=[],i=0;for(let t of c){let n=yield*a.read(t.id,r);e.push(n),i+=n.byteLength}let o=new Uint8Array(i),s=0;for(let t of e)o.set(t,s),s+=t.byteLength;let l=new ReadableStream({start(e){e.enqueue(o),e.close()}});return n(yield*a.upload({storageId:t,size:o.byteLength,type:`application/octet-stream`,fileName:`merged_${c.length}_files.bin`,lastModified:0,metadata:JSON.stringify({mimeType:`application/octet-stream`,originalName:`merged_${c.length}_files`,extension:`bin`})},r,l))}default:return yield*o.fail(s.fromCode(`VALIDATION_ERROR`,{body:`Unknown merge strategy: ${i}`}))}})})})}function m(t,{outputCount:l,strategy:u}){return o.gen(function*(){let l=yield*c;return yield*r({id:t,name:`Multiplex`,description:`Multiplexes input using ${u} strategy`,type:e.multiplex,inputSchema:a,outputSchema:a,multiOutput:!0,run:({data:e,storageId:t,clientId:r})=>o.gen(function*(){let{type:a,fileName:c,metadata:d,metadataJson:f}=i(e.metadata),p=d?{...e,metadata:d}:e;if(u===`copy`){let e=yield*l.read(p.id,r),o=new ReadableStream({start(t){t.enqueue(e),t.close()}}),s=yield*l.upload({storageId:t,size:e.byteLength,type:a,fileName:c,lastModified:0,metadata:f},r,o),u=i(s.metadata);return n(u.metadata?{...s,metadata:u.metadata}:s)}else if(u===`split`)return yield*o.fail(s.fromCode(`VALIDATION_ERROR`,{body:`Split strategy is not supported with UploadFile pattern`}));return yield*o.fail(s.fromCode(`VALIDATION_ERROR`,{body:`Unknown multiplex strategy: ${u}`}))})})})}const h=l.record(l.string(),a),g=a;function _(i,{zipName:a,includeMetadata:l}){return o.gen(function*(){let u=yield*c,d=yield*t;return yield*r({id:i,name:`Zip Files`,description:`Combines multiple files into a zip archive`,type:e.process,inputSchema:h,outputSchema:g,multiInput:!0,run:({data:e,storageId:t,clientId:r})=>o.gen(function*(){if(!e||Object.keys(e).length===0)return yield*o.fail(s.fromCode(`VALIDATION_ERROR`,{body:`No inputs provided to zip node`}));let i=yield*o.forEach(Object.values(e),e=>o.gen(function*(){let t=yield*u.read(e.id,r);return{id:e.id,data:t,metadata:e.metadata}}),{concurrency:`unbounded`}),c=yield*d.zip(i,{zipName:a,includeMetadata:l}),f=new ReadableStream({start(e){e.enqueue(c),e.close()}});return n(yield*u.upload({storageId:t,size:c.byteLength,type:`application/zip`,fileName:a,lastModified:0,metadata:JSON.stringify({mimeType:`application/zip`,type:`application/zip`,originalName:a,fileName:a,extension:`zip`})},r,f))})})})}export{u as createConditionalNode,p as createMergeNode,m as createMultiplexNode,_ as createZipNode};
|
|
2
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","names":["inputSchema","outputSchema","inputBytesArray: Uint8Array[]"],"sources":["../../src/nodes/conditional-node.ts","../../src/nodes/merge-node.ts","../../src/nodes/multiplex-node.ts","../../src/nodes/zip-node.ts"],"sourcesContent":["import {\n completeNodeExecution,\n createFlowNode,\n NodeType,\n} from \"@uploadista/core/flow\";\nimport { type UploadFile, uploadFileSchema } from \"@uploadista/core/types\";\nimport { Effect } from \"effect\";\nimport type { ConditionalParams } from \"@/types/conditional-node\";\n\nexport function createConditionalNode(\n id: string,\n { field, operator, value }: ConditionalParams,\n) {\n return createFlowNode<UploadFile, UploadFile>({\n id,\n name: \"Conditional Router\",\n description: `Routes flow based on ${field} ${operator} ${value}`,\n type: NodeType.conditional,\n inputSchema: uploadFileSchema,\n outputSchema: uploadFileSchema,\n condition: { field, operator, value },\n run: ({ data }) => {\n // The actual routing logic is handled by the flow engine\n // This node just passes through the data\n return Effect.succeed(completeNodeExecution(data));\n },\n });\n}\n","import { UploadistaError } from \"@uploadista/core/errors\";\nimport {\n completeNodeExecution,\n createFlowNode,\n NodeType,\n} from \"@uploadista/core/flow\";\nimport { type UploadFile, uploadFileSchema } from \"@uploadista/core/types\";\nimport { UploadServer } from \"@uploadista/core/upload\";\nimport { Effect } from \"effect\";\nimport { z } from \"zod\";\nimport type { MergeParams } from \"@/types/merge-node\";\n\nconst inputSchema = z.record(z.string(), uploadFileSchema);\nconst outputSchema = uploadFileSchema;\n\nexport function createMergeNode(\n id: string,\n { strategy, separator: _separator }: MergeParams,\n) {\n return Effect.gen(function* () {\n const uploadServer = yield* UploadServer;\n\n return yield* createFlowNode<Record<string, UploadFile>, UploadFile>({\n id,\n name: \"Merge Files\",\n description: `Merges multiple files using ${strategy} strategy`,\n type: NodeType.merge,\n inputSchema,\n outputSchema,\n multiInput: true,\n run: ({ data: inputs, storageId, clientId }) => {\n return Effect.gen(function* () {\n if (!inputs || Object.keys(inputs).length === 0) {\n return yield* Effect.fail(\n UploadistaError.fromCode(\"VALIDATION_ERROR\", {\n body: \"No inputs provided to merge node\",\n }),\n );\n }\n\n const inputFiles = Object.values(inputs);\n\n if (inputFiles.length === 0) {\n return yield* Effect.fail(\n UploadistaError.fromCode(\"VALIDATION_ERROR\", {\n body: \"No files to merge\",\n }),\n );\n }\n\n switch (strategy) {\n case \"concat\": {\n // Read bytes from all input files\n const inputBytesArray: Uint8Array[] = [];\n let totalSize = 0;\n\n for (const file of inputFiles) {\n const bytes = yield* uploadServer.read(file.id, clientId);\n inputBytesArray.push(bytes);\n totalSize += bytes.byteLength;\n }\n\n // Concatenate all files into one\n const mergedBytes = new Uint8Array(totalSize);\n let offset = 0;\n for (const bytes of inputBytesArray) {\n mergedBytes.set(bytes, offset);\n offset += bytes.byteLength;\n }\n\n // Create a stream from the merged bytes\n const stream = new ReadableStream({\n start(controller) {\n controller.enqueue(mergedBytes);\n controller.close();\n },\n });\n\n // Upload the merged file\n const result = yield* uploadServer.upload(\n {\n storageId,\n size: mergedBytes.byteLength,\n type: \"application/octet-stream\",\n fileName: `merged_${inputFiles.length}_files.bin`,\n lastModified: 0,\n metadata: JSON.stringify({\n mimeType: \"application/octet-stream\",\n originalName: `merged_${inputFiles.length}_files`,\n extension: \"bin\",\n }),\n },\n clientId,\n stream,\n );\n\n return completeNodeExecution(result);\n }\n default: {\n return yield* Effect.fail(\n UploadistaError.fromCode(\"VALIDATION_ERROR\", {\n body: `Unknown merge strategy: ${strategy}`,\n }),\n );\n }\n }\n });\n },\n });\n });\n}\n","import { UploadistaError } from \"@uploadista/core/errors\";\nimport {\n completeNodeExecution,\n createFlowNode,\n NodeType,\n resolveUploadMetadata,\n} from \"@uploadista/core/flow\";\nimport { type UploadFile, uploadFileSchema } from \"@uploadista/core/types\";\nimport { UploadServer } from \"@uploadista/core/upload\";\nimport { Effect } from \"effect\";\nimport type { MultiplexParams } from \"@/types/multiplex-node\";\n\nexport function createMultiplexNode(\n id: string,\n { outputCount: _outputCount, strategy }: MultiplexParams,\n) {\n return Effect.gen(function* () {\n const uploadServer = yield* UploadServer;\n\n return yield* createFlowNode<UploadFile, UploadFile>({\n id,\n name: \"Multiplex\",\n description: `Multiplexes input using ${strategy} strategy`,\n type: NodeType.multiplex,\n inputSchema: uploadFileSchema,\n outputSchema: uploadFileSchema,\n multiOutput: true,\n run: ({ data: file, storageId, clientId }) => {\n return Effect.gen(function* () {\n const { type, fileName, metadata, metadataJson } =\n resolveUploadMetadata(file.metadata);\n const normalizedFile = metadata ? { ...file, metadata } : file;\n\n if (strategy === \"copy\") {\n // For copy strategy, read and re-upload the file\n const inputBytes = yield* uploadServer.read(\n normalizedFile.id,\n clientId,\n );\n\n const stream = new ReadableStream({\n start(controller) {\n controller.enqueue(inputBytes);\n controller.close();\n },\n });\n\n const result = yield* uploadServer.upload(\n {\n storageId,\n size: inputBytes.byteLength,\n type,\n fileName,\n lastModified: 0,\n metadata: metadataJson,\n },\n clientId,\n stream,\n );\n\n const resolvedResult = resolveUploadMetadata(result.metadata);\n\n return completeNodeExecution(\n resolvedResult.metadata\n ? { ...result, metadata: resolvedResult.metadata }\n : result,\n );\n } else if (strategy === \"split\") {\n // Split strategy is not supported in the new pattern\n // as it would require returning multiple UploadFiles\n return yield* Effect.fail(\n UploadistaError.fromCode(\"VALIDATION_ERROR\", {\n body: \"Split strategy is not supported with UploadFile pattern\",\n }),\n );\n }\n\n return yield* Effect.fail(\n UploadistaError.fromCode(\"VALIDATION_ERROR\", {\n body: `Unknown multiplex strategy: ${strategy}`,\n }),\n );\n });\n },\n });\n });\n}\n","import { UploadistaError } from \"@uploadista/core/errors\";\nimport {\n completeNodeExecution,\n createFlowNode,\n NodeType,\n ZipPlugin,\n} from \"@uploadista/core/flow\";\nimport { type UploadFile, uploadFileSchema } from \"@uploadista/core/types\";\nimport { UploadServer } from \"@uploadista/core/upload\";\nimport { Effect } from \"effect\";\nimport { z } from \"zod\";\nimport type { ZipParams } from \"@/types/zip-node\";\n\nconst inputSchema = z.record(z.string(), uploadFileSchema);\nconst outputSchema = uploadFileSchema;\n\nexport function createZipNode(\n id: string,\n { zipName, includeMetadata }: ZipParams,\n) {\n return Effect.gen(function* () {\n const uploadServer = yield* UploadServer;\n const zipPlugin = yield* ZipPlugin;\n return yield* createFlowNode<Record<string, UploadFile>, UploadFile>({\n id,\n name: \"Zip Files\",\n description: \"Combines multiple files into a zip archive\",\n type: NodeType.process,\n inputSchema,\n outputSchema,\n multiInput: true,\n run: ({ data: inputs, storageId, clientId }) => {\n return Effect.gen(function* () {\n if (!inputs || Object.keys(inputs).length === 0) {\n return yield* Effect.fail(\n UploadistaError.fromCode(\"VALIDATION_ERROR\", {\n body: \"No inputs provided to zip node\",\n }),\n );\n }\n\n\n const zipInputs = yield* Effect.forEach(\n Object.values(inputs),\n (input) =>\n Effect.gen(function* () {\n const data = yield* uploadServer.read(input.id, clientId);\n return {\n id: input.id,\n data,\n metadata: input.metadata,\n };\n }),\n { concurrency: \"unbounded\" }\n );\n\n const zipBytes = yield* zipPlugin.zip(zipInputs, { zipName, includeMetadata });\n\n // Create a stream from the zip bytes\n const stream = new ReadableStream({\n start(controller) {\n controller.enqueue(zipBytes);\n controller.close();\n },\n });\n\n // Upload the zip file\n const result = yield* uploadServer.upload(\n {\n storageId,\n size: zipBytes.byteLength,\n type: \"application/zip\",\n fileName: zipName,\n lastModified: 0,\n metadata: JSON.stringify({\n mimeType: \"application/zip\",\n type: \"application/zip\",\n originalName: zipName,\n fileName: zipName,\n extension: \"zip\",\n }),\n },\n clientId,\n stream,\n );\n\n return completeNodeExecution(result);\n });\n },\n });\n });\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
const e=require(`../chunk-DjWAcSYV.cjs`);let t=require(`zod`);t=e.t(t);const n=t.z.object({field:t.z.enum([`mimeType`,`size`,`width`,`height`,`extension`]),operator:t.z.enum([`equals`,`notEquals`,`greaterThan`,`lessThan`,`contains`,`startsWith`]),value:t.z.union([t.z.string(),t.z.number()])}),r=t.z.object({strategy:t.z.enum([`concat`,`batch`]).default(`batch`),separator:t.z.string().default(`
|
|
2
|
+
`).optional(),inputCount:t.z.number().min(2).max(10).default(2)}),i=t.z.object({outputCount:t.z.number().min(1).max(10),strategy:t.z.enum([`copy`,`split`]).default(`copy`)}),a=t.z.object({zipName:t.z.string().default(`archive.zip`),includeMetadata:t.z.boolean().default(!1),inputCount:t.z.number().min(2).max(10).default(2)});exports.conditionalParamsSchema=n,exports.mergeParamsSchema=r,exports.multiplexParamsSchema=i,exports.zipParamsSchema=a;
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import { a as MergeParams, c as conditionalParamsSchema, i as multiplexParamsSchema, n as zipParamsSchema, o as mergeParamsSchema, r as MultiplexParams, s as ConditionalParams, t as ZipParams } from "../zip-node-BbFUu_Oc.cjs";
|
|
2
|
+
export { ConditionalParams, MergeParams, MultiplexParams, ZipParams, conditionalParamsSchema, mergeParamsSchema, multiplexParamsSchema, zipParamsSchema };
|
package/dist/types/index.d.ts
CHANGED
|
@@ -1,5 +1,2 @@
|
|
|
1
|
-
|
|
2
|
-
export
|
|
3
|
-
export * from "./multiplex-node";
|
|
4
|
-
export * from "./zip-node";
|
|
5
|
-
//# sourceMappingURL=index.d.ts.map
|
|
1
|
+
import { a as MergeParams, c as conditionalParamsSchema, i as multiplexParamsSchema, n as zipParamsSchema, o as mergeParamsSchema, r as MultiplexParams, s as ConditionalParams, t as ZipParams } from "../zip-node-BzneQXn3.js";
|
|
2
|
+
export { ConditionalParams, MergeParams, MultiplexParams, ZipParams, conditionalParamsSchema, mergeParamsSchema, multiplexParamsSchema, zipParamsSchema };
|
package/dist/types/index.js
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
|
|
2
|
-
export
|
|
3
|
-
|
|
4
|
-
export * from "./zip-node";
|
|
1
|
+
import{z as e}from"zod";const t=e.object({field:e.enum([`mimeType`,`size`,`width`,`height`,`extension`]),operator:e.enum([`equals`,`notEquals`,`greaterThan`,`lessThan`,`contains`,`startsWith`]),value:e.union([e.string(),e.number()])}),n=e.object({strategy:e.enum([`concat`,`batch`]).default(`batch`),separator:e.string().default(`
|
|
2
|
+
`).optional(),inputCount:e.number().min(2).max(10).default(2)}),r=e.object({outputCount:e.number().min(1).max(10),strategy:e.enum([`copy`,`split`]).default(`copy`)}),i=e.object({zipName:e.string().default(`archive.zip`),includeMetadata:e.boolean().default(!1),inputCount:e.number().min(2).max(10).default(2)});export{t as conditionalParamsSchema,n as mergeParamsSchema,r as multiplexParamsSchema,i as zipParamsSchema};
|
|
3
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../../src/types/conditional-node.ts","../../src/types/merge-node.ts","../../src/types/multiplex-node.ts","../../src/types/zip-node.ts"],"sourcesContent":["import { z } from \"zod\";\n\nexport const conditionalParamsSchema = z.object({\n field: z.enum([\"mimeType\", \"size\", \"width\", \"height\", \"extension\"]),\n operator: z.enum([\n \"equals\",\n \"notEquals\",\n \"greaterThan\",\n \"lessThan\",\n \"contains\",\n \"startsWith\",\n ]),\n value: z.union([z.string(), z.number()]),\n});\n\nexport type ConditionalParams = z.infer<typeof conditionalParamsSchema>;\n","import { z } from \"zod\";\n\nexport const mergeParamsSchema = z.object({\n strategy: z.enum([\"concat\", \"batch\"]).default(\"batch\"),\n separator: z.string().default(\"\\n\").optional(),\n inputCount: z.number().min(2).max(10).default(2),\n});\n\nexport type MergeParams = z.infer<typeof mergeParamsSchema>;\n","import { z } from \"zod\";\n\nexport const multiplexParamsSchema = z.object({\n outputCount: z.number().min(1).max(10),\n strategy: z.enum([\"copy\", \"split\"]).default(\"copy\"),\n});\n\nexport type MultiplexParams = z.infer<typeof multiplexParamsSchema>;\n","import { z } from \"zod\";\n\nexport const zipParamsSchema = z.object({\n zipName: z.string().default(\"archive.zip\"),\n includeMetadata: z.boolean().default(false),\n inputCount: z.number().min(2).max(10).default(2),\n});\n\nexport type ZipParams = z.infer<typeof zipParamsSchema>;\n"],"mappings":"wBAEA,MAAa,EAA0B,EAAE,OAAO,CAC9C,MAAO,EAAE,KAAK,CAAC,WAAY,OAAQ,QAAS,SAAU,YAAY,CAAC,CACnE,SAAU,EAAE,KAAK,CACf,SACA,YACA,cACA,WACA,WACA,aACD,CAAC,CACF,MAAO,EAAE,MAAM,CAAC,EAAE,QAAQ,CAAE,EAAE,QAAQ,CAAC,CAAC,CACzC,CAAC,CCXW,EAAoB,EAAE,OAAO,CACxC,SAAU,EAAE,KAAK,CAAC,SAAU,QAAQ,CAAC,CAAC,QAAQ,QAAQ,CACtD,UAAW,EAAE,QAAQ,CAAC,QAAQ;EAAK,CAAC,UAAU,CAC9C,WAAY,EAAE,QAAQ,CAAC,IAAI,EAAE,CAAC,IAAI,GAAG,CAAC,QAAQ,EAAE,CACjD,CAAC,CCJW,EAAwB,EAAE,OAAO,CAC5C,YAAa,EAAE,QAAQ,CAAC,IAAI,EAAE,CAAC,IAAI,GAAG,CACtC,SAAU,EAAE,KAAK,CAAC,OAAQ,QAAQ,CAAC,CAAC,QAAQ,OAAO,CACpD,CAAC,CCHW,EAAkB,EAAE,OAAO,CACtC,QAAS,EAAE,QAAQ,CAAC,QAAQ,cAAc,CAC1C,gBAAiB,EAAE,SAAS,CAAC,QAAQ,GAAM,CAC3C,WAAY,EAAE,QAAQ,CAAC,IAAI,EAAE,CAAC,IAAI,GAAG,CAAC,QAAQ,EAAE,CACjD,CAAC"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
|
|
3
|
+
//#region src/types/conditional-node.d.ts
|
|
4
|
+
declare const conditionalParamsSchema: z.ZodObject<{
|
|
5
|
+
field: z.ZodEnum<{
|
|
6
|
+
size: "size";
|
|
7
|
+
mimeType: "mimeType";
|
|
8
|
+
width: "width";
|
|
9
|
+
height: "height";
|
|
10
|
+
extension: "extension";
|
|
11
|
+
}>;
|
|
12
|
+
operator: z.ZodEnum<{
|
|
13
|
+
startsWith: "startsWith";
|
|
14
|
+
equals: "equals";
|
|
15
|
+
notEquals: "notEquals";
|
|
16
|
+
greaterThan: "greaterThan";
|
|
17
|
+
lessThan: "lessThan";
|
|
18
|
+
contains: "contains";
|
|
19
|
+
}>;
|
|
20
|
+
value: z.ZodUnion<readonly [z.ZodString, z.ZodNumber]>;
|
|
21
|
+
}, z.core.$strip>;
|
|
22
|
+
type ConditionalParams = z.infer<typeof conditionalParamsSchema>;
|
|
23
|
+
//#endregion
|
|
24
|
+
//#region src/types/merge-node.d.ts
|
|
25
|
+
declare const mergeParamsSchema: z.ZodObject<{
|
|
26
|
+
strategy: z.ZodDefault<z.ZodEnum<{
|
|
27
|
+
concat: "concat";
|
|
28
|
+
batch: "batch";
|
|
29
|
+
}>>;
|
|
30
|
+
separator: z.ZodOptional<z.ZodDefault<z.ZodString>>;
|
|
31
|
+
inputCount: z.ZodDefault<z.ZodNumber>;
|
|
32
|
+
}, z.core.$strip>;
|
|
33
|
+
type MergeParams = z.infer<typeof mergeParamsSchema>;
|
|
34
|
+
//#endregion
|
|
35
|
+
//#region src/types/multiplex-node.d.ts
|
|
36
|
+
declare const multiplexParamsSchema: z.ZodObject<{
|
|
37
|
+
outputCount: z.ZodNumber;
|
|
38
|
+
strategy: z.ZodDefault<z.ZodEnum<{
|
|
39
|
+
split: "split";
|
|
40
|
+
copy: "copy";
|
|
41
|
+
}>>;
|
|
42
|
+
}, z.core.$strip>;
|
|
43
|
+
type MultiplexParams = z.infer<typeof multiplexParamsSchema>;
|
|
44
|
+
//#endregion
|
|
45
|
+
//#region src/types/zip-node.d.ts
|
|
46
|
+
declare const zipParamsSchema: z.ZodObject<{
|
|
47
|
+
zipName: z.ZodDefault<z.ZodString>;
|
|
48
|
+
includeMetadata: z.ZodDefault<z.ZodBoolean>;
|
|
49
|
+
inputCount: z.ZodDefault<z.ZodNumber>;
|
|
50
|
+
}, z.core.$strip>;
|
|
51
|
+
type ZipParams = z.infer<typeof zipParamsSchema>;
|
|
52
|
+
//#endregion
|
|
53
|
+
export { MergeParams as a, conditionalParamsSchema as c, multiplexParamsSchema as i, zipParamsSchema as n, mergeParamsSchema as o, MultiplexParams as r, ConditionalParams as s, ZipParams as t };
|
|
54
|
+
//# sourceMappingURL=zip-node-BbFUu_Oc.d.cts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"zip-node-BbFUu_Oc.d.cts","names":[],"sources":["../src/types/conditional-node.ts","../src/types/merge-node.ts","../src/types/multiplex-node.ts","../src/types/zip-node.ts"],"sourcesContent":[],"mappings":";;;cAEa,yBAAuB,CAAA,CAAA;;IAAvB,IAAA,EAAA,MAAA;;;;;;;IAAuB,UAAA,EAAA,YAAA;IAAA,MAAA,EAAA,QAAA;IAaxB,SAAA,EAAA,WAAiB;;;;ECbhB,CAAA,CAAA;;;KDaD,iBAAA,GAAoB,CAAA,CAAE,aAAa;;;cCblC,mBAAiB,CAAA,CAAA;;IDAjB,MAAA,EAAA,QAAA;;;;;;KCMD,WAAA,GAAc,CAAA,CAAE,aAAa;;;cCN5B,uBAAqB,CAAA,CAAA;;EFArB,QAAA,cAAA,UAWX,CAAA;;;;;KENU,eAAA,GAAkB,CAAA,CAAE,aAAa;;;cCLhC,iBAAe,CAAA,CAAA;;EHAf,eAAA,cAWX,aAAA,CAAA;;;KGLU,SAAA,GAAY,CAAA,CAAE,aAAa"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
|
|
3
|
+
//#region src/types/conditional-node.d.ts
|
|
4
|
+
declare const conditionalParamsSchema: z.ZodObject<{
|
|
5
|
+
field: z.ZodEnum<{
|
|
6
|
+
size: "size";
|
|
7
|
+
mimeType: "mimeType";
|
|
8
|
+
width: "width";
|
|
9
|
+
height: "height";
|
|
10
|
+
extension: "extension";
|
|
11
|
+
}>;
|
|
12
|
+
operator: z.ZodEnum<{
|
|
13
|
+
startsWith: "startsWith";
|
|
14
|
+
equals: "equals";
|
|
15
|
+
notEquals: "notEquals";
|
|
16
|
+
greaterThan: "greaterThan";
|
|
17
|
+
lessThan: "lessThan";
|
|
18
|
+
contains: "contains";
|
|
19
|
+
}>;
|
|
20
|
+
value: z.ZodUnion<readonly [z.ZodString, z.ZodNumber]>;
|
|
21
|
+
}, z.core.$strip>;
|
|
22
|
+
type ConditionalParams = z.infer<typeof conditionalParamsSchema>;
|
|
23
|
+
//#endregion
|
|
24
|
+
//#region src/types/merge-node.d.ts
|
|
25
|
+
declare const mergeParamsSchema: z.ZodObject<{
|
|
26
|
+
strategy: z.ZodDefault<z.ZodEnum<{
|
|
27
|
+
concat: "concat";
|
|
28
|
+
batch: "batch";
|
|
29
|
+
}>>;
|
|
30
|
+
separator: z.ZodOptional<z.ZodDefault<z.ZodString>>;
|
|
31
|
+
inputCount: z.ZodDefault<z.ZodNumber>;
|
|
32
|
+
}, z.core.$strip>;
|
|
33
|
+
type MergeParams = z.infer<typeof mergeParamsSchema>;
|
|
34
|
+
//#endregion
|
|
35
|
+
//#region src/types/multiplex-node.d.ts
|
|
36
|
+
declare const multiplexParamsSchema: z.ZodObject<{
|
|
37
|
+
outputCount: z.ZodNumber;
|
|
38
|
+
strategy: z.ZodDefault<z.ZodEnum<{
|
|
39
|
+
split: "split";
|
|
40
|
+
copy: "copy";
|
|
41
|
+
}>>;
|
|
42
|
+
}, z.core.$strip>;
|
|
43
|
+
type MultiplexParams = z.infer<typeof multiplexParamsSchema>;
|
|
44
|
+
//#endregion
|
|
45
|
+
//#region src/types/zip-node.d.ts
|
|
46
|
+
declare const zipParamsSchema: z.ZodObject<{
|
|
47
|
+
zipName: z.ZodDefault<z.ZodString>;
|
|
48
|
+
includeMetadata: z.ZodDefault<z.ZodBoolean>;
|
|
49
|
+
inputCount: z.ZodDefault<z.ZodNumber>;
|
|
50
|
+
}, z.core.$strip>;
|
|
51
|
+
type ZipParams = z.infer<typeof zipParamsSchema>;
|
|
52
|
+
//#endregion
|
|
53
|
+
export { MergeParams as a, conditionalParamsSchema as c, multiplexParamsSchema as i, zipParamsSchema as n, mergeParamsSchema as o, MultiplexParams as r, ConditionalParams as s, ZipParams as t };
|
|
54
|
+
//# sourceMappingURL=zip-node-BzneQXn3.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"zip-node-BzneQXn3.d.ts","names":[],"sources":["../src/types/conditional-node.ts","../src/types/merge-node.ts","../src/types/multiplex-node.ts","../src/types/zip-node.ts"],"sourcesContent":[],"mappings":";;;cAEa,yBAAuB,CAAA,CAAA;;IAAvB,IAAA,EAAA,MAAA;;;;;;;IAAuB,UAAA,EAAA,YAAA;IAAA,MAAA,EAAA,QAAA;IAaxB,SAAA,EAAA,WAAiB;;;;ECbhB,CAAA,CAAA;;;KDaD,iBAAA,GAAoB,CAAA,CAAE,aAAa;;;cCblC,mBAAiB,CAAA,CAAA;;IDAjB,MAAA,EAAA,QAAA;;;;;;KCMD,WAAA,GAAc,CAAA,CAAE,aAAa;;;cCN5B,uBAAqB,CAAA,CAAA;;EFArB,QAAA,cAAA,UAWX,CAAA;;;;;KENU,eAAA,GAAkB,CAAA,CAAE,aAAa;;;cCLhC,iBAAe,CAAA,CAAA;;EHAf,eAAA,cAWX,aAAA,CAAA;;;KGLU,SAAA,GAAY,CAAA,CAAE,aAAa"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@uploadista/flow-utility-nodes",
|
|
3
3
|
"type": "module",
|
|
4
|
-
"version": "0.0.
|
|
4
|
+
"version": "0.0.4",
|
|
5
5
|
"description": "Utility nodes for Uploadista Flow",
|
|
6
6
|
"license": "MIT",
|
|
7
7
|
"author": "Uploadista",
|
|
@@ -20,14 +20,15 @@
|
|
|
20
20
|
"dependencies": {
|
|
21
21
|
"effect": "3.18.4",
|
|
22
22
|
"zod": "4.1.12",
|
|
23
|
-
"@uploadista/core": "0.0.
|
|
23
|
+
"@uploadista/core": "0.0.4"
|
|
24
24
|
},
|
|
25
25
|
"devDependencies": {
|
|
26
26
|
"@types/node": "24.8.1",
|
|
27
|
-
"
|
|
27
|
+
"tsdown": "0.15.9",
|
|
28
|
+
"@uploadista/typescript-config": "0.0.4"
|
|
28
29
|
},
|
|
29
30
|
"scripts": {
|
|
30
|
-
"build": "
|
|
31
|
+
"build": "tsdown",
|
|
31
32
|
"format": "biome format --write ./src",
|
|
32
33
|
"lint": "biome lint --write ./src",
|
|
33
34
|
"check": "biome check --write ./src"
|
package/tsdown.config.ts
ADDED
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
import { type FlowFile } from "@uploadista/flow-core";
|
|
2
|
-
import { z } from "zod";
|
|
3
|
-
export declare const conditionalParamsSchema: z.ZodObject<{
|
|
4
|
-
field: z.ZodEnum<{
|
|
5
|
-
mimeType: "mimeType";
|
|
6
|
-
size: "size";
|
|
7
|
-
width: "width";
|
|
8
|
-
height: "height";
|
|
9
|
-
extension: "extension";
|
|
10
|
-
}>;
|
|
11
|
-
operator: z.ZodEnum<{
|
|
12
|
-
equals: "equals";
|
|
13
|
-
notEquals: "notEquals";
|
|
14
|
-
greaterThan: "greaterThan";
|
|
15
|
-
lessThan: "lessThan";
|
|
16
|
-
contains: "contains";
|
|
17
|
-
startsWith: "startsWith";
|
|
18
|
-
}>;
|
|
19
|
-
value: z.ZodUnion<readonly [z.ZodString, z.ZodNumber]>;
|
|
20
|
-
trueBranch: z.ZodString;
|
|
21
|
-
falseBranch: z.ZodOptional<z.ZodString>;
|
|
22
|
-
}, z.core.$strip>;
|
|
23
|
-
export type ConditionalParams = z.infer<typeof conditionalParamsSchema>;
|
|
24
|
-
export declare function createConditionalNode(id: string, { field, operator, value, trueBranch, falseBranch }: ConditionalParams): import("@uploadista/flow-core").FlowNode<FlowFile, FlowFile>;
|
|
25
|
-
//# sourceMappingURL=conditional-node.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"conditional-node.d.ts","sourceRoot":"","sources":["../src/conditional-node.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,QAAQ,EAGd,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,eAAO,MAAM,uBAAuB;;;;;;;;;;;;;;;;;;;iBAalC,CAAC;AAEH,MAAM,MAAM,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,uBAAuB,CAAC,CAAC;AAIxE,wBAAgB,qBAAqB,CACnC,EAAE,EAAE,MAAM,EACV,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,EAAE,iBAAiB,gEAmBvE"}
|
package/dist/conditional-node.js
DELETED
|
@@ -1,34 +0,0 @@
|
|
|
1
|
-
import { createFlowNode, flowFileSchema, NodeType, } from "@uploadista/flow-core";
|
|
2
|
-
import { z } from "zod";
|
|
3
|
-
export const conditionalParamsSchema = z.object({
|
|
4
|
-
field: z.enum(["mimeType", "size", "width", "height", "extension"]),
|
|
5
|
-
operator: z.enum([
|
|
6
|
-
"equals",
|
|
7
|
-
"notEquals",
|
|
8
|
-
"greaterThan",
|
|
9
|
-
"lessThan",
|
|
10
|
-
"contains",
|
|
11
|
-
"startsWith",
|
|
12
|
-
]),
|
|
13
|
-
value: z.union([z.string(), z.number()]),
|
|
14
|
-
trueBranch: z.string(),
|
|
15
|
-
falseBranch: z.string().optional(),
|
|
16
|
-
});
|
|
17
|
-
// Define schemas for input and output
|
|
18
|
-
export function createConditionalNode(id, { field, operator, value, trueBranch, falseBranch }) {
|
|
19
|
-
return createFlowNode({
|
|
20
|
-
id,
|
|
21
|
-
name: "Conditional Router",
|
|
22
|
-
description: `Routes flow based on ${field} ${operator} ${value}`,
|
|
23
|
-
type: NodeType.conditional,
|
|
24
|
-
inputSchema: flowFileSchema,
|
|
25
|
-
outputSchema: flowFileSchema,
|
|
26
|
-
condition: { field, operator, value },
|
|
27
|
-
branches: [trueBranch, falseBranch].filter((branch) => branch !== undefined),
|
|
28
|
-
run: async ({ data }) => {
|
|
29
|
-
// The actual routing logic is handled by the flow engine
|
|
30
|
-
// This node just passes through the data
|
|
31
|
-
return data;
|
|
32
|
-
},
|
|
33
|
-
});
|
|
34
|
-
}
|
package/dist/index.d.ts
DELETED
package/dist/index.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,0BAA0B,CAAC;AACzC,cAAc,oBAAoB,CAAC;AACnC,cAAc,wBAAwB,CAAC;AACvC,cAAc,kBAAkB,CAAC"}
|
package/dist/index.js
DELETED
package/dist/merge-node.d.ts
DELETED
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
import { type FlowFile, type FlowFileBatch } from "@uploadista/flow-core";
|
|
2
|
-
import { z } from "zod";
|
|
3
|
-
export declare const mergeParamsSchema: z.ZodObject<{
|
|
4
|
-
strategy: z.ZodDefault<z.ZodEnum<{
|
|
5
|
-
concat: "concat";
|
|
6
|
-
batch: "batch";
|
|
7
|
-
}>>;
|
|
8
|
-
separator: z.ZodOptional<z.ZodDefault<z.ZodString>>;
|
|
9
|
-
}, z.core.$strip>;
|
|
10
|
-
export type MergeParams = z.infer<typeof mergeParamsSchema>;
|
|
11
|
-
export declare function createMergeNode(id: string, { strategy, separator: _separator }: MergeParams): import("@uploadista/flow-core").FlowNode<Record<string, FlowFile | FlowFileBatch>, FlowFile | FlowFileBatch>;
|
|
12
|
-
//# sourceMappingURL=merge-node.d.ts.map
|
package/dist/merge-node.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"merge-node.d.ts","sourceRoot":"","sources":["../src/merge-node.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,QAAQ,EACb,KAAK,aAAa,EAInB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,eAAO,MAAM,iBAAiB;;;;;;iBAG5B,CAAC;AAEH,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAO5D,wBAAgB,eAAe,CAC7B,EAAE,EAAE,MAAM,EACV,EAAE,QAAQ,EAAE,SAAS,EAAE,UAAU,EAAE,EAAE,WAAW,gHAwEjD"}
|
package/dist/merge-node.js
DELETED
|
@@ -1,77 +0,0 @@
|
|
|
1
|
-
import { createFlowNode, flowDataSchema, isFlowFile, NodeType, } from "@uploadista/flow-core";
|
|
2
|
-
import { z } from "zod";
|
|
3
|
-
export const mergeParamsSchema = z.object({
|
|
4
|
-
strategy: z.enum(["concat", "batch"]).default("batch"),
|
|
5
|
-
separator: z.string().default("\n").optional(),
|
|
6
|
-
});
|
|
7
|
-
// Define schemas for input and output
|
|
8
|
-
const inputSchema = z.record(z.string(), flowDataSchema);
|
|
9
|
-
const outputSchema = flowDataSchema;
|
|
10
|
-
export function createMergeNode(id, { strategy, separator: _separator }) {
|
|
11
|
-
return createFlowNode({
|
|
12
|
-
id,
|
|
13
|
-
name: "Merge Files",
|
|
14
|
-
description: `Merges multiple files using ${strategy} strategy`,
|
|
15
|
-
type: NodeType.merge,
|
|
16
|
-
inputSchema,
|
|
17
|
-
outputSchema,
|
|
18
|
-
multiInput: true,
|
|
19
|
-
run: async ({ data: inputs }) => {
|
|
20
|
-
if (!inputs) {
|
|
21
|
-
throw new Error("No inputs provided to merge node");
|
|
22
|
-
}
|
|
23
|
-
const inputFiles = [];
|
|
24
|
-
// Collect all input files
|
|
25
|
-
for (const [_sourceId, input] of Object.entries(inputs)) {
|
|
26
|
-
if (isFlowFile(input)) {
|
|
27
|
-
// Handle single FlowFile
|
|
28
|
-
inputFiles.push(input);
|
|
29
|
-
}
|
|
30
|
-
else {
|
|
31
|
-
// Handle FlowFileBatch
|
|
32
|
-
inputFiles.push(...input.files);
|
|
33
|
-
}
|
|
34
|
-
}
|
|
35
|
-
if (inputFiles.length === 0) {
|
|
36
|
-
throw new Error("No files to merge");
|
|
37
|
-
}
|
|
38
|
-
if (strategy === "batch") {
|
|
39
|
-
// Return as a batch
|
|
40
|
-
return {
|
|
41
|
-
files: inputFiles,
|
|
42
|
-
metadata: {
|
|
43
|
-
batchId: crypto.randomUUID(),
|
|
44
|
-
totalSize: inputFiles.reduce((sum, file) => sum + file.metadata.size, 0),
|
|
45
|
-
fileCount: inputFiles.length,
|
|
46
|
-
},
|
|
47
|
-
};
|
|
48
|
-
}
|
|
49
|
-
else if (strategy === "concat") {
|
|
50
|
-
// Concatenate all files into one
|
|
51
|
-
const inputBytesArray = [];
|
|
52
|
-
let totalSize = 0;
|
|
53
|
-
for (const file of inputFiles) {
|
|
54
|
-
inputBytesArray.push(file.inputBytes);
|
|
55
|
-
totalSize += file.inputBytes.length;
|
|
56
|
-
}
|
|
57
|
-
const mergedInputBytes = new Uint8Array(totalSize);
|
|
58
|
-
let offset = 0;
|
|
59
|
-
for (const inputBytes of inputBytesArray) {
|
|
60
|
-
mergedInputBytes.set(inputBytes, offset);
|
|
61
|
-
offset += inputBytes.length;
|
|
62
|
-
}
|
|
63
|
-
return {
|
|
64
|
-
path: `merged_${crypto.randomUUID()}`,
|
|
65
|
-
inputBytes: mergedInputBytes,
|
|
66
|
-
metadata: {
|
|
67
|
-
mimeType: "application/octet-stream",
|
|
68
|
-
size: totalSize,
|
|
69
|
-
originalName: `merged_${inputFiles.length}_files`,
|
|
70
|
-
extension: "bin",
|
|
71
|
-
},
|
|
72
|
-
};
|
|
73
|
-
}
|
|
74
|
-
throw new Error(`Unknown merge strategy: ${strategy}`);
|
|
75
|
-
},
|
|
76
|
-
});
|
|
77
|
-
}
|
package/dist/multiplex-node.d.ts
DELETED
|
@@ -1,42 +0,0 @@
|
|
|
1
|
-
import { z } from "zod";
|
|
2
|
-
export declare const multiplexParamsSchema: z.ZodObject<{
|
|
3
|
-
outputCount: z.ZodNumber;
|
|
4
|
-
strategy: z.ZodDefault<z.ZodEnum<{
|
|
5
|
-
split: "split";
|
|
6
|
-
copy: "copy";
|
|
7
|
-
}>>;
|
|
8
|
-
}, z.core.$strip>;
|
|
9
|
-
export type MultiplexParams = z.infer<typeof multiplexParamsSchema>;
|
|
10
|
-
export declare function createMultiplexNode(id: string, { outputCount, strategy }: MultiplexParams): import("@uploadista/flow-core").FlowNode<{
|
|
11
|
-
path: string;
|
|
12
|
-
inputBytes: Uint8Array<ArrayBufferLike>;
|
|
13
|
-
metadata: {
|
|
14
|
-
mimeType: string;
|
|
15
|
-
size: number;
|
|
16
|
-
width?: number | undefined;
|
|
17
|
-
height?: number | undefined;
|
|
18
|
-
format?: string | undefined;
|
|
19
|
-
originalName?: string | undefined;
|
|
20
|
-
extension?: string | undefined;
|
|
21
|
-
};
|
|
22
|
-
}, {
|
|
23
|
-
files: {
|
|
24
|
-
path: string;
|
|
25
|
-
inputBytes: Uint8Array<ArrayBufferLike>;
|
|
26
|
-
metadata: {
|
|
27
|
-
mimeType: string;
|
|
28
|
-
size: number;
|
|
29
|
-
width?: number | undefined;
|
|
30
|
-
height?: number | undefined;
|
|
31
|
-
format?: string | undefined;
|
|
32
|
-
originalName?: string | undefined;
|
|
33
|
-
extension?: string | undefined;
|
|
34
|
-
};
|
|
35
|
-
}[];
|
|
36
|
-
metadata?: {
|
|
37
|
-
batchId: string;
|
|
38
|
-
totalSize: number;
|
|
39
|
-
fileCount: number;
|
|
40
|
-
} | undefined;
|
|
41
|
-
}>;
|
|
42
|
-
//# sourceMappingURL=multiplex-node.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"multiplex-node.d.ts","sourceRoot":"","sources":["../src/multiplex-node.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,eAAO,MAAM,qBAAqB;;;;;;iBAGhC,CAAC;AAEH,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAC;AAIpE,wBAAgB,mBAAmB,CACjC,EAAE,EAAE,MAAM,EACV,EAAE,WAAW,EAAE,QAAQ,EAAE,EAAE,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoE3C"}
|
package/dist/multiplex-node.js
DELETED
|
@@ -1,67 +0,0 @@
|
|
|
1
|
-
import { createFlowNode, flowFileBatchSchema, flowFileSchema, NodeType, } from "@uploadista/flow-core";
|
|
2
|
-
import { z } from "zod";
|
|
3
|
-
export const multiplexParamsSchema = z.object({
|
|
4
|
-
outputCount: z.number().min(1).max(10),
|
|
5
|
-
strategy: z.enum(["copy", "split"]).default("copy"),
|
|
6
|
-
});
|
|
7
|
-
// Define schemas for input and output
|
|
8
|
-
export function createMultiplexNode(id, { outputCount, strategy }) {
|
|
9
|
-
return createFlowNode({
|
|
10
|
-
id,
|
|
11
|
-
name: "Multiplex",
|
|
12
|
-
description: `Splits input into ${outputCount} parallel outputs using ${strategy} strategy`,
|
|
13
|
-
type: NodeType.multiplex,
|
|
14
|
-
inputSchema: flowFileSchema,
|
|
15
|
-
outputSchema: flowFileBatchSchema,
|
|
16
|
-
multiOutput: true,
|
|
17
|
-
run: async ({ data }) => {
|
|
18
|
-
if (strategy === "copy") {
|
|
19
|
-
// Copy the same file to multiple outputs
|
|
20
|
-
const files = Array.from({ length: outputCount }, (_, index) => ({
|
|
21
|
-
path: `${data.path}_copy_${index}`,
|
|
22
|
-
inputBytes: data.inputBytes,
|
|
23
|
-
metadata: {
|
|
24
|
-
...data.metadata,
|
|
25
|
-
originalName: `${data.metadata.originalName || data.path}_copy_${index}`,
|
|
26
|
-
},
|
|
27
|
-
}));
|
|
28
|
-
return {
|
|
29
|
-
files,
|
|
30
|
-
metadata: {
|
|
31
|
-
batchId: crypto.randomUUID(),
|
|
32
|
-
totalSize: files.length * data.metadata.size,
|
|
33
|
-
fileCount: files.length,
|
|
34
|
-
},
|
|
35
|
-
};
|
|
36
|
-
}
|
|
37
|
-
else if (strategy === "split") {
|
|
38
|
-
// Split the file into chunks
|
|
39
|
-
const chunkSize = Math.ceil(data.inputBytes.length / outputCount);
|
|
40
|
-
const files = [];
|
|
41
|
-
for (let i = 0; i < outputCount; i++) {
|
|
42
|
-
const start = i * chunkSize;
|
|
43
|
-
const end = Math.min(start + chunkSize, data.inputBytes.length);
|
|
44
|
-
const chunk = data.inputBytes.subarray(start, end);
|
|
45
|
-
files.push({
|
|
46
|
-
path: `${data.path}_part_${i}`,
|
|
47
|
-
inputBytes: chunk,
|
|
48
|
-
metadata: {
|
|
49
|
-
...data.metadata,
|
|
50
|
-
size: chunk.length,
|
|
51
|
-
originalName: `${data.metadata.originalName || data.path}_part_${i}`,
|
|
52
|
-
},
|
|
53
|
-
});
|
|
54
|
-
}
|
|
55
|
-
return {
|
|
56
|
-
files,
|
|
57
|
-
metadata: {
|
|
58
|
-
batchId: crypto.randomUUID(),
|
|
59
|
-
totalSize: data.inputBytes.length,
|
|
60
|
-
fileCount: files.length,
|
|
61
|
-
},
|
|
62
|
-
};
|
|
63
|
-
}
|
|
64
|
-
throw new Error(`Unknown multiplex strategy: ${strategy}`);
|
|
65
|
-
},
|
|
66
|
-
});
|
|
67
|
-
}
|
|
@@ -1,5 +0,0 @@
|
|
|
1
|
-
import { type UploadFile } from "@uploadista/core/types";
|
|
2
|
-
import { Effect } from "effect";
|
|
3
|
-
import type { ConditionalParams } from "@/types/conditional-node";
|
|
4
|
-
export declare function createConditionalNode(id: string, { field, operator, value }: ConditionalParams): Effect.Effect<import("@uploadista/core").FlowNode<UploadFile, UploadFile, import("@uploadista/core").UploadistaError>, never, never>;
|
|
5
|
-
//# sourceMappingURL=conditional-node.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"conditional-node.d.ts","sourceRoot":"","sources":["../../src/nodes/conditional-node.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,KAAK,UAAU,EAAoB,MAAM,wBAAwB,CAAC;AAC3E,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAElE,wBAAgB,qBAAqB,CACnC,EAAE,EAAE,MAAM,EACV,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE,iBAAiB,wIAgB9C"}
|
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
import { completeNodeExecution, createFlowNode, NodeType, } from "@uploadista/core/flow";
|
|
2
|
-
import { uploadFileSchema } from "@uploadista/core/types";
|
|
3
|
-
import { Effect } from "effect";
|
|
4
|
-
export function createConditionalNode(id, { field, operator, value }) {
|
|
5
|
-
return createFlowNode({
|
|
6
|
-
id,
|
|
7
|
-
name: "Conditional Router",
|
|
8
|
-
description: `Routes flow based on ${field} ${operator} ${value}`,
|
|
9
|
-
type: NodeType.conditional,
|
|
10
|
-
inputSchema: uploadFileSchema,
|
|
11
|
-
outputSchema: uploadFileSchema,
|
|
12
|
-
condition: { field, operator, value },
|
|
13
|
-
run: ({ data }) => {
|
|
14
|
-
// The actual routing logic is handled by the flow engine
|
|
15
|
-
// This node just passes through the data
|
|
16
|
-
return Effect.succeed(completeNodeExecution(data));
|
|
17
|
-
},
|
|
18
|
-
});
|
|
19
|
-
}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
import { UploadistaError } from "@uploadista/core/errors";
|
|
2
|
-
import { type UploadFile } from "@uploadista/core/types";
|
|
3
|
-
import { UploadServer } from "@uploadista/core/upload";
|
|
4
|
-
import { Effect } from "effect";
|
|
5
|
-
import type { MergeParams } from "@/types/merge-node";
|
|
6
|
-
export declare function createMergeNode(id: string, { strategy, separator: _separator }: MergeParams): Effect.Effect<import("@uploadista/core").FlowNode<Record<string, UploadFile>, UploadFile, UploadistaError>, never, UploadServer>;
|
|
7
|
-
//# sourceMappingURL=merge-node.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"merge-node.d.ts","sourceRoot":"","sources":["../../src/nodes/merge-node.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAM1D,OAAO,EAAE,KAAK,UAAU,EAAoB,MAAM,wBAAwB,CAAC;AAC3E,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAEhC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAKtD,wBAAgB,eAAe,CAC7B,EAAE,EAAE,MAAM,EACV,EAAE,QAAQ,EAAE,SAAS,EAAE,UAAU,EAAE,EAAE,WAAW,oIA6FjD"}
|
package/dist/nodes/merge-node.js
DELETED
|
@@ -1,82 +0,0 @@
|
|
|
1
|
-
import { UploadistaError } from "@uploadista/core/errors";
|
|
2
|
-
import { completeNodeExecution, createFlowNode, NodeType, } from "@uploadista/core/flow";
|
|
3
|
-
import { uploadFileSchema } from "@uploadista/core/types";
|
|
4
|
-
import { UploadServer } from "@uploadista/core/upload";
|
|
5
|
-
import { Effect } from "effect";
|
|
6
|
-
import { z } from "zod";
|
|
7
|
-
const inputSchema = z.record(z.string(), uploadFileSchema);
|
|
8
|
-
const outputSchema = uploadFileSchema;
|
|
9
|
-
export function createMergeNode(id, { strategy, separator: _separator }) {
|
|
10
|
-
return Effect.gen(function* () {
|
|
11
|
-
const uploadServer = yield* UploadServer;
|
|
12
|
-
return yield* createFlowNode({
|
|
13
|
-
id,
|
|
14
|
-
name: "Merge Files",
|
|
15
|
-
description: `Merges multiple files using ${strategy} strategy`,
|
|
16
|
-
type: NodeType.merge,
|
|
17
|
-
inputSchema,
|
|
18
|
-
outputSchema,
|
|
19
|
-
multiInput: true,
|
|
20
|
-
run: ({ data: inputs, storageId, clientId }) => {
|
|
21
|
-
return Effect.gen(function* () {
|
|
22
|
-
if (!inputs || Object.keys(inputs).length === 0) {
|
|
23
|
-
return yield* Effect.fail(UploadistaError.fromCode("VALIDATION_ERROR", {
|
|
24
|
-
body: "No inputs provided to merge node",
|
|
25
|
-
}));
|
|
26
|
-
}
|
|
27
|
-
const inputFiles = Object.values(inputs);
|
|
28
|
-
if (inputFiles.length === 0) {
|
|
29
|
-
return yield* Effect.fail(UploadistaError.fromCode("VALIDATION_ERROR", {
|
|
30
|
-
body: "No files to merge",
|
|
31
|
-
}));
|
|
32
|
-
}
|
|
33
|
-
switch (strategy) {
|
|
34
|
-
case "concat": {
|
|
35
|
-
// Read bytes from all input files
|
|
36
|
-
const inputBytesArray = [];
|
|
37
|
-
let totalSize = 0;
|
|
38
|
-
for (const file of inputFiles) {
|
|
39
|
-
const bytes = yield* uploadServer.read(file.id, clientId);
|
|
40
|
-
inputBytesArray.push(bytes);
|
|
41
|
-
totalSize += bytes.byteLength;
|
|
42
|
-
}
|
|
43
|
-
// Concatenate all files into one
|
|
44
|
-
const mergedBytes = new Uint8Array(totalSize);
|
|
45
|
-
let offset = 0;
|
|
46
|
-
for (const bytes of inputBytesArray) {
|
|
47
|
-
mergedBytes.set(bytes, offset);
|
|
48
|
-
offset += bytes.byteLength;
|
|
49
|
-
}
|
|
50
|
-
// Create a stream from the merged bytes
|
|
51
|
-
const stream = new ReadableStream({
|
|
52
|
-
start(controller) {
|
|
53
|
-
controller.enqueue(mergedBytes);
|
|
54
|
-
controller.close();
|
|
55
|
-
},
|
|
56
|
-
});
|
|
57
|
-
// Upload the merged file
|
|
58
|
-
const result = yield* uploadServer.upload({
|
|
59
|
-
storageId,
|
|
60
|
-
size: mergedBytes.byteLength,
|
|
61
|
-
type: "application/octet-stream",
|
|
62
|
-
fileName: `merged_${inputFiles.length}_files.bin`,
|
|
63
|
-
lastModified: 0,
|
|
64
|
-
metadata: JSON.stringify({
|
|
65
|
-
mimeType: "application/octet-stream",
|
|
66
|
-
originalName: `merged_${inputFiles.length}_files`,
|
|
67
|
-
extension: "bin",
|
|
68
|
-
}),
|
|
69
|
-
}, clientId, stream);
|
|
70
|
-
return completeNodeExecution(result);
|
|
71
|
-
}
|
|
72
|
-
default: {
|
|
73
|
-
return yield* Effect.fail(UploadistaError.fromCode("VALIDATION_ERROR", {
|
|
74
|
-
body: `Unknown merge strategy: ${strategy}`,
|
|
75
|
-
}));
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
});
|
|
79
|
-
},
|
|
80
|
-
});
|
|
81
|
-
});
|
|
82
|
-
}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
import { UploadistaError } from "@uploadista/core/errors";
|
|
2
|
-
import { type UploadFile } from "@uploadista/core/types";
|
|
3
|
-
import { UploadServer } from "@uploadista/core/upload";
|
|
4
|
-
import { Effect } from "effect";
|
|
5
|
-
import type { MultiplexParams } from "@/types/multiplex-node";
|
|
6
|
-
export declare function createMultiplexNode(id: string, { outputCount: _outputCount, strategy }: MultiplexParams): Effect.Effect<import("@uploadista/core").FlowNode<UploadFile, UploadFile, UploadistaError>, never, UploadServer>;
|
|
7
|
-
//# sourceMappingURL=multiplex-node.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"multiplex-node.d.ts","sourceRoot":"","sources":["../../src/nodes/multiplex-node.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAO1D,OAAO,EAAE,KAAK,UAAU,EAAoB,MAAM,wBAAwB,CAAC;AAC3E,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAE9D,wBAAgB,mBAAmB,CACjC,EAAE,EAAE,MAAM,EACV,EAAE,WAAW,EAAE,YAAY,EAAE,QAAQ,EAAE,EAAE,eAAe,oHAwEzD"}
|
|
@@ -1,57 +0,0 @@
|
|
|
1
|
-
import { UploadistaError } from "@uploadista/core/errors";
|
|
2
|
-
import { completeNodeExecution, createFlowNode, NodeType, resolveUploadMetadata, } from "@uploadista/core/flow";
|
|
3
|
-
import { uploadFileSchema } from "@uploadista/core/types";
|
|
4
|
-
import { UploadServer } from "@uploadista/core/upload";
|
|
5
|
-
import { Effect } from "effect";
|
|
6
|
-
export function createMultiplexNode(id, { outputCount: _outputCount, strategy }) {
|
|
7
|
-
return Effect.gen(function* () {
|
|
8
|
-
const uploadServer = yield* UploadServer;
|
|
9
|
-
return yield* createFlowNode({
|
|
10
|
-
id,
|
|
11
|
-
name: "Multiplex",
|
|
12
|
-
description: `Multiplexes input using ${strategy} strategy`,
|
|
13
|
-
type: NodeType.multiplex,
|
|
14
|
-
inputSchema: uploadFileSchema,
|
|
15
|
-
outputSchema: uploadFileSchema,
|
|
16
|
-
multiOutput: true,
|
|
17
|
-
run: ({ data: file, storageId, clientId }) => {
|
|
18
|
-
return Effect.gen(function* () {
|
|
19
|
-
const { type, fileName, metadata, metadataJson } = resolveUploadMetadata(file.metadata);
|
|
20
|
-
const normalizedFile = metadata ? { ...file, metadata } : file;
|
|
21
|
-
if (strategy === "copy") {
|
|
22
|
-
// For copy strategy, read and re-upload the file
|
|
23
|
-
const inputBytes = yield* uploadServer.read(normalizedFile.id, clientId);
|
|
24
|
-
const stream = new ReadableStream({
|
|
25
|
-
start(controller) {
|
|
26
|
-
controller.enqueue(inputBytes);
|
|
27
|
-
controller.close();
|
|
28
|
-
},
|
|
29
|
-
});
|
|
30
|
-
const result = yield* uploadServer.upload({
|
|
31
|
-
storageId,
|
|
32
|
-
size: inputBytes.byteLength,
|
|
33
|
-
type,
|
|
34
|
-
fileName,
|
|
35
|
-
lastModified: 0,
|
|
36
|
-
metadata: metadataJson,
|
|
37
|
-
}, clientId, stream);
|
|
38
|
-
const resolvedResult = resolveUploadMetadata(result.metadata);
|
|
39
|
-
return completeNodeExecution(resolvedResult.metadata
|
|
40
|
-
? { ...result, metadata: resolvedResult.metadata }
|
|
41
|
-
: result);
|
|
42
|
-
}
|
|
43
|
-
else if (strategy === "split") {
|
|
44
|
-
// Split strategy is not supported in the new pattern
|
|
45
|
-
// as it would require returning multiple UploadFiles
|
|
46
|
-
return yield* Effect.fail(UploadistaError.fromCode("VALIDATION_ERROR", {
|
|
47
|
-
body: "Split strategy is not supported with UploadFile pattern",
|
|
48
|
-
}));
|
|
49
|
-
}
|
|
50
|
-
return yield* Effect.fail(UploadistaError.fromCode("VALIDATION_ERROR", {
|
|
51
|
-
body: `Unknown multiplex strategy: ${strategy}`,
|
|
52
|
-
}));
|
|
53
|
-
});
|
|
54
|
-
},
|
|
55
|
-
});
|
|
56
|
-
});
|
|
57
|
-
}
|
package/dist/nodes/zip-node.d.ts
DELETED
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
import { UploadistaError } from "@uploadista/core/errors";
|
|
2
|
-
import { ZipPlugin } from "@uploadista/core/flow";
|
|
3
|
-
import { type UploadFile } from "@uploadista/core/types";
|
|
4
|
-
import { UploadServer } from "@uploadista/core/upload";
|
|
5
|
-
import { Effect } from "effect";
|
|
6
|
-
import type { ZipParams } from "@/types/zip-node";
|
|
7
|
-
export declare function createZipNode(id: string, { zipName, includeMetadata }: ZipParams): Effect.Effect<import("@uploadista/core").FlowNode<Record<string, UploadFile>, UploadFile, UploadistaError>, never, UploadServer | ZipPlugin>;
|
|
8
|
-
//# sourceMappingURL=zip-node.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"zip-node.d.ts","sourceRoot":"","sources":["../../src/nodes/zip-node.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EAIL,SAAS,EACV,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,KAAK,UAAU,EAAoB,MAAM,wBAAwB,CAAC;AAC3E,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAEhC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAKlD,wBAAgB,aAAa,CAC3B,EAAE,EAAE,MAAM,EACV,EAAE,OAAO,EAAE,eAAe,EAAE,EAAE,SAAS,gJAyExC"}
|
package/dist/nodes/zip-node.js
DELETED
|
@@ -1,64 +0,0 @@
|
|
|
1
|
-
import { UploadistaError } from "@uploadista/core/errors";
|
|
2
|
-
import { completeNodeExecution, createFlowNode, NodeType, ZipPlugin, } from "@uploadista/core/flow";
|
|
3
|
-
import { uploadFileSchema } from "@uploadista/core/types";
|
|
4
|
-
import { UploadServer } from "@uploadista/core/upload";
|
|
5
|
-
import { Effect } from "effect";
|
|
6
|
-
import { z } from "zod";
|
|
7
|
-
const inputSchema = z.record(z.string(), uploadFileSchema);
|
|
8
|
-
const outputSchema = uploadFileSchema;
|
|
9
|
-
export function createZipNode(id, { zipName, includeMetadata }) {
|
|
10
|
-
return Effect.gen(function* () {
|
|
11
|
-
const uploadServer = yield* UploadServer;
|
|
12
|
-
const zipPlugin = yield* ZipPlugin;
|
|
13
|
-
return yield* createFlowNode({
|
|
14
|
-
id,
|
|
15
|
-
name: "Zip Files",
|
|
16
|
-
description: "Combines multiple files into a zip archive",
|
|
17
|
-
type: NodeType.process,
|
|
18
|
-
inputSchema,
|
|
19
|
-
outputSchema,
|
|
20
|
-
multiInput: true,
|
|
21
|
-
run: ({ data: inputs, storageId, clientId }) => {
|
|
22
|
-
return Effect.gen(function* () {
|
|
23
|
-
if (!inputs || Object.keys(inputs).length === 0) {
|
|
24
|
-
return yield* Effect.fail(UploadistaError.fromCode("VALIDATION_ERROR", {
|
|
25
|
-
body: "No inputs provided to zip node",
|
|
26
|
-
}));
|
|
27
|
-
}
|
|
28
|
-
const zipInputs = yield* Effect.forEach(Object.values(inputs), (input) => Effect.gen(function* () {
|
|
29
|
-
const data = yield* uploadServer.read(input.id, clientId);
|
|
30
|
-
return {
|
|
31
|
-
id: input.id,
|
|
32
|
-
data,
|
|
33
|
-
metadata: input.metadata,
|
|
34
|
-
};
|
|
35
|
-
}), { concurrency: "unbounded" });
|
|
36
|
-
const zipBytes = yield* zipPlugin.zip(zipInputs, { zipName, includeMetadata });
|
|
37
|
-
// Create a stream from the zip bytes
|
|
38
|
-
const stream = new ReadableStream({
|
|
39
|
-
start(controller) {
|
|
40
|
-
controller.enqueue(zipBytes);
|
|
41
|
-
controller.close();
|
|
42
|
-
},
|
|
43
|
-
});
|
|
44
|
-
// Upload the zip file
|
|
45
|
-
const result = yield* uploadServer.upload({
|
|
46
|
-
storageId,
|
|
47
|
-
size: zipBytes.byteLength,
|
|
48
|
-
type: "application/zip",
|
|
49
|
-
fileName: zipName,
|
|
50
|
-
lastModified: 0,
|
|
51
|
-
metadata: JSON.stringify({
|
|
52
|
-
mimeType: "application/zip",
|
|
53
|
-
type: "application/zip",
|
|
54
|
-
originalName: zipName,
|
|
55
|
-
fileName: zipName,
|
|
56
|
-
extension: "zip",
|
|
57
|
-
}),
|
|
58
|
-
}, clientId, stream);
|
|
59
|
-
return completeNodeExecution(result);
|
|
60
|
-
});
|
|
61
|
-
},
|
|
62
|
-
});
|
|
63
|
-
});
|
|
64
|
-
}
|
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
import { z } from "zod";
|
|
2
|
-
export declare const conditionalParamsSchema: z.ZodObject<{
|
|
3
|
-
field: z.ZodEnum<{
|
|
4
|
-
mimeType: "mimeType";
|
|
5
|
-
size: "size";
|
|
6
|
-
width: "width";
|
|
7
|
-
height: "height";
|
|
8
|
-
extension: "extension";
|
|
9
|
-
}>;
|
|
10
|
-
operator: z.ZodEnum<{
|
|
11
|
-
equals: "equals";
|
|
12
|
-
notEquals: "notEquals";
|
|
13
|
-
greaterThan: "greaterThan";
|
|
14
|
-
lessThan: "lessThan";
|
|
15
|
-
contains: "contains";
|
|
16
|
-
startsWith: "startsWith";
|
|
17
|
-
}>;
|
|
18
|
-
value: z.ZodUnion<readonly [z.ZodString, z.ZodNumber]>;
|
|
19
|
-
}, z.core.$strip>;
|
|
20
|
-
export type ConditionalParams = z.infer<typeof conditionalParamsSchema>;
|
|
21
|
-
//# sourceMappingURL=conditional-node.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"conditional-node.d.ts","sourceRoot":"","sources":["../../src/types/conditional-node.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,eAAO,MAAM,uBAAuB;;;;;;;;;;;;;;;;;iBAWlC,CAAC;AAEH,MAAM,MAAM,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,uBAAuB,CAAC,CAAC"}
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
import { z } from "zod";
|
|
2
|
-
export const conditionalParamsSchema = z.object({
|
|
3
|
-
field: z.enum(["mimeType", "size", "width", "height", "extension"]),
|
|
4
|
-
operator: z.enum([
|
|
5
|
-
"equals",
|
|
6
|
-
"notEquals",
|
|
7
|
-
"greaterThan",
|
|
8
|
-
"lessThan",
|
|
9
|
-
"contains",
|
|
10
|
-
"startsWith",
|
|
11
|
-
]),
|
|
12
|
-
value: z.union([z.string(), z.number()]),
|
|
13
|
-
});
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAAA,cAAc,oBAAoB,CAAC;AACnC,cAAc,cAAc,CAAC;AAC7B,cAAc,kBAAkB,CAAC;AACjC,cAAc,YAAY,CAAC"}
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
import { z } from "zod";
|
|
2
|
-
export declare const mergeParamsSchema: z.ZodObject<{
|
|
3
|
-
strategy: z.ZodDefault<z.ZodEnum<{
|
|
4
|
-
concat: "concat";
|
|
5
|
-
batch: "batch";
|
|
6
|
-
}>>;
|
|
7
|
-
separator: z.ZodOptional<z.ZodDefault<z.ZodString>>;
|
|
8
|
-
inputCount: z.ZodDefault<z.ZodNumber>;
|
|
9
|
-
}, z.core.$strip>;
|
|
10
|
-
export type MergeParams = z.infer<typeof mergeParamsSchema>;
|
|
11
|
-
//# sourceMappingURL=merge-node.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"merge-node.d.ts","sourceRoot":"","sources":["../../src/types/merge-node.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,eAAO,MAAM,iBAAiB;;;;;;;iBAI5B,CAAC;AAEH,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC"}
|
package/dist/types/merge-node.js
DELETED
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
import { z } from "zod";
|
|
2
|
-
export declare const multiplexParamsSchema: z.ZodObject<{
|
|
3
|
-
outputCount: z.ZodNumber;
|
|
4
|
-
strategy: z.ZodDefault<z.ZodEnum<{
|
|
5
|
-
copy: "copy";
|
|
6
|
-
split: "split";
|
|
7
|
-
}>>;
|
|
8
|
-
}, z.core.$strip>;
|
|
9
|
-
export type MultiplexParams = z.infer<typeof multiplexParamsSchema>;
|
|
10
|
-
//# sourceMappingURL=multiplex-node.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"multiplex-node.d.ts","sourceRoot":"","sources":["../../src/types/multiplex-node.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,eAAO,MAAM,qBAAqB;;;;;;iBAGhC,CAAC;AAEH,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAC"}
|
package/dist/types/zip-node.d.ts
DELETED
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
import { z } from "zod";
|
|
2
|
-
export declare const zipParamsSchema: z.ZodObject<{
|
|
3
|
-
zipName: z.ZodDefault<z.ZodString>;
|
|
4
|
-
includeMetadata: z.ZodDefault<z.ZodBoolean>;
|
|
5
|
-
inputCount: z.ZodDefault<z.ZodNumber>;
|
|
6
|
-
}, z.core.$strip>;
|
|
7
|
-
export type ZipParams = z.infer<typeof zipParamsSchema>;
|
|
8
|
-
//# sourceMappingURL=zip-node.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"zip-node.d.ts","sourceRoot":"","sources":["../../src/types/zip-node.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,eAAO,MAAM,eAAe;;;;iBAI1B,CAAC;AAEH,MAAM,MAAM,SAAS,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,eAAe,CAAC,CAAC"}
|
package/dist/types/zip-node.js
DELETED
package/dist/zip-node.d.ts
DELETED
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
import { type FlowFile, type FlowFileBatch } from "@uploadista/flow-core";
|
|
2
|
-
import { z } from "zod";
|
|
3
|
-
export declare const zipParamsSchema: z.ZodObject<{
|
|
4
|
-
zipName: z.ZodDefault<z.ZodString>;
|
|
5
|
-
includeMetadata: z.ZodDefault<z.ZodBoolean>;
|
|
6
|
-
}, z.core.$strip>;
|
|
7
|
-
export type ZipParams = z.infer<typeof zipParamsSchema>;
|
|
8
|
-
export declare function createZipNode(id: string, { zipName, includeMetadata }: ZipParams): import("@uploadista/flow-core").FlowNode<Record<string, FlowFile | FlowFileBatch>, FlowFile>;
|
|
9
|
-
//# sourceMappingURL=zip-node.d.ts.map
|
package/dist/zip-node.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"zip-node.d.ts","sourceRoot":"","sources":["../src/zip-node.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,QAAQ,EACb,KAAK,aAAa,EAKnB,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,eAAO,MAAM,eAAe;;;iBAG1B,CAAC;AAEH,MAAM,MAAM,SAAS,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,eAAe,CAAC,CAAC;AASxD,wBAAgB,aAAa,CAC3B,EAAE,EAAE,MAAM,EACV,EAAE,OAAO,EAAE,eAAe,EAAE,EAAE,SAAS,gGAmExC"}
|
package/dist/zip-node.js
DELETED
|
@@ -1,65 +0,0 @@
|
|
|
1
|
-
import { createFlowNode, flowFileBatchSchema, flowFileSchema, isFlowFile, NodeType, } from "@uploadista/flow-core";
|
|
2
|
-
import JSZip from "jszip";
|
|
3
|
-
import { z } from "zod";
|
|
4
|
-
export const zipParamsSchema = z.object({
|
|
5
|
-
zipName: z.string().default("archive.zip"),
|
|
6
|
-
includeMetadata: z.boolean().default(false),
|
|
7
|
-
});
|
|
8
|
-
// Define schemas for input and output
|
|
9
|
-
const inputSchema = z.record(z.string(), z.union([flowFileSchema, flowFileBatchSchema]));
|
|
10
|
-
export function createZipNode(id, { zipName, includeMetadata }) {
|
|
11
|
-
return createFlowNode({
|
|
12
|
-
id,
|
|
13
|
-
name: "Zip Files",
|
|
14
|
-
description: "Combines multiple files into a zip archive",
|
|
15
|
-
type: NodeType.process,
|
|
16
|
-
inputSchema,
|
|
17
|
-
outputSchema: flowFileSchema,
|
|
18
|
-
multiInput: true,
|
|
19
|
-
run: async ({ data: inputs }) => {
|
|
20
|
-
if (!inputs) {
|
|
21
|
-
throw new Error("No inputs provided to zip node");
|
|
22
|
-
}
|
|
23
|
-
const zip = new JSZip();
|
|
24
|
-
// Process all input files
|
|
25
|
-
for (const [sourceId, input] of Object.entries(inputs)) {
|
|
26
|
-
if (isFlowFile(input)) {
|
|
27
|
-
// Handle single FlowFile
|
|
28
|
-
const fileName = input.metadata.originalName || `${sourceId}_${input.path}`;
|
|
29
|
-
zip.file(fileName, input.inputBytes);
|
|
30
|
-
if (includeMetadata) {
|
|
31
|
-
zip.file(`${fileName}.meta.json`, JSON.stringify(input.metadata, null, 2));
|
|
32
|
-
}
|
|
33
|
-
}
|
|
34
|
-
else {
|
|
35
|
-
// Handle FlowFileBatch
|
|
36
|
-
for (const file of input.files) {
|
|
37
|
-
const fileName = file.metadata.originalName || `${sourceId}_${file.path}`;
|
|
38
|
-
zip.file(fileName, file.inputBytes);
|
|
39
|
-
if (includeMetadata) {
|
|
40
|
-
zip.file(`${fileName}.meta.json`, JSON.stringify(file.metadata, null, 2));
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
|
-
}
|
|
45
|
-
// Generate the zip file
|
|
46
|
-
const zipBuffer = await zip.generateAsync({
|
|
47
|
-
type: "nodebuffer",
|
|
48
|
-
compression: "DEFLATE",
|
|
49
|
-
compressionOptions: {
|
|
50
|
-
level: 6, // Good balance between speed and compression
|
|
51
|
-
},
|
|
52
|
-
});
|
|
53
|
-
return {
|
|
54
|
-
path: zipName,
|
|
55
|
-
inputBytes: new Uint8Array(zipBuffer.buffer, zipBuffer.byteOffset, zipBuffer.byteLength),
|
|
56
|
-
metadata: {
|
|
57
|
-
mimeType: "application/zip",
|
|
58
|
-
size: zipBuffer.length,
|
|
59
|
-
originalName: zipName,
|
|
60
|
-
extension: "zip",
|
|
61
|
-
},
|
|
62
|
-
};
|
|
63
|
-
},
|
|
64
|
-
});
|
|
65
|
-
}
|