@uploadista/flow-security-nodes 0.0.16 → 0.0.17-beta.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,6 +1,6 @@
1
1
 
2
2
  
3
- > @uploadista/flow-security-nodes@0.0.16-beta.3 build /Users/denislaboureyras/Documents/uploadista/dev/uploadista-workspace/uploadista-sdk/packages/flow/security/nodes
3
+ > @uploadista/flow-security-nodes@0.0.16 build /Users/denislaboureyras/Documents/uploadista/dev/uploadista-workspace/uploadista-sdk/packages/flow/security/nodes
4
4
  > tsdown
5
5
 
6
6
  ℹ tsdown v0.16.5 powered by rolldown v1.0.0-beta.50
@@ -9,14 +9,14 @@
9
9
  ℹ tsconfig: tsconfig.json
10
10
  ℹ Build start
11
11
  ℹ Cleaning 7 files
12
- ℹ [CJS] dist/index.cjs 1.05 kB │ gzip: 0.58 kB
13
- ℹ [CJS] 1 files, total: 1.05 kB
14
- ℹ [ESM] dist/index.mjs 1.08 kB │ gzip: 0.61 kB
15
- ℹ [ESM] dist/index.mjs.map 5.11 kB │ gzip: 1.95 kB
12
+ ℹ [CJS] dist/index.cjs 1.09 kB │ gzip: 0.61 kB
13
+ ℹ [CJS] 1 files, total: 1.09 kB
14
+ ℹ [ESM] dist/index.mjs 1.12 kB │ gzip: 0.65 kB
15
+ ℹ [ESM] dist/index.mjs.map 5.19 kB │ gzip: 1.99 kB
16
16
  ℹ [ESM] dist/index.d.mts.map 0.54 kB │ gzip: 0.28 kB
17
17
  ℹ [ESM] dist/index.d.mts 3.18 kB │ gzip: 1.17 kB
18
- ℹ [ESM] 4 files, total: 9.91 kB
18
+ ℹ [ESM] 4 files, total: 10.04 kB
19
19
  ℹ [CJS] dist/index.d.cts.map 0.54 kB │ gzip: 0.28 kB
20
20
  ℹ [CJS] dist/index.d.cts 3.18 kB │ gzip: 1.16 kB
21
21
  ℹ [CJS] 2 files, total: 3.72 kB
22
- ✔ Build complete in 6232ms
22
+ ✔ Build complete in 6601ms
package/dist/index.cjs CHANGED
@@ -1 +1 @@
1
- let e=require(`@uploadista/core/errors`),t=require(`@uploadista/core/flow`),n=require(`effect`),r=require(`zod`);const i=r.z.enum([`fail`,`pass`]),a=r.z.object({action:i.default(`fail`),timeout:r.z.number().min(1e3).max(3e5).optional().default(6e4)});function o(r,i={action:`fail`,timeout:6e4}){return n.Effect.gen(function*(){let o=yield*t.VirusScanPlugin,s=a.parse(i);return yield*(0,t.createTransformNode)({id:r,name:`Scan Virus`,description:`Scans files for viruses and malware using ClamAV`,transform:(t,r)=>n.Effect.gen(function*(){let n=yield*o.scan(t),i=yield*o.getVersion(),a={scanned:!0,isClean:n.isClean,detectedViruses:n.detectedViruses,scanDate:new Date().toISOString(),engineVersion:i,definitionsDate:new Date().toISOString()};if(!n.isClean){let t=`Virus detected: ${n.detectedViruses.join(`, `)}`;if(s.action===`fail`)return yield*(0,e.httpFailure)(`VIRUS_DETECTED`,{body:t,details:{scanMetadata:a}})}return{bytes:t,metadata:{...r.metadata,virusScan:a}}})})})}exports.ScanAction=i,exports.ScanVirusParams=a,exports.createScanVirusNode=o;
1
+ let e=require(`@uploadista/core/errors`),t=require(`@uploadista/core/flow`),n=require(`effect`),r=require(`zod`);const i=r.z.enum([`fail`,`pass`]),a=r.z.object({action:i.default(`fail`),timeout:r.z.number().min(1e3).max(3e5).optional().default(6e4)});function o(r,i={action:`fail`,timeout:6e4}){return n.Effect.gen(function*(){let o=yield*t.VirusScanPlugin,s=a.parse(i);return yield*(0,t.createTransformNode)({id:r,name:`Scan Virus`,description:`Scans files for viruses and malware using ClamAV`,nodeTypeId:t.STORAGE_OUTPUT_TYPE_ID,transform:(t,r)=>n.Effect.gen(function*(){let n=yield*o.scan(t),i=yield*o.getVersion(),a={scanned:!0,isClean:n.isClean,detectedViruses:n.detectedViruses,scanDate:new Date().toISOString(),engineVersion:i,definitionsDate:new Date().toISOString()};if(!n.isClean){let t=`Virus detected: ${n.detectedViruses.join(`, `)}`;if(s.action===`fail`)return yield*(0,e.httpFailure)(`VIRUS_DETECTED`,{body:t,details:{scanMetadata:a}})}return{bytes:t,metadata:{...r.metadata,virusScan:a}}})})})}exports.ScanAction=i,exports.ScanVirusParams=a,exports.createScanVirusNode=o;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.cts","names":[],"sources":["../src/scan-virus-node.ts"],"sourcesContent":[],"mappings":";;;;;;;;;;;;cAYa,YAAU,CAAA,CAAA;;;AAAvB,CAAA,CAAA;AACY,KAAA,UAAA,GAAa,CAAA,CAAE,KAAa,CAAA,OAAA,UAAR,CAAA;AAKhC;;;cAAa,iBAAe,CAAA,CAAA;;;;EAAA,CAAA,CAAA,CAAA;EAAA,OAAA,cAAA,cAAA,YAAA,CAAA,CAAA;AAgB5B,CAAA,eAAY,CAAA;AA8BI,KA9BJ,eAAA,GAAkB,CAAA,CAAE,KA8BG,CAAA,OA9BU,eA8BV,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAAnB,mBAAA,sBAEN,kBAAoD,MAAA,CAAA,OAAA,sBAAA,CAAA,YAAA;yBAAA,uBAAA,CAAA,UAAA;;;;;;;aA2DoplI;;iEAAA,uBAAA,CAAA,UAAA"}
1
+ {"version":3,"file":"index.d.cts","names":[],"sources":["../src/scan-virus-node.ts"],"sourcesContent":[],"mappings":";;;;;;;;;;;;cAaa,YAAU,CAAA,CAAA;;;AAAvB,CAAA,CAAA;AACY,KAAA,UAAA,GAAa,CAAA,CAAE,KAAa,CAAA,OAAA,UAAR,CAAA;AAKhC;;;cAAa,iBAAe,CAAA,CAAA;;;;EAAA,CAAA,CAAA,CAAA;EAAA,OAAA,cAAA,cAAA,YAAA,CAAA,CAAA;AAgB5B,CAAA,eAAY,CAAA;AA8BI,KA9BJ,eAAA,GAAkB,CAAA,CAAE,KA8BG,CAAA,OA9BU,eA8BV,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAAnB,mBAAA,sBAEN,kBAAoD,MAAA,CAAA,OAAA,sBAAA,CAAA,YAAA;yBAAA,uBAAA,CAAA,UAAA;;;;;;;aA4D6j9H;;iEAAA,uBAAA,CAAA,UAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.mts","names":[],"sources":["../src/scan-virus-node.ts"],"sourcesContent":[],"mappings":";;;;;;;;;;;;cAYa,YAAU,CAAA,CAAA;;;AAAvB,CAAA,CAAA;AACY,KAAA,UAAA,GAAa,CAAA,CAAE,KAAa,CAAA,OAAA,UAAR,CAAA;AAKhC;;;cAAa,iBAAe,CAAA,CAAA;;;;EAAA,CAAA,CAAA,CAAA;EAAA,OAAA,cAAA,cAAA,YAAA,CAAA,CAAA;AAgB5B,CAAA,eAAY,CAAA;AA8BI,KA9BJ,eAAA,GAAkB,CAAA,CAAE,KA8BG,CAAA,OA9BU,eA8BV,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAAnB,mBAAA,sBAEN,kBAAoD,MAAA,CAAA,OAAA,sBAAA,CAAA,YAAA;yBAAA,uBAAA,CAAA,UAAA;;;;;;;aA2DoplI;;iEAAA,uBAAA,CAAA,UAAA"}
1
+ {"version":3,"file":"index.d.mts","names":[],"sources":["../src/scan-virus-node.ts"],"sourcesContent":[],"mappings":";;;;;;;;;;;;cAaa,YAAU,CAAA,CAAA;;;AAAvB,CAAA,CAAA;AACY,KAAA,UAAA,GAAa,CAAA,CAAE,KAAa,CAAA,OAAA,UAAR,CAAA;AAKhC;;;cAAa,iBAAe,CAAA,CAAA;;;;EAAA,CAAA,CAAA,CAAA;EAAA,OAAA,cAAA,cAAA,YAAA,CAAA,CAAA;AAgB5B,CAAA,eAAY,CAAA;AA8BI,KA9BJ,eAAA,GAAkB,CAAA,CAAE,KA8BG,CAAA,OA9BU,eA8BV,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAAnB,mBAAA,sBAEN,kBAAoD,MAAA,CAAA,OAAA,sBAAA,CAAA,YAAA;yBAAA,uBAAA,CAAA,UAAA;;;;;;;aA4D6j9H;;iEAAA,uBAAA,CAAA,UAAA"}
package/dist/index.mjs CHANGED
@@ -1,2 +1,2 @@
1
- import{httpFailure as e}from"@uploadista/core/errors";import{VirusScanPlugin as t,createTransformNode as n}from"@uploadista/core/flow";import{Effect as r}from"effect";import{z as i}from"zod";const a=i.enum([`fail`,`pass`]),o=i.object({action:a.default(`fail`),timeout:i.number().min(1e3).max(3e5).optional().default(6e4)});function s(i,a={action:`fail`,timeout:6e4}){return r.gen(function*(){let s=yield*t,c=o.parse(a);return yield*n({id:i,name:`Scan Virus`,description:`Scans files for viruses and malware using ClamAV`,transform:(t,n)=>r.gen(function*(){let r=yield*s.scan(t),i=yield*s.getVersion(),a={scanned:!0,isClean:r.isClean,detectedViruses:r.detectedViruses,scanDate:new Date().toISOString(),engineVersion:i,definitionsDate:new Date().toISOString()};if(!r.isClean){let t=`Virus detected: ${r.detectedViruses.join(`, `)}`;if(c.action===`fail`)return yield*e(`VIRUS_DETECTED`,{body:t,details:{scanMetadata:a}})}return{bytes:t,metadata:{...n.metadata,virusScan:a}}})})})}export{a as ScanAction,o as ScanVirusParams,s as createScanVirusNode};
1
+ import{httpFailure as e}from"@uploadista/core/errors";import{STORAGE_OUTPUT_TYPE_ID as t,VirusScanPlugin as n,createTransformNode as r}from"@uploadista/core/flow";import{Effect as i}from"effect";import{z as a}from"zod";const o=a.enum([`fail`,`pass`]),s=a.object({action:o.default(`fail`),timeout:a.number().min(1e3).max(3e5).optional().default(6e4)});function c(a,o={action:`fail`,timeout:6e4}){return i.gen(function*(){let c=yield*n,l=s.parse(o);return yield*r({id:a,name:`Scan Virus`,description:`Scans files for viruses and malware using ClamAV`,nodeTypeId:t,transform:(t,n)=>i.gen(function*(){let r=yield*c.scan(t),i=yield*c.getVersion(),a={scanned:!0,isClean:r.isClean,detectedViruses:r.detectedViruses,scanDate:new Date().toISOString(),engineVersion:i,definitionsDate:new Date().toISOString()};if(!r.isClean){let t=`Virus detected: ${r.detectedViruses.join(`, `)}`;if(l.action===`fail`)return yield*e(`VIRUS_DETECTED`,{body:t,details:{scanMetadata:a}})}return{bytes:t,metadata:{...n.metadata,virusScan:a}}})})})}export{o as ScanAction,s as ScanVirusParams,c as createScanVirusNode};
2
2
  //# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","names":["scanMetadata: ScanMetadata"],"sources":["../src/scan-virus-node.ts"],"sourcesContent":["import { httpFailure } from \"@uploadista/core/errors\";\nimport {\n createTransformNode,\n type ScanMetadata,\n VirusScanPlugin,\n} from \"@uploadista/core/flow\";\nimport { Effect } from \"effect\";\nimport { z } from \"zod\";\n\n/**\n * Scan action to take when a virus is detected\n */\nexport const ScanAction = z.enum([\"fail\", \"pass\"]);\nexport type ScanAction = z.infer<typeof ScanAction>;\n\n/**\n * Parameters for the Scan Virus node\n */\nexport const ScanVirusParams = z.object({\n /**\n * Action to take when a virus is detected:\n * - \"fail\": Mark flow task as FAILED and stop processing\n * - \"pass\": Continue processing but add virus metadata to file\n */\n action: ScanAction.default(\"fail\"),\n\n /**\n * Maximum time to wait for scan completion (in milliseconds)\n * Default: 60000ms (60 seconds)\n * Max: 300000ms (5 minutes)\n */\n timeout: z.number().min(1000).max(300000).optional().default(60000),\n});\n\nexport type ScanVirusParams = z.infer<typeof ScanVirusParams>;\n\n/**\n * Creates a Scan Virus node for malware detection\n *\n * Scans files for viruses and malware using the configured VirusScanPlugin\n * (typically ClamAV). Supports configurable actions on detection:\n * - \"fail\": Stop flow execution when virus detected\n * - \"pass\": Continue flow with detection metadata\n *\n * All scan results are stored in file.metadata.virusScan for downstream nodes.\n *\n * @param id - Unique node identifier\n * @param params - Configuration parameters for scan behavior\n * @returns Effect that resolves to the configured node\n *\n * @example\n * ```typescript\n * // Fail on virus detection (default)\n * const failNode = yield* createScanVirusNode(\"scan-1\", {\n * action: \"fail\"\n * });\n *\n * // Pass through with metadata\n * const passNode = yield* createScanVirusNode(\"scan-2\", {\n * action: \"pass\",\n * timeout: 120000 // 2 minutes\n * });\n * ```\n */\nexport function createScanVirusNode(\n id: string,\n params: ScanVirusParams = { action: \"fail\", timeout: 60000 },\n) {\n return Effect.gen(function* () {\n const virusScanService = yield* VirusScanPlugin;\n\n // Validate params\n const validatedParams = ScanVirusParams.parse(params);\n\n return yield* createTransformNode({\n id,\n name: \"Scan Virus\",\n description: \"Scans files for viruses and malware using ClamAV\",\n transform: (inputBytes, file) =>\n Effect.gen(function* () {\n // Perform virus scan\n const scanResult = yield* virusScanService.scan(inputBytes);\n\n // Get engine version for metadata\n const engineVersion = yield* virusScanService.getVersion();\n\n // Build comprehensive scan metadata\n const scanMetadata: ScanMetadata = {\n scanned: true,\n isClean: scanResult.isClean,\n detectedViruses: scanResult.detectedViruses,\n scanDate: new Date().toISOString(),\n engineVersion,\n definitionsDate: new Date().toISOString(), // TODO: Get actual definitions date from plugin\n };\n\n // Check if virus was detected\n if (!scanResult.isClean) {\n // Build error message with detected viruses\n const virusList = scanResult.detectedViruses.join(\", \");\n const message = `Virus detected: ${virusList}`;\n\n // Handle based on configured action\n if (validatedParams.action === \"fail\") {\n // Fail the flow task\n return yield* httpFailure(\"VIRUS_DETECTED\", {\n body: message,\n details: { scanMetadata },\n });\n }\n // action === \"pass\": Continue with metadata (handled below)\n }\n\n // Return file with scan metadata (clean or pass action)\n return {\n bytes: inputBytes, // Pass through original bytes unchanged\n metadata: {\n ...file.metadata,\n virusScan: scanMetadata,\n },\n };\n }),\n });\n });\n}\n"],"mappings":"+LAYA,MAAa,EAAa,EAAE,KAAK,CAAC,OAAQ,OAAO,CAAC,CAMrC,EAAkB,EAAE,OAAO,CAMtC,OAAQ,EAAW,QAAQ,OAAO,CAOlC,QAAS,EAAE,QAAQ,CAAC,IAAI,IAAK,CAAC,IAAI,IAAO,CAAC,UAAU,CAAC,QAAQ,IAAM,CACpE,CAAC,CAgCF,SAAgB,EACd,EACA,EAA0B,CAAE,OAAQ,OAAQ,QAAS,IAAO,CAC5D,CACA,OAAO,EAAO,IAAI,WAAa,CAC7B,IAAM,EAAmB,MAAO,EAG1B,EAAkB,EAAgB,MAAM,EAAO,CAErD,OAAO,MAAO,EAAoB,CAChC,KACA,KAAM,aACN,YAAa,mDACb,WAAY,EAAY,IACtB,EAAO,IAAI,WAAa,CAEtB,IAAM,EAAa,MAAO,EAAiB,KAAK,EAAW,CAGrD,EAAgB,MAAO,EAAiB,YAAY,CAGpDA,EAA6B,CACjC,QAAS,GACT,QAAS,EAAW,QACpB,gBAAiB,EAAW,gBAC5B,SAAU,IAAI,MAAM,CAAC,aAAa,CAClC,gBACA,gBAAiB,IAAI,MAAM,CAAC,aAAa,CAC1C,CAGD,GAAI,CAAC,EAAW,QAAS,CAGvB,IAAM,EAAU,mBADE,EAAW,gBAAgB,KAAK,KAAK,GAIvD,GAAI,EAAgB,SAAW,OAE7B,OAAO,MAAO,EAAY,iBAAkB,CAC1C,KAAM,EACN,QAAS,CAAE,eAAc,CAC1B,CAAC,CAMN,MAAO,CACL,MAAO,EACP,SAAU,CACR,GAAG,EAAK,SACR,UAAW,EACZ,CACF,EACD,CACL,CAAC,EACF"}
1
+ {"version":3,"file":"index.mjs","names":["scanMetadata: ScanMetadata"],"sources":["../src/scan-virus-node.ts"],"sourcesContent":["import { httpFailure } from \"@uploadista/core/errors\";\nimport {\n createTransformNode,\n type ScanMetadata,\n STORAGE_OUTPUT_TYPE_ID,\n VirusScanPlugin,\n} from \"@uploadista/core/flow\";\nimport { Effect } from \"effect\";\nimport { z } from \"zod\";\n\n/**\n * Scan action to take when a virus is detected\n */\nexport const ScanAction = z.enum([\"fail\", \"pass\"]);\nexport type ScanAction = z.infer<typeof ScanAction>;\n\n/**\n * Parameters for the Scan Virus node\n */\nexport const ScanVirusParams = z.object({\n /**\n * Action to take when a virus is detected:\n * - \"fail\": Mark flow task as FAILED and stop processing\n * - \"pass\": Continue processing but add virus metadata to file\n */\n action: ScanAction.default(\"fail\"),\n\n /**\n * Maximum time to wait for scan completion (in milliseconds)\n * Default: 60000ms (60 seconds)\n * Max: 300000ms (5 minutes)\n */\n timeout: z.number().min(1000).max(300000).optional().default(60000),\n});\n\nexport type ScanVirusParams = z.infer<typeof ScanVirusParams>;\n\n/**\n * Creates a Scan Virus node for malware detection\n *\n * Scans files for viruses and malware using the configured VirusScanPlugin\n * (typically ClamAV). Supports configurable actions on detection:\n * - \"fail\": Stop flow execution when virus detected\n * - \"pass\": Continue flow with detection metadata\n *\n * All scan results are stored in file.metadata.virusScan for downstream nodes.\n *\n * @param id - Unique node identifier\n * @param params - Configuration parameters for scan behavior\n * @returns Effect that resolves to the configured node\n *\n * @example\n * ```typescript\n * // Fail on virus detection (default)\n * const failNode = yield* createScanVirusNode(\"scan-1\", {\n * action: \"fail\"\n * });\n *\n * // Pass through with metadata\n * const passNode = yield* createScanVirusNode(\"scan-2\", {\n * action: \"pass\",\n * timeout: 120000 // 2 minutes\n * });\n * ```\n */\nexport function createScanVirusNode(\n id: string,\n params: ScanVirusParams = { action: \"fail\", timeout: 60000 },\n) {\n return Effect.gen(function* () {\n const virusScanService = yield* VirusScanPlugin;\n\n // Validate params\n const validatedParams = ScanVirusParams.parse(params);\n\n return yield* createTransformNode({\n id,\n name: \"Scan Virus\",\n description: \"Scans files for viruses and malware using ClamAV\",\n nodeTypeId: STORAGE_OUTPUT_TYPE_ID,\n transform: (inputBytes, file) =>\n Effect.gen(function* () {\n // Perform virus scan\n const scanResult = yield* virusScanService.scan(inputBytes);\n\n // Get engine version for metadata\n const engineVersion = yield* virusScanService.getVersion();\n\n // Build comprehensive scan metadata\n const scanMetadata: ScanMetadata = {\n scanned: true,\n isClean: scanResult.isClean,\n detectedViruses: scanResult.detectedViruses,\n scanDate: new Date().toISOString(),\n engineVersion,\n definitionsDate: new Date().toISOString(), // TODO: Get actual definitions date from plugin\n };\n\n // Check if virus was detected\n if (!scanResult.isClean) {\n // Build error message with detected viruses\n const virusList = scanResult.detectedViruses.join(\", \");\n const message = `Virus detected: ${virusList}`;\n\n // Handle based on configured action\n if (validatedParams.action === \"fail\") {\n // Fail the flow task\n return yield* httpFailure(\"VIRUS_DETECTED\", {\n body: message,\n details: { scanMetadata },\n });\n }\n // action === \"pass\": Continue with metadata (handled below)\n }\n\n // Return file with scan metadata (clean or pass action)\n return {\n bytes: inputBytes, // Pass through original bytes unchanged\n metadata: {\n ...file.metadata,\n virusScan: scanMetadata,\n },\n };\n }),\n });\n });\n}\n"],"mappings":"2NAaA,MAAa,EAAa,EAAE,KAAK,CAAC,OAAQ,OAAO,CAAC,CAMrC,EAAkB,EAAE,OAAO,CAMtC,OAAQ,EAAW,QAAQ,OAAO,CAOlC,QAAS,EAAE,QAAQ,CAAC,IAAI,IAAK,CAAC,IAAI,IAAO,CAAC,UAAU,CAAC,QAAQ,IAAM,CACpE,CAAC,CAgCF,SAAgB,EACd,EACA,EAA0B,CAAE,OAAQ,OAAQ,QAAS,IAAO,CAC5D,CACA,OAAO,EAAO,IAAI,WAAa,CAC7B,IAAM,EAAmB,MAAO,EAG1B,EAAkB,EAAgB,MAAM,EAAO,CAErD,OAAO,MAAO,EAAoB,CAChC,KACA,KAAM,aACN,YAAa,mDACb,WAAY,EACZ,WAAY,EAAY,IACtB,EAAO,IAAI,WAAa,CAEtB,IAAM,EAAa,MAAO,EAAiB,KAAK,EAAW,CAGrD,EAAgB,MAAO,EAAiB,YAAY,CAGpDA,EAA6B,CACjC,QAAS,GACT,QAAS,EAAW,QACpB,gBAAiB,EAAW,gBAC5B,SAAU,IAAI,MAAM,CAAC,aAAa,CAClC,gBACA,gBAAiB,IAAI,MAAM,CAAC,aAAa,CAC1C,CAGD,GAAI,CAAC,EAAW,QAAS,CAGvB,IAAM,EAAU,mBADE,EAAW,gBAAgB,KAAK,KAAK,GAIvD,GAAI,EAAgB,SAAW,OAE7B,OAAO,MAAO,EAAY,iBAAkB,CAC1C,KAAM,EACN,QAAS,CAAE,eAAc,CAC1B,CAAC,CAMN,MAAO,CACL,MAAO,EACP,SAAU,CACR,GAAG,EAAK,SACR,UAAW,EACZ,CACF,EACD,CACL,CAAC,EACF"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@uploadista/flow-security-nodes",
3
3
  "type": "module",
4
- "version": "0.0.16",
4
+ "version": "0.0.17-beta.1",
5
5
  "description": "Security processing nodes for Uploadista Flow",
6
6
  "license": "MIT",
7
7
  "author": "Uploadista",
@@ -16,14 +16,14 @@
16
16
  "dependencies": {
17
17
  "effect": "3.19.4",
18
18
  "zod": "4.1.12",
19
- "@uploadista/core": "0.0.16"
19
+ "@uploadista/core": "0.0.17-beta.1"
20
20
  },
21
21
  "devDependencies": {
22
22
  "@effect/vitest": "0.27.0",
23
23
  "@types/node": "24.10.1",
24
24
  "tsdown": "0.16.5",
25
- "vitest": "4.0.8",
26
- "@uploadista/typescript-config": "0.0.16"
25
+ "vitest": "4.0.10",
26
+ "@uploadista/typescript-config": "0.0.17-beta.1"
27
27
  },
28
28
  "scripts": {
29
29
  "build": "tsdown",
@@ -2,6 +2,7 @@ import { httpFailure } from "@uploadista/core/errors";
2
2
  import {
3
3
  createTransformNode,
4
4
  type ScanMetadata,
5
+ STORAGE_OUTPUT_TYPE_ID,
5
6
  VirusScanPlugin,
6
7
  } from "@uploadista/core/flow";
7
8
  import { Effect } from "effect";
@@ -76,6 +77,7 @@ export function createScanVirusNode(
76
77
  id,
77
78
  name: "Scan Virus",
78
79
  description: "Scans files for viruses and malware using ClamAV",
80
+ nodeTypeId: STORAGE_OUTPUT_TYPE_ID,
79
81
  transform: (inputBytes, file) =>
80
82
  Effect.gen(function* () {
81
83
  // Perform virus scan