n8n-nodes-comfyui-all 2.2.9 → 2.2.10

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.
Files changed (37) hide show
  1. package/README.md +126 -11
  2. package/dist/agent-tools/ComfyUIAgentTool.d.ts +57 -0
  3. package/dist/agent-tools/ComfyUIAgentTool.d.ts.map +1 -0
  4. package/dist/agent-tools/ComfyUIAgentTool.js +405 -0
  5. package/dist/agent-tools/ComfyUIAgentTool.js.map +1 -0
  6. package/dist/nodes/ComfyUi/ComfyUi.node.d.ts +9 -0
  7. package/dist/nodes/ComfyUi/ComfyUi.node.d.ts.map +1 -1
  8. package/dist/nodes/ComfyUi/ComfyUi.node.js +66 -100
  9. package/dist/nodes/ComfyUi/ComfyUi.node.js.map +1 -1
  10. package/dist/nodes/ComfyUiClient.d.ts +81 -0
  11. package/dist/nodes/ComfyUiClient.d.ts.map +1 -1
  12. package/dist/nodes/ComfyUiClient.js +235 -26
  13. package/dist/nodes/ComfyUiClient.js.map +1 -1
  14. package/dist/nodes/constants.d.ts +5 -1
  15. package/dist/nodes/constants.d.ts.map +1 -1
  16. package/dist/nodes/constants.js +7 -12
  17. package/dist/nodes/constants.js.map +1 -1
  18. package/dist/nodes/logger.d.ts +9 -19
  19. package/dist/nodes/logger.d.ts.map +1 -1
  20. package/dist/nodes/logger.js +62 -25
  21. package/dist/nodes/logger.js.map +1 -1
  22. package/dist/nodes/types.d.ts +62 -0
  23. package/dist/nodes/types.d.ts.map +1 -1
  24. package/dist/nodes/utils.d.ts +47 -0
  25. package/dist/nodes/utils.d.ts.map +1 -0
  26. package/dist/nodes/utils.js +139 -0
  27. package/dist/nodes/utils.js.map +1 -0
  28. package/dist/nodes/validation.d.ts +1 -0
  29. package/dist/nodes/validation.d.ts.map +1 -1
  30. package/dist/nodes/validation.js +51 -2
  31. package/dist/nodes/validation.js.map +1 -1
  32. package/dist/nodes/workflowConfig.d.ts +13 -0
  33. package/dist/nodes/workflowConfig.d.ts.map +1 -0
  34. package/dist/nodes/workflowConfig.js +91 -0
  35. package/dist/nodes/workflowConfig.js.map +1 -0
  36. package/package.json +3 -1
  37. package/LICENSE +0 -21
@@ -1,9 +1,4 @@
1
1
  "use strict";
2
- /**
3
- * Simple logger for ComfyUI nodes
4
- * In n8n context, console statements are not allowed
5
- * This logger is disabled for community nodes
6
- */
7
2
  Object.defineProperty(exports, "__esModule", { value: true });
8
3
  exports.Logger = exports.LogLevel = void 0;
9
4
  exports.createLogger = createLogger;
@@ -14,34 +9,76 @@ var LogLevel;
14
9
  LogLevel["WARN"] = "warn";
15
10
  LogLevel["ERROR"] = "error";
16
11
  })(LogLevel || (exports.LogLevel = LogLevel = {}));
12
+ /**
13
+ * Null Logger implementation for cases where no logger is provided
14
+ * Implements a no-op logger that silently discards all log messages
15
+ */
16
+ class NullLogger {
17
+ debug(_message) { }
18
+ info(_message) { }
19
+ warn(_message) { }
20
+ error(_message) { }
21
+ }
17
22
  class Logger {
18
- constructor(context, _enabled = false) {
19
- this.context = context;
23
+ constructor(n8nLogger) {
24
+ this.n8nLogger = n8nLogger || new NullLogger();
20
25
  }
21
- debug(_message, ..._args) {
22
- // Logging disabled for n8n community nodes
26
+ debug(message, ...args) {
27
+ if (args.length > 0) {
28
+ this.n8nLogger.debug(message, { args });
29
+ }
30
+ else {
31
+ this.n8nLogger.debug(message);
32
+ }
23
33
  }
24
- info(_message, ..._args) {
25
- // Logging disabled for n8n community nodes
34
+ info(message, ...args) {
35
+ if (args.length > 0) {
36
+ this.n8nLogger.info(message, { args });
37
+ }
38
+ else {
39
+ this.n8nLogger.info(message);
40
+ }
26
41
  }
27
- warn(_message, ..._args) {
28
- // Logging disabled for n8n community nodes
42
+ warn(message, ...args) {
43
+ if (args.length > 0) {
44
+ this.n8nLogger.warn(message, { args });
45
+ }
46
+ else {
47
+ this.n8nLogger.warn(message);
48
+ }
29
49
  }
30
- error(_message, _error, ..._args) {
31
- // Logging disabled for n8n community nodes
50
+ error(message, error, ...args) {
51
+ if (error instanceof Error) {
52
+ if (args.length > 0) {
53
+ this.n8nLogger.error(message, { error: error.message, stack: error.stack, args });
54
+ }
55
+ else {
56
+ this.n8nLogger.error(message, { error: error.message, stack: error.stack });
57
+ }
58
+ }
59
+ else if (error !== undefined) {
60
+ if (args.length > 0) {
61
+ this.n8nLogger.error(message, { error, args });
62
+ }
63
+ else {
64
+ this.n8nLogger.error(message, { error });
65
+ }
66
+ }
67
+ else {
68
+ if (args.length > 0) {
69
+ this.n8nLogger.error(message, { args });
70
+ }
71
+ else {
72
+ this.n8nLogger.error(message);
73
+ }
74
+ }
32
75
  }
33
- /**
34
- * Create a child logger with additional context
35
- */
36
- child(additionalContext) {
37
- return new Logger(`${this.context}:${additionalContext}`, false);
76
+ child(_additionalContext) {
77
+ return new Logger(this.n8nLogger);
38
78
  }
39
79
  }
40
80
  exports.Logger = Logger;
41
- /**
42
- * Create a logger instance
43
- */
44
- function createLogger(context, _enabled = false) {
45
- return new Logger(context, false);
81
+ function createLogger(n8nLogger) {
82
+ return new Logger(n8nLogger);
46
83
  }
47
84
  //# sourceMappingURL=logger.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"logger.js","sourceRoot":"","sources":["../../nodes/logger.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;;AA2CH,oCAEC;AA3CD,IAAY,QAKX;AALD,WAAY,QAAQ;IAClB,2BAAe,CAAA;IACf,yBAAa,CAAA;IACb,yBAAa,CAAA;IACb,2BAAe,CAAA;AACjB,CAAC,EALW,QAAQ,wBAAR,QAAQ,QAKnB;AAED,MAAa,MAAM;IAGjB,YAAY,OAAe,EAAE,WAAoB,KAAK;QACpD,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACzB,CAAC;IAED,KAAK,CAAC,QAAgB,EAAE,GAAG,KAAgB;QACzC,2CAA2C;IAC7C,CAAC;IAED,IAAI,CAAC,QAAgB,EAAE,GAAG,KAAgB;QACxC,2CAA2C;IAC7C,CAAC;IAED,IAAI,CAAC,QAAgB,EAAE,GAAG,KAAgB;QACxC,2CAA2C;IAC7C,CAAC;IAED,KAAK,CAAC,QAAgB,EAAE,MAAwB,EAAE,GAAG,KAAgB;QACnE,2CAA2C;IAC7C,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,iBAAyB;QAC7B,OAAO,IAAI,MAAM,CAAC,GAAG,IAAI,CAAC,OAAO,IAAI,iBAAiB,EAAE,EAAE,KAAK,CAAC,CAAC;IACnE,CAAC;CACF;AA7BD,wBA6BC;AAED;;GAEG;AACH,SAAgB,YAAY,CAAC,OAAe,EAAE,WAAoB,KAAK;IACrE,OAAO,IAAI,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;AACpC,CAAC"}
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../../nodes/logger.ts"],"names":[],"mappings":"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"}
@@ -24,5 +24,67 @@ export interface NodeParameterConfig {
24
24
  export interface NodeParameterInput {
25
25
  nodeParameter: NodeParameterConfig[];
26
26
  }
27
+ export interface WorkflowNode {
28
+ inputs: Record<string, unknown>;
29
+ class_type: string;
30
+ }
31
+ export interface PromptResponse {
32
+ prompt_id: string;
33
+ }
34
+ export interface HistoryResponse {
35
+ [key: string]: {
36
+ outputs?: unknown;
37
+ status?: {
38
+ completed: boolean;
39
+ };
40
+ };
41
+ }
42
+ export interface Workflow {
43
+ [nodeId: string]: WorkflowNode;
44
+ }
45
+ export interface ImageInfo {
46
+ filename: string;
47
+ subfolder: string;
48
+ type: string;
49
+ url: string;
50
+ }
51
+ export interface ParsedParameters {
52
+ prompt: string;
53
+ negative_prompt: string;
54
+ width: number;
55
+ height: number;
56
+ steps: number;
57
+ cfg: number;
58
+ seed: number;
59
+ [key: string]: unknown;
60
+ }
61
+ export interface ParameterPattern {
62
+ regex: RegExp;
63
+ paramKey?: string;
64
+ paramKeys?: string[];
65
+ parser: (match: RegExpMatchArray) => unknown;
66
+ }
67
+ export interface ToolInputOptions {
68
+ comfyUiUrl?: string;
69
+ workflowConfig?: WorkflowConfig;
70
+ }
71
+ export interface WorkflowConfig {
72
+ template?: Workflow;
73
+ customTemplate?: string;
74
+ }
75
+ export interface ToolResult {
76
+ success: boolean;
77
+ message?: string;
78
+ error?: string;
79
+ data?: {
80
+ prompt: string;
81
+ images: string[];
82
+ parameters: ParsedParameters;
83
+ };
84
+ }
85
+ export interface ParameterExtractionResult {
86
+ value: unknown;
87
+ cleanedQuery: string;
88
+ }
27
89
  export type { ComfyUIClientConfig, WorkflowExecution, WorkflowResult } from './ComfyUiClient';
28
90
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../nodes/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,OAAO,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,kBAAkB;IACjC,SAAS,EAAE,OAAO,CAAC;IACnB,WAAW,EAAE,OAAO,CAAC;CACtB;AAGD,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,MAAM,CAAC;IACf,aAAa,CAAC,EAAE,UAAU,GAAG,QAAQ,CAAC;IACtC,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;IAChC,WAAW,CAAC,EAAE,QAAQ,GAAG,KAAK,CAAC;IAC/B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,GAAG,QAAQ,GAAG,SAAS,GAAG,OAAO,CAAC;CAChD;AAED,MAAM,WAAW,kBAAkB;IACjC,aAAa,EAAE,mBAAmB,EAAE,CAAC;CACtC;AAGD,YAAY,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../nodes/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,OAAO,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,kBAAkB;IACjC,SAAS,EAAE,OAAO,CAAC;IACnB,WAAW,EAAE,OAAO,CAAC;CACtB;AAGD,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,MAAM,CAAC;IACf,aAAa,CAAC,EAAE,UAAU,GAAG,QAAQ,CAAC;IACtC,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;IAChC,WAAW,CAAC,EAAE,QAAQ,GAAG,KAAK,CAAC;IAC/B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,GAAG,QAAQ,GAAG,SAAS,GAAG,OAAO,CAAC;CAChD;AAED,MAAM,WAAW,kBAAkB;IACjC,aAAa,EAAE,mBAAmB,EAAE,CAAC;CACtC;AAGD,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,eAAe;IAC9B,CAAC,GAAG,EAAE,MAAM,GAAG;QACb,OAAO,CAAC,EAAE,OAAO,CAAC;QAClB,MAAM,CAAC,EAAE;YACP,SAAS,EAAE,OAAO,CAAC;SACpB,CAAC;KACH,CAAC;CACH;AAED,MAAM,WAAW,QAAQ;IACvB,CAAC,MAAM,EAAE,MAAM,GAAG,YAAY,CAAC;CAChC;AAED,MAAM,WAAW,SAAS;IACxB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,eAAe,EAAE,MAAM,CAAC;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,MAAM,EAAE,CAAC,KAAK,EAAE,gBAAgB,KAAK,OAAO,CAAC;CAC9C;AAED,MAAM,WAAW,gBAAgB;IAC/B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,cAAc,CAAC,EAAE,cAAc,CAAC;CACjC;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE;QACL,MAAM,EAAE,MAAM,CAAC;QACf,MAAM,EAAE,MAAM,EAAE,CAAC;QACjB,UAAU,EAAE,gBAAgB,CAAC;KAC9B,CAAC;CACH;AAED,MAAM,WAAW,yBAAyB;IACxC,KAAK,EAAE,OAAO,CAAC;IACf,YAAY,EAAE,MAAM,CAAC;CACtB;AAGD,YAAY,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC"}
@@ -0,0 +1,47 @@
1
+ /**
2
+ * Utility functions for ComfyUI nodes
3
+ */
4
+ export interface FileInfo {
5
+ filename: string;
6
+ extension: string;
7
+ mimeType: string;
8
+ }
9
+ /**
10
+ * Extract file information from a path
11
+ * @param path - File path (can include query parameters)
12
+ * @param defaultExt - Default extension if none found
13
+ * @param mimeType - MIME type for fallback
14
+ * @returns File information
15
+ */
16
+ export declare function extractFileInfo(path: string, defaultExt: string, mimeType?: string): FileInfo;
17
+ /**
18
+ * Validate and sanitize filename
19
+ * @param filename - The filename to validate
20
+ * @returns Sanitized filename
21
+ * @throws Error if filename is invalid
22
+ */
23
+ export declare function validateFilename(filename: string): string;
24
+ /**
25
+ * Generate a unique filename using UUID
26
+ * @param extension - File extension (without dot)
27
+ * @param prefix - Optional prefix for the filename
28
+ * @returns Unique filename
29
+ */
30
+ export declare function generateUniqueFilename(extension: string, prefix?: string): string;
31
+ /**
32
+ * Validate buffer size before processing
33
+ * @param buffer - The buffer to validate
34
+ * @param maxSizeMB - Maximum size in megabytes
35
+ * @param context - Context for error message
36
+ * @throws Error if buffer exceeds maximum size
37
+ */
38
+ export declare function validateBufferSize(buffer: Buffer, maxSizeMB?: number, context?: string): void;
39
+ /**
40
+ * Validate MIME type against allowed types
41
+ * @param mimeType - MIME type to validate
42
+ * @param allowedTypes - Record of allowed MIME types
43
+ * @returns Validated MIME type
44
+ * @throws Error if MIME type is invalid
45
+ */
46
+ export declare function validateMimeType(mimeType: string, allowedTypes: Record<string, string>): string;
47
+ //# sourceMappingURL=utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../nodes/utils.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH,MAAM,WAAW,QAAQ;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;;;;;GAMG;AACH,wBAAgB,eAAe,CAC7B,IAAI,EAAE,MAAM,EACZ,UAAU,EAAE,MAAM,EAClB,QAAQ,CAAC,EAAE,MAAM,GAChB,QAAQ,CAiDV;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAwBzD;AAED;;;;;GAKG;AACH,wBAAgB,sBAAsB,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,GAAE,MAAe,GAAG,MAAM,CAIzF;AAED;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,MAAM,EACd,SAAS,GAAE,MAA+C,EAC1D,OAAO,GAAE,MAAiB,GACzB,IAAI,CAcN;AAED;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,MAAM,EAChB,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GACnC,MAAM,CAeR"}
@@ -0,0 +1,139 @@
1
+ "use strict";
2
+ /**
3
+ * Utility functions for ComfyUI nodes
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.extractFileInfo = extractFileInfo;
7
+ exports.validateFilename = validateFilename;
8
+ exports.generateUniqueFilename = generateUniqueFilename;
9
+ exports.validateBufferSize = validateBufferSize;
10
+ exports.validateMimeType = validateMimeType;
11
+ const crypto_1 = require("crypto");
12
+ const constants_1 = require("./constants");
13
+ /**
14
+ * Extract file information from a path
15
+ * @param path - File path (can include query parameters)
16
+ * @param defaultExt - Default extension if none found
17
+ * @param mimeType - MIME type for fallback
18
+ * @returns File information
19
+ */
20
+ function extractFileInfo(path, defaultExt, mimeType) {
21
+ // Extract filename from path
22
+ let filename = path.split('/').pop() || `file_${(0, crypto_1.randomUUID)()}.${defaultExt}`;
23
+ // Remove query parameters
24
+ if (filename.includes('?')) {
25
+ filename = filename.split('?')[0];
26
+ }
27
+ // Extract extension
28
+ let ext = defaultExt;
29
+ const extMatch = filename.match(/\.([^.]+)$/);
30
+ if (extMatch) {
31
+ ext = extMatch[1].toLowerCase();
32
+ }
33
+ // If no extension in filename and type is specified in path
34
+ if (!extMatch && path.includes('type=')) {
35
+ const typeMatch = path.match(/type=([^&]+)/);
36
+ if (typeMatch) {
37
+ const type = typeMatch[1].toLowerCase();
38
+ const mimeMap = {
39
+ 'input': 'png',
40
+ 'output': 'png',
41
+ 'temp': 'png',
42
+ };
43
+ ext = mimeMap[type] || defaultExt;
44
+ }
45
+ }
46
+ // Determine MIME type
47
+ let finalMimeType = mimeType;
48
+ if (!finalMimeType) {
49
+ // Try to get MIME type from extension
50
+ const imageMimeType = constants_1.IMAGE_MIME_TYPES[ext];
51
+ const videoMimeType = constants_1.VIDEO_MIME_TYPES[ext];
52
+ finalMimeType = imageMimeType || videoMimeType || 'application/octet-stream';
53
+ }
54
+ // If filename doesn't have extension, add it
55
+ if (!extMatch && ext !== defaultExt) {
56
+ filename = `${filename}.${ext}`;
57
+ }
58
+ return {
59
+ filename,
60
+ extension: ext,
61
+ mimeType: finalMimeType,
62
+ };
63
+ }
64
+ /**
65
+ * Validate and sanitize filename
66
+ * @param filename - The filename to validate
67
+ * @returns Sanitized filename
68
+ * @throws Error if filename is invalid
69
+ */
70
+ function validateFilename(filename) {
71
+ if (!filename || typeof filename !== 'string') {
72
+ throw new Error('Filename must be a non-empty string');
73
+ }
74
+ // Check for path traversal attempts
75
+ if (filename.includes('..') || filename.includes('/') || filename.includes('\\')) {
76
+ throw new Error('Filename cannot contain path traversal characters (.., /, \\)');
77
+ }
78
+ // Limit filename length
79
+ const MAX_FILENAME_LENGTH = 255;
80
+ if (filename.length > MAX_FILENAME_LENGTH) {
81
+ throw new Error(`Filename too long (max ${MAX_FILENAME_LENGTH} characters)`);
82
+ }
83
+ // Remove null bytes
84
+ filename = filename.replace(/\0/g, '');
85
+ if (filename.length === 0) {
86
+ throw new Error('Filename cannot be empty after sanitization');
87
+ }
88
+ return filename;
89
+ }
90
+ /**
91
+ * Generate a unique filename using UUID
92
+ * @param extension - File extension (without dot)
93
+ * @param prefix - Optional prefix for the filename
94
+ * @returns Unique filename
95
+ */
96
+ function generateUniqueFilename(extension, prefix = 'file') {
97
+ const uuid = (0, crypto_1.randomUUID)();
98
+ const ext = extension.startsWith('.') ? extension.slice(1) : extension;
99
+ return `${prefix}_${uuid}.${ext}`;
100
+ }
101
+ /**
102
+ * Validate buffer size before processing
103
+ * @param buffer - The buffer to validate
104
+ * @param maxSizeMB - Maximum size in megabytes
105
+ * @param context - Context for error message
106
+ * @throws Error if buffer exceeds maximum size
107
+ */
108
+ function validateBufferSize(buffer, maxSizeMB = constants_1.VALIDATION.MAX_IMAGE_SIZE_MB, context = 'Buffer') {
109
+ if (!Buffer.isBuffer(buffer)) {
110
+ throw new Error(`${context}: Invalid buffer type`);
111
+ }
112
+ if (buffer.length === 0) {
113
+ throw new Error(`${context}: Buffer is empty`);
114
+ }
115
+ const maxSizeBytes = maxSizeMB * 1024 * 1024;
116
+ if (buffer.length > maxSizeBytes) {
117
+ const sizeMB = Math.round(buffer.length / 1024 / 1024);
118
+ throw new Error(`${context}: Size (${sizeMB}MB) exceeds maximum allowed size of ${maxSizeMB}MB`);
119
+ }
120
+ }
121
+ /**
122
+ * Validate MIME type against allowed types
123
+ * @param mimeType - MIME type to validate
124
+ * @param allowedTypes - Record of allowed MIME types
125
+ * @returns Validated MIME type
126
+ * @throws Error if MIME type is invalid
127
+ */
128
+ function validateMimeType(mimeType, allowedTypes) {
129
+ if (!mimeType || typeof mimeType !== 'string') {
130
+ throw new Error('MIME type must be a non-empty string');
131
+ }
132
+ const normalized = mimeType.toLowerCase();
133
+ const allowedValues = Object.values(allowedTypes);
134
+ if (!allowedValues.includes(normalized)) {
135
+ throw new Error(`Unsupported MIME type "${normalized}". Allowed types: ${allowedValues.join(', ')}`);
136
+ }
137
+ return normalized;
138
+ }
139
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../nodes/utils.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,5 @@
1
1
  import { ValidationResult } from './types';
2
+ export declare function safeJsonParse(jsonString: string, context?: string): any;
2
3
  /**
3
4
  * Validate if a string is a valid HTTP/HTTPS URL
4
5
  */
@@ -1 +1 @@
1
- {"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../../nodes/validation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAE3C;;GAEG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAOhD;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,YAAY,EAAE,MAAM,GAAG,gBAAgB,CAsE9E"}
1
+ {"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../../nodes/validation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AA+B3C,wBAAgB,aAAa,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,GAAE,MAAe,GAAG,GAAG,CA0B/E;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAOhD;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,YAAY,EAAE,MAAM,GAAG,gBAAgB,CAsE9E"}
@@ -1,7 +1,56 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.safeJsonParse = safeJsonParse;
3
4
  exports.validateUrl = validateUrl;
4
5
  exports.validateComfyUIWorkflow = validateComfyUIWorkflow;
6
+ const MAX_JSON_SIZE = 1 * 1024 * 1024;
7
+ const MAX_JSON_DEPTH = 100;
8
+ function getObjectDepth(obj, currentDepth = 1) {
9
+ if (typeof obj !== 'object' || obj === null) {
10
+ return currentDepth;
11
+ }
12
+ if (Array.isArray(obj)) {
13
+ let maxDepth = currentDepth;
14
+ for (const item of obj) {
15
+ const depth = getObjectDepth(item, currentDepth + 1);
16
+ if (depth > maxDepth) {
17
+ maxDepth = depth;
18
+ }
19
+ }
20
+ return maxDepth;
21
+ }
22
+ let maxDepth = currentDepth;
23
+ for (const value of Object.values(obj)) {
24
+ const depth = getObjectDepth(value, currentDepth + 1);
25
+ if (depth > maxDepth) {
26
+ maxDepth = depth;
27
+ }
28
+ }
29
+ return maxDepth;
30
+ }
31
+ function safeJsonParse(jsonString, context = 'JSON') {
32
+ if (typeof jsonString !== 'string') {
33
+ throw new Error(`${context} must be a string`);
34
+ }
35
+ if (jsonString.length === 0) {
36
+ throw new Error(`${context} is empty`);
37
+ }
38
+ if (jsonString.length > MAX_JSON_SIZE) {
39
+ throw new Error(`${context} exceeds maximum size of ${MAX_JSON_SIZE / 1024 / 1024}MB (actual: ${(jsonString.length / 1024 / 1024).toFixed(2)}MB)`);
40
+ }
41
+ let parsed;
42
+ try {
43
+ parsed = JSON.parse(jsonString);
44
+ }
45
+ catch (error) {
46
+ throw new Error(`${context} is invalid: ${error.message}`);
47
+ }
48
+ const depth = getObjectDepth(parsed);
49
+ if (depth > MAX_JSON_DEPTH) {
50
+ throw new Error(`${context} exceeds maximum depth of ${MAX_JSON_DEPTH} (actual: ${depth})`);
51
+ }
52
+ return parsed;
53
+ }
5
54
  /**
6
55
  * Validate if a string is a valid HTTP/HTTPS URL
7
56
  */
@@ -26,12 +75,12 @@ function validateComfyUIWorkflow(workflowJson) {
26
75
  }
27
76
  let workflow;
28
77
  try {
29
- workflow = JSON.parse(workflowJson);
78
+ workflow = safeJsonParse(workflowJson, 'Workflow JSON');
30
79
  }
31
80
  catch (error) {
32
81
  return {
33
82
  valid: false,
34
- error: `Invalid JSON: ${error.message}`,
83
+ error: error.message,
35
84
  };
36
85
  }
37
86
  if (typeof workflow !== 'object' || workflow === null || Array.isArray(workflow)) {
@@ -1 +1 @@
1
- {"version":3,"file":"validation.js","sourceRoot":"","sources":["../../nodes/validation.ts"],"names":[],"mappings":";;AAKA,kCAOC;AAKD,0DAsEC;AArFD;;GAEG;AACH,SAAgB,WAAW,CAAC,GAAW;IACrC,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;QAC5B,OAAO,MAAM,CAAC,QAAQ,KAAK,OAAO,IAAI,MAAM,CAAC,QAAQ,KAAK,QAAQ,CAAC;IACrE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAgB,uBAAuB,CAAC,YAAoB;IAC1D,IAAI,CAAC,YAAY,IAAI,YAAY,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;QAChD,OAAO;YACL,KAAK,EAAE,KAAK;YACZ,KAAK,EAAE,wBAAwB;SAChC,CAAC;IACJ,CAAC;IAED,IAAI,QAAa,CAAC;IAClB,IAAI,CAAC;QACH,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;IACtC,CAAC;IAAC,OAAO,KAAU,EAAE,CAAC;QACpB,OAAO;YACL,KAAK,EAAE,KAAK;YACZ,KAAK,EAAE,iBAAiB,KAAK,CAAC,OAAO,EAAE;SACxC,CAAC;IACJ,CAAC;IAED,IAAI,OAAO,QAAQ,KAAK,QAAQ,IAAI,QAAQ,KAAK,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;QACjF,OAAO;YACL,KAAK,EAAE,KAAK;YACZ,KAAK,EAAE,kDAAkD;SAC1D,CAAC;IACJ,CAAC;IAED,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACtC,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO;YACL,KAAK,EAAE,KAAK;YACZ,KAAK,EAAE,yCAAyC;SACjD,CAAC;IACJ,CAAC;IAED,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,MAAM,IAAI,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC;QAE9B,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;YAC9C,OAAO;gBACL,KAAK,EAAE,KAAK;gBACZ,KAAK,EAAE,QAAQ,MAAM,oBAAoB;aAC1C,CAAC;QACJ,CAAC;QAED,IAAI,CAAC,IAAI,CAAC,UAAU,IAAI,OAAO,IAAI,CAAC,UAAU,KAAK,QAAQ,EAAE,CAAC;YAC5D,OAAO;gBACL,KAAK,EAAE,KAAK;gBACZ,KAAK,EAAE,QAAQ,MAAM,kCAAkC;aACxD,CAAC;QACJ,CAAC;QAED,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YAC9B,IAAI,OAAO,IAAI,CAAC,MAAM,KAAK,QAAQ,IAAI,IAAI,CAAC,MAAM,KAAK,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;gBAC1F,OAAO;oBACL,KAAK,EAAE,KAAK;oBACZ,KAAK,EAAE,QAAQ,MAAM,2BAA2B;iBACjD,CAAC;YACJ,CAAC;QACH,CAAC;QAED,IAAI,IAAI,CAAC,cAAc,KAAK,SAAS,EAAE,CAAC;YACtC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,cAAc,CAAC,EAAE,CAAC;gBACxC,OAAO;oBACL,KAAK,EAAE,KAAK;oBACZ,KAAK,EAAE,QAAQ,MAAM,kCAAkC;iBACxD,CAAC;YACJ,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;AACzB,CAAC"}
1
+ {"version":3,"file":"validation.js","sourceRoot":"","sources":["../../nodes/validation.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import { Workflow, WorkflowConfig } from './types';
2
+ /**
3
+ * Default workflow template for text-to-image generation
4
+ * This is a basic Stable Diffusion workflow that can be customized
5
+ */
6
+ export declare const DEFAULT_WORKFLOW_TEMPLATE: Workflow;
7
+ /**
8
+ * Get workflow template based on configuration
9
+ * @param config - Workflow configuration
10
+ * @returns Workflow template
11
+ */
12
+ export declare function getWorkflowTemplate(config?: WorkflowConfig): Workflow;
13
+ //# sourceMappingURL=workflowConfig.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workflowConfig.d.ts","sourceRoot":"","sources":["../../nodes/workflowConfig.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAGnD;;;GAGG;AACH,eAAO,MAAM,yBAAyB,EAAE,QA0DvC,CAAC;AAEF;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,CAAC,EAAE,cAAc,GAAG,QAAQ,CAiBrE"}
@@ -0,0 +1,91 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DEFAULT_WORKFLOW_TEMPLATE = void 0;
4
+ exports.getWorkflowTemplate = getWorkflowTemplate;
5
+ const validation_1 = require("./validation");
6
+ /**
7
+ * Default workflow template for text-to-image generation
8
+ * This is a basic Stable Diffusion workflow that can be customized
9
+ */
10
+ exports.DEFAULT_WORKFLOW_TEMPLATE = {
11
+ "3": {
12
+ "inputs": {
13
+ "seed": 0,
14
+ "steps": 20,
15
+ "cfg": 8,
16
+ "sampler_name": "euler",
17
+ "scheduler": "normal",
18
+ "denoise": 1,
19
+ "model": ["4", 0],
20
+ "positive": ["6", 0],
21
+ "negative": ["7", 0],
22
+ "latent_image": ["5", 0]
23
+ },
24
+ "class_type": "KSampler"
25
+ },
26
+ "4": {
27
+ "inputs": {
28
+ "ckpt_name": "v1-5-pruned-emaonly.ckpt"
29
+ },
30
+ "class_type": "CheckpointLoaderSimple"
31
+ },
32
+ "5": {
33
+ "inputs": {
34
+ "width": 512,
35
+ "height": 512,
36
+ "batch_size": 1
37
+ },
38
+ "class_type": "EmptyLatentImage"
39
+ },
40
+ "6": {
41
+ "inputs": {
42
+ "text": "",
43
+ "clip": ["4", 1]
44
+ },
45
+ "class_type": "CLIPTextEncode"
46
+ },
47
+ "7": {
48
+ "inputs": {
49
+ "text": "ugly, blurry, low quality",
50
+ "clip": ["4", 1]
51
+ },
52
+ "class_type": "CLIPTextEncode"
53
+ },
54
+ "8": {
55
+ "inputs": {
56
+ "samples": ["3", 0],
57
+ "vae": ["4", 2]
58
+ },
59
+ "class_type": "VAEDecode"
60
+ },
61
+ "9": {
62
+ "inputs": {
63
+ "filename_prefix": "ComfyUI",
64
+ "images": ["8", 0]
65
+ },
66
+ "class_type": "SaveImage"
67
+ }
68
+ };
69
+ /**
70
+ * Get workflow template based on configuration
71
+ * @param config - Workflow configuration
72
+ * @returns Workflow template
73
+ */
74
+ function getWorkflowTemplate(config) {
75
+ if (config?.customTemplate) {
76
+ try {
77
+ return (0, validation_1.safeJsonParse)(config.customTemplate, 'Custom workflow template');
78
+ }
79
+ catch (error) {
80
+ // Log warning when custom template fails
81
+ const errorMsg = error instanceof Error ? error.message : String(error);
82
+ console.warn(`Custom workflow template is invalid, falling back to default template. Error: ${errorMsg}`);
83
+ }
84
+ }
85
+ // Check if template is a valid non-empty object
86
+ if (config?.template && typeof config.template === 'object' && Object.keys(config.template).length > 0) {
87
+ return config.template;
88
+ }
89
+ return exports.DEFAULT_WORKFLOW_TEMPLATE;
90
+ }
91
+ //# sourceMappingURL=workflowConfig.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workflowConfig.js","sourceRoot":"","sources":["../../nodes/workflowConfig.ts"],"names":[],"mappings":";;;AAwEA,kDAiBC;AAxFD,6CAA6C;AAE7C;;;GAGG;AACU,QAAA,yBAAyB,GAAa;IACjD,GAAG,EAAE;QACH,QAAQ,EAAE;YACR,MAAM,EAAE,CAAC;YACT,OAAO,EAAE,EAAE;YACX,KAAK,EAAE,CAAC;YACR,cAAc,EAAE,OAAO;YACvB,WAAW,EAAE,QAAQ;YACrB,SAAS,EAAE,CAAC;YACZ,OAAO,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC;YACjB,UAAU,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC;YACpB,UAAU,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC;YACpB,cAAc,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC;SACzB;QACD,YAAY,EAAE,UAAU;KACzB;IACD,GAAG,EAAE;QACH,QAAQ,EAAE;YACR,WAAW,EAAE,0BAA0B;SACxC;QACD,YAAY,EAAE,wBAAwB;KACvC;IACD,GAAG,EAAE;QACH,QAAQ,EAAE;YACR,OAAO,EAAE,GAAG;YACZ,QAAQ,EAAE,GAAG;YACb,YAAY,EAAE,CAAC;SAChB;QACD,YAAY,EAAE,kBAAkB;KACjC;IACD,GAAG,EAAE;QACH,QAAQ,EAAE;YACR,MAAM,EAAE,EAAE;YACV,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC;SACjB;QACD,YAAY,EAAE,gBAAgB;KAC/B;IACD,GAAG,EAAE;QACH,QAAQ,EAAE;YACR,MAAM,EAAE,2BAA2B;YACnC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC;SACjB;QACD,YAAY,EAAE,gBAAgB;KAC/B;IACD,GAAG,EAAE;QACH,QAAQ,EAAE;YACR,SAAS,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC;YACnB,KAAK,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC;SAChB;QACD,YAAY,EAAE,WAAW;KAC1B;IACD,GAAG,EAAE;QACH,QAAQ,EAAE;YACR,iBAAiB,EAAE,SAAS;YAC5B,QAAQ,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC;SACnB;QACD,YAAY,EAAE,WAAW;KAC1B;CACF,CAAC;AAEF;;;;GAIG;AACH,SAAgB,mBAAmB,CAAC,MAAuB;IACzD,IAAI,MAAM,EAAE,cAAc,EAAE,CAAC;QAC3B,IAAI,CAAC;YACH,OAAO,IAAA,0BAAa,EAAC,MAAM,CAAC,cAAc,EAAE,0BAA0B,CAAC,CAAC;QAC1E,CAAC;QAAC,OAAO,KAAc,EAAE,CAAC;YACxB,yCAAyC;YACzC,MAAM,QAAQ,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACxE,OAAO,CAAC,IAAI,CAAC,iFAAiF,QAAQ,EAAE,CAAC,CAAC;QAC5G,CAAC;IACH,CAAC;IAED,gDAAgD;IAChD,IAAI,MAAM,EAAE,QAAQ,IAAI,OAAO,MAAM,CAAC,QAAQ,KAAK,QAAQ,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvG,OAAO,MAAM,CAAC,QAAQ,CAAC;IACzB,CAAC;IAED,OAAO,iCAAyB,CAAC;AACnC,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "n8n-nodes-comfyui-all",
3
- "version": "2.2.9",
3
+ "version": "2.2.10",
4
4
  "description": "n8n community nodes for ComfyUI workflow execution with dynamic parameter support",
5
5
  "keywords": [
6
6
  "n8n-community-node-package",
@@ -43,6 +43,8 @@
43
43
  ]
44
44
  },
45
45
  "dependencies": {
46
+ "@types/axios": "^0.9.36",
47
+ "axios": "^1.13.2",
46
48
  "form-data": "^4.0.5"
47
49
  },
48
50
  "devDependencies": {
package/LICENSE DELETED
@@ -1,21 +0,0 @@
1
- MIT License
2
-
3
- Copyright (c) 2026 wwrs
4
-
5
- Permission is hereby granted, free of charge, to any person obtaining a copy
6
- of this software and associated documentation files (the "Software"), to deal
7
- in the Software without restriction, including without limitation the rights
8
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
- copies of the Software, and to permit persons to whom the Software is
10
- furnished to do so, subject to the following conditions:
11
-
12
- The above copyright notice and this permission notice shall be included in all
13
- copies or substantial portions of the Software.
14
-
15
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
- SOFTWARE.