n8n-nodes-h2i 1.0.4 → 1.0.8

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.
@@ -359,6 +359,7 @@ class DavixH2I {
359
359
  name: 'pdfPageSize',
360
360
  type: 'options',
361
361
  default: 'auto',
362
+ description: 'Page size to use when exporting to PDF.',
362
363
  options: [
363
364
  { name: 'Auto', value: 'auto' },
364
365
  { name: 'A4', value: 'a4' },
@@ -371,6 +372,7 @@ class DavixH2I {
371
372
  name: 'pdfOrientation',
372
373
  type: 'options',
373
374
  default: 'portrait',
375
+ description: 'Orientation for pages in the exported PDF.',
374
376
  options: [
375
377
  { name: 'Portrait', value: 'portrait' },
376
378
  { name: 'Landscape', value: 'landscape' },
@@ -382,6 +384,7 @@ class DavixH2I {
382
384
  name: 'pdfMargin',
383
385
  type: 'number',
384
386
  default: 0,
387
+ description: 'Margin (in pixels) applied to the exported PDF pages.',
385
388
  displayOptions: { show: { resource: ['image'], operation: ['pdf'] } },
386
389
  },
387
390
  {
@@ -389,6 +392,7 @@ class DavixH2I {
389
392
  name: 'pdfEmbedFormat',
390
393
  type: 'options',
391
394
  default: 'png',
395
+ description: 'Image format embedded inside the generated PDF.',
392
396
  options: [
393
397
  { name: 'PNG', value: 'png' },
394
398
  { name: 'JPEG', value: 'jpeg' },
@@ -400,162 +404,217 @@ class DavixH2I {
400
404
  name: 'pdfJpegQuality',
401
405
  type: 'number',
402
406
  default: 85,
407
+ description: 'JPEG quality used when embedding images into the PDF.',
403
408
  displayOptions: { show: { resource: ['image'], operation: ['pdf'] } },
404
409
  },
405
410
  { displayName: 'Include Raw EXIF', name: 'includeRawExif', type: 'boolean', default: false, description: 'Include raw EXIF data when available.', displayOptions: { show: { resource: ['image'], operation: ['metadata'] } } },
406
411
  {
407
- displayName: 'Options',
408
- name: 'options',
409
- type: 'collection',
412
+ displayName: 'Actions',
413
+ name: 'actions',
414
+ type: 'multiOptions',
415
+ default: [],
416
+ description: 'Select one or more actions. Each action reveals its own parameter group below.',
417
+ displayOptions: { show: { resource: ['image'], operation: ['multitask'] } },
418
+ options: [
419
+ { name: 'Format', value: 'format' },
420
+ { name: 'Resize', value: 'resize' },
421
+ { name: 'Crop', value: 'crop' },
422
+ { name: 'Transform', value: 'transform' },
423
+ { name: 'Compress', value: 'compress' },
424
+ { name: 'Enhance', value: 'enhance' },
425
+ { name: 'Frame', value: 'frame' },
426
+ { name: 'Background', value: 'background' },
427
+ { name: 'Watermark', value: 'watermark' },
428
+ ],
429
+ },
430
+ {
431
+ displayName: 'Format',
432
+ name: 'multitaskFormat',
433
+ type: 'options',
434
+ default: 'webp',
435
+ description: 'Output format for the multitask result.',
436
+ options: [
437
+ { name: 'JPEG', value: 'jpeg' },
438
+ { name: 'PNG', value: 'png' },
439
+ { name: 'WebP', value: 'webp' },
440
+ { name: 'AVIF', value: 'avif' },
441
+ { name: 'GIF', value: 'gif' },
442
+ { name: 'SVG', value: 'svg' },
443
+ { name: 'PDF', value: 'pdf' },
444
+ ],
445
+ displayOptions: {
446
+ show: {
447
+ resource: ['image'],
448
+ operation: ['multitask'],
449
+ actions: ['format', 'resize', 'crop', 'transform', 'compress', 'enhance', 'frame', 'background', 'watermark'],
450
+ },
451
+ },
452
+ },
453
+ {
454
+ displayName: 'Keep Metadata',
455
+ name: 'multitaskKeepMetadata',
456
+ type: 'boolean',
457
+ default: false,
458
+ description: 'Preserve EXIF/metadata for the multitask request when possible.',
459
+ displayOptions: {
460
+ show: {
461
+ resource: ['image'],
462
+ operation: ['multitask'],
463
+ actions: ['format', 'resize', 'crop', 'transform', 'compress', 'enhance', 'frame', 'background', 'watermark'],
464
+ },
465
+ },
466
+ },
467
+ {
468
+ displayName: 'Action Parameters',
469
+ name: 'imageActionParams',
470
+ type: 'fixedCollection',
410
471
  default: {},
411
- placeholder: 'Add option',
412
- description: 'Optional PixLab multitask parameters. Only selected options are sent.',
472
+ placeholder: 'Add action parameters',
473
+ description: 'Parameters for each selected action.',
474
+ typeOptions: { multipleValues: false },
413
475
  displayOptions: { show: { resource: ['image'], operation: ['multitask'] } },
414
476
  options: [
415
477
  {
416
- displayName: 'Format',
417
478
  name: 'format',
418
- type: 'options',
419
- default: 'webp',
420
- description: 'Output format for the multitask result.',
421
- options: [
422
- { name: 'JPEG', value: 'jpeg' },
423
- { name: 'PNG', value: 'png' },
424
- { name: 'WebP', value: 'webp' },
425
- { name: 'AVIF', value: 'avif' },
426
- { name: 'GIF', value: 'gif' },
427
- { name: 'SVG', value: 'svg' },
428
- { name: 'PDF', value: 'pdf' },
479
+ displayName: 'Format',
480
+ values: [
481
+ { displayName: 'Width', name: 'formatWidthMulti', type: 'number', default: 0, description: 'Resize width in pixels for format.' },
482
+ { displayName: 'Height', name: 'formatHeightMulti', type: 'number', default: 0, description: 'Resize height in pixels for format.' },
429
483
  ],
430
484
  },
431
- { displayName: 'Width', name: 'width', type: 'number', default: 0, description: 'Resize width in pixels.' },
432
- { displayName: 'Height', name: 'height', type: 'number', default: 0, description: 'Resize height in pixels.' },
433
- { displayName: 'Enlarge', name: 'enlarge', type: 'boolean', default: false, description: 'Allow upscaling when resizing.' },
434
485
  {
435
- displayName: 'Normalize Orientation',
436
- name: 'normalizeOrientation',
437
- type: 'boolean',
438
- default: false,
439
- description: 'Auto-rotate based on EXIF orientation.',
486
+ name: 'resize',
487
+ displayName: 'Resize',
488
+ values: [
489
+ { displayName: 'Width', name: 'resizeWidthMulti', type: 'number', default: 0, description: 'Resize width in pixels.' },
490
+ { displayName: 'Height', name: 'resizeHeightMulti', type: 'number', default: 0, description: 'Resize height in pixels.' },
491
+ { displayName: 'Enlarge', name: 'resizeEnlargeMulti', type: 'boolean', default: false, description: 'Allow upscaling when resizing.' },
492
+ { displayName: 'Normalize Orientation', name: 'resizeNormalizeOrientationMulti', type: 'boolean', default: false, description: 'Auto-rotate based on EXIF orientation.' },
493
+ ],
494
+ },
495
+ {
496
+ name: 'crop',
497
+ displayName: 'Crop',
498
+ values: [
499
+ { displayName: 'Crop X', name: 'cropXMulti', type: 'number', default: 0, description: 'Left offset for crop.' },
500
+ { displayName: 'Crop Y', name: 'cropYMulti', type: 'number', default: 0, description: 'Top offset for crop.' },
501
+ { displayName: 'Crop Width', name: 'cropWidthMulti', type: 'number', default: 0, description: 'Crop width in pixels.' },
502
+ { displayName: 'Crop Height', name: 'cropHeightMulti', type: 'number', default: 0, description: 'Crop height in pixels.' },
503
+ { displayName: 'Normalize Orientation', name: 'cropNormalizeOrientationMulti', type: 'boolean', default: false, description: 'Auto-rotate before cropping based on EXIF orientation.' },
504
+ { displayName: 'Background Color', name: 'cropBackgroundColorMulti', type: 'string', default: '', description: 'Background color used when the crop exceeds bounds.' },
505
+ ],
440
506
  },
441
- { displayName: 'Crop X', name: 'cropX', type: 'number', default: 0, description: 'Left offset for crop.' },
442
- { displayName: 'Crop Y', name: 'cropY', type: 'number', default: 0, description: 'Top offset for crop.' },
443
- { displayName: 'Crop Width', name: 'cropWidth', type: 'number', default: 0, description: 'Crop width in pixels.' },
444
- { displayName: 'Crop Height', name: 'cropHeight', type: 'number', default: 0, description: 'Crop height in pixels.' },
445
- { displayName: 'Background Color', name: 'backgroundColor', type: 'string', default: '', description: 'Background color used for fills or padding.' },
446
- { displayName: 'Rotate (degrees)', name: 'rotate', type: 'number', default: 0, description: 'Rotate image by degrees.' },
447
- { displayName: 'Flip Horizontal', name: 'flipH', type: 'boolean', default: false, description: 'Flip image horizontally.' },
448
- { displayName: 'Flip Vertical', name: 'flipV', type: 'boolean', default: false, description: 'Flip image vertically.' },
449
507
  {
450
- displayName: 'Color Space',
451
- name: 'colorSpace',
452
- type: 'options',
453
- default: 'srgb',
454
- description: 'Color space for processing.',
455
- options: [
456
- { name: 'sRGB', value: 'srgb' },
457
- { name: 'Display P3', value: 'display-p3' },
508
+ name: 'transform',
509
+ displayName: 'Transform',
510
+ values: [
511
+ { displayName: 'Rotate (degrees)', name: 'transformRotateMulti', type: 'number', default: 0, description: 'Rotate image by degrees.' },
512
+ { displayName: 'Flip Horizontal', name: 'transformFlipHMulti', type: 'boolean', default: false, description: 'Flip image horizontally.' },
513
+ { displayName: 'Flip Vertical', name: 'transformFlipVMulti', type: 'boolean', default: false, description: 'Flip image vertically.' },
514
+ {
515
+ displayName: 'Color Space',
516
+ name: 'transformColorSpaceMulti',
517
+ type: 'options',
518
+ default: 'srgb',
519
+ description: 'Color space to use for transforms.',
520
+ options: [
521
+ { name: 'sRGB', value: 'srgb' },
522
+ { name: 'Display P3', value: 'display-p3' },
523
+ ],
524
+ },
458
525
  ],
459
526
  },
460
- { displayName: 'Target Size (KB)', name: 'targetSizeKB', type: 'number', default: 0, description: 'Target compressed size in KB.' },
461
- { displayName: 'Quality', name: 'quality', type: 'number', default: 82, description: 'Output quality (1-100).' },
462
- { displayName: 'Keep Metadata', name: 'keepMetadata', type: 'boolean', default: false, description: 'Keep EXIF/metadata when possible.' },
463
- { displayName: 'Blur', name: 'blur', type: 'number', default: 0, description: 'Blur radius.' },
464
- { displayName: 'Sharpen', name: 'sharpen', type: 'number', default: 0, description: 'Sharpen amount.' },
465
- { displayName: 'Grayscale', name: 'grayscale', type: 'boolean', default: false, description: 'Convert to grayscale.' },
466
- { displayName: 'Sepia', name: 'sepia', type: 'boolean', default: false, description: 'Apply sepia tone.' },
467
- { displayName: 'Brightness', name: 'brightness', type: 'number', default: 0, description: 'Brightness adjustment (-100 to 100).' },
468
- { displayName: 'Contrast', name: 'contrast', type: 'number', default: 0, description: 'Contrast adjustment (-100 to 100).' },
469
- { displayName: 'Saturation', name: 'saturation', type: 'number', default: 0, description: 'Saturation adjustment (-100 to 100).' },
470
- { displayName: 'Pad', name: 'pad', type: 'number', default: 0, description: 'Uniform padding size.' },
471
- { displayName: 'Pad Color', name: 'padColor', type: 'string', default: '', description: 'Padding color (e.g. #ffffff).' },
472
- { displayName: 'Pad Top', name: 'padTop', type: 'number', default: 0, description: 'Top padding override.' },
473
- { displayName: 'Pad Right', name: 'padRight', type: 'number', default: 0, description: 'Right padding override.' },
474
- { displayName: 'Pad Bottom', name: 'padBottom', type: 'number', default: 0, description: 'Bottom padding override.' },
475
- { displayName: 'Pad Left', name: 'padLeft', type: 'number', default: 0, description: 'Left padding override.' },
476
- { displayName: 'Border Radius', name: 'borderRadius', type: 'number', default: 0, description: 'Rounded corner radius.' },
477
- { displayName: 'Border', name: 'border', type: 'number', default: 0, description: 'Border thickness in pixels.' },
478
- { displayName: 'Border Color', name: 'borderColor', type: 'string', default: '', description: 'Border color (e.g. #000000).' },
479
- { displayName: 'Background Blur', name: 'backgroundBlur', type: 'number', default: 0, description: 'Background blur radius.' },
480
- { displayName: 'Watermark Text', name: 'watermarkText', type: 'string', default: '', description: 'Text watermark content.' },
481
- { displayName: 'Watermark Font Size', name: 'watermarkFontSize', type: 'number', default: 24, description: 'Font size for text watermark.' },
482
- { displayName: 'Watermark Color', name: 'watermarkColor', type: 'string', default: '#000000', description: 'Color for text watermark.' },
483
- { displayName: 'Watermark Opacity', name: 'watermarkOpacity', type: 'number', default: 0.35, description: 'Watermark opacity (0-1).' },
484
527
  {
485
- displayName: 'Watermark Position',
486
- name: 'watermarkPosition',
487
- type: 'options',
488
- default: 'center',
489
- description: 'Placement for watermark.',
490
- options: [
491
- { name: 'Center', value: 'center' },
492
- { name: 'Top Left', value: 'top-left' },
493
- { name: 'Top Right', value: 'top-right' },
494
- { name: 'Bottom Left', value: 'bottom-left' },
495
- { name: 'Bottom Right', value: 'bottom-right' },
528
+ name: 'compress',
529
+ displayName: 'Compress',
530
+ values: [
531
+ { displayName: 'Quality', name: 'compressQualityMulti', type: 'number', default: 82, description: 'Output quality (1-100).' },
532
+ { displayName: 'Target Size (KB)', name: 'compressTargetSizeKBMulti', type: 'number', default: 0, description: 'Target compressed size in KB.' },
533
+ { displayName: 'Background Color', name: 'compressBackgroundColorMulti', type: 'string', default: '', description: 'Background color used for compression fills.' },
534
+ {
535
+ displayName: 'Color Space',
536
+ name: 'compressColorSpaceMulti',
537
+ type: 'options',
538
+ default: 'srgb',
539
+ description: 'Color space to use for compression.',
540
+ options: [
541
+ { name: 'sRGB', value: 'srgb' },
542
+ { name: 'Display P3', value: 'display-p3' },
543
+ ],
544
+ },
496
545
  ],
497
546
  },
498
- { displayName: 'Watermark Margin', name: 'watermarkMargin', type: 'number', default: 8, description: 'Margin/padding around watermark.' },
499
- { displayName: 'Watermark Scale', name: 'watermarkScale', type: 'number', default: 1, description: 'Scale factor for watermark.' },
500
547
  {
501
- displayName: 'PDF Mode',
502
- name: 'pdfMode',
503
- type: 'options',
504
- default: 'single',
505
- description: 'Single or multi-page PDF export.',
506
- options: [
507
- { name: 'Single', value: 'single' },
508
- { name: 'Multi', value: 'multi' },
548
+ name: 'enhance',
549
+ displayName: 'Enhance',
550
+ values: [
551
+ { displayName: 'Blur', name: 'enhanceBlurMulti', type: 'number', default: 0, description: 'Blur radius.' },
552
+ { displayName: 'Sharpen', name: 'enhanceSharpenMulti', type: 'number', default: 0, description: 'Sharpen amount.' },
553
+ { displayName: 'Grayscale', name: 'enhanceGrayscaleMulti', type: 'boolean', default: false, description: 'Convert to grayscale.' },
554
+ { displayName: 'Sepia', name: 'enhanceSepiaMulti', type: 'boolean', default: false, description: 'Apply sepia tone.' },
555
+ { displayName: 'Brightness', name: 'enhanceBrightnessMulti', type: 'number', default: 0, description: 'Brightness adjustment (-100 to 100).' },
556
+ { displayName: 'Contrast', name: 'enhanceContrastMulti', type: 'number', default: 0, description: 'Contrast adjustment (-100 to 100).' },
557
+ { displayName: 'Saturation', name: 'enhanceSaturationMulti', type: 'number', default: 0, description: 'Saturation adjustment (-100 to 100).' },
558
+ { displayName: 'Normalize Orientation', name: 'enhanceNormalizeOrientationMulti', type: 'boolean', default: false, description: 'Auto-rotate based on EXIF orientation before enhancing.' },
509
559
  ],
510
560
  },
511
561
  {
512
- displayName: 'PDF Page Size',
513
- name: 'pdfPageSize',
514
- type: 'options',
515
- default: 'auto',
516
- description: 'Page size for PDF output.',
517
- options: [
518
- { name: 'Auto', value: 'auto' },
519
- { name: 'A4', value: 'a4' },
520
- { name: 'Letter', value: 'letter' },
562
+ name: 'frame',
563
+ displayName: 'Frame',
564
+ values: [
565
+ { displayName: 'Pad', name: 'framePadMulti', type: 'number', default: 0, description: 'Uniform padding size.' },
566
+ { displayName: 'Pad Color', name: 'framePadColorMulti', type: 'string', default: '', description: 'Padding color (e.g. #ffffff).' },
567
+ { displayName: 'Border', name: 'frameBorderMulti', type: 'number', default: 0, description: 'Border thickness in pixels.' },
568
+ { displayName: 'Border Color', name: 'frameBorderColorMulti', type: 'string', default: '', description: 'Border color (e.g. #000000).' },
569
+ { displayName: 'Border Radius', name: 'frameBorderRadiusMulti', type: 'number', default: 0, description: 'Rounded corner radius.' },
521
570
  ],
522
571
  },
523
572
  {
524
- displayName: 'PDF Orientation',
525
- name: 'pdfOrientation',
526
- type: 'options',
527
- default: 'portrait',
528
- description: 'Orientation for PDF pages.',
529
- options: [
530
- { name: 'Portrait', value: 'portrait' },
531
- { name: 'Landscape', value: 'landscape' },
573
+ name: 'background',
574
+ displayName: 'Background',
575
+ values: [
576
+ { displayName: 'Background Color', name: 'backgroundColorMulti', type: 'string', default: '', description: 'Background color to apply.' },
577
+ { displayName: 'Background Blur', name: 'backgroundBlurMulti', type: 'number', default: 0, description: 'Blur background by this radius.' },
578
+ { displayName: 'Border Radius', name: 'backgroundBorderRadiusMulti', type: 'number', default: 0, description: 'Rounded corner radius.' },
579
+ { displayName: 'Pad Color', name: 'backgroundPadColorMulti', type: 'string', default: '', description: 'Padding color for background.' },
532
580
  ],
533
581
  },
534
- { displayName: 'PDF Margin', name: 'pdfMargin', type: 'number', default: 0, description: 'Page margin for PDF output.' },
535
582
  {
536
- displayName: 'PDF Embed Format',
537
- name: 'pdfEmbedFormat',
538
- type: 'options',
539
- default: 'png',
540
- description: 'Image format embedded in the PDF.',
541
- options: [
542
- { name: 'PNG', value: 'png' },
543
- { name: 'JPEG', value: 'jpeg' },
583
+ name: 'watermark',
584
+ displayName: 'Watermark',
585
+ values: [
586
+ { displayName: 'Watermark Text', name: 'watermarkTextMulti', type: 'string', default: '', description: 'Text watermark content.' },
587
+ { displayName: 'Watermark Opacity', name: 'watermarkOpacityMulti', type: 'number', default: 0.35, description: 'Watermark opacity (0-1).' },
588
+ {
589
+ displayName: 'Watermark Position',
590
+ name: 'watermarkPositionMulti',
591
+ type: 'options',
592
+ default: 'center',
593
+ description: 'Placement for watermark.',
594
+ options: [
595
+ { name: 'Center', value: 'center' },
596
+ { name: 'Top Left', value: 'top-left' },
597
+ { name: 'Top Right', value: 'top-right' },
598
+ { name: 'Bottom Left', value: 'bottom-left' },
599
+ { name: 'Bottom Right', value: 'bottom-right' },
600
+ ],
601
+ },
602
+ { displayName: 'Watermark Margin', name: 'watermarkMarginMulti', type: 'number', default: 8, description: 'Margin/padding around watermark.' },
603
+ { displayName: 'Watermark Scale', name: 'watermarkScaleMulti', type: 'number', default: 1, description: 'Scale factor for watermark.' },
604
+ { displayName: 'Watermark Color', name: 'watermarkColorMulti', type: 'string', default: '#000000', description: 'Color for text watermark.' },
605
+ { displayName: 'Watermark Font Size', name: 'watermarkFontSizeMulti', type: 'number', default: 24, description: 'Font size for text watermark.' },
606
+ {
607
+ displayName: 'Watermark Image Binary Property',
608
+ name: 'watermarkImageBinaryProperty',
609
+ type: 'string',
610
+ default: '',
611
+ placeholder: 'watermarkImage',
612
+ description: 'Binary property containing an image watermark (optional).',
613
+ },
544
614
  ],
545
615
  },
546
- { displayName: 'PDF JPEG Quality', name: 'pdfJpegQuality', type: 'number', default: 85, description: 'JPEG quality for PDF embedding.' },
547
- { displayName: 'Include Raw EXIF', name: 'includeRawExif', type: 'boolean', default: false, description: 'Include raw EXIF data when available.' },
548
616
  ],
549
617
  },
550
- {
551
- displayName: 'Watermark Image Binary Property',
552
- name: 'watermarkBinaryProperty',
553
- type: 'string',
554
- default: '',
555
- placeholder: 'watermarkImage',
556
- description: 'Binary property containing an image watermark (used if watermark options are set).',
557
- displayOptions: { show: { resource: ['image'], operation: ['multitask'] } },
558
- },
559
618
  {
560
619
  displayName: 'Download Result(s) as Binary',
561
620
  name: 'imageDownloadBinary',
@@ -773,67 +832,251 @@ class DavixH2I {
773
832
  displayOptions: { show: { resource: ['tools'], operation: ['multitask'] } },
774
833
  },
775
834
  {
776
- displayName: 'Options',
777
- name: 'options',
778
- type: 'collection',
835
+ // Single-tool parameters grouped to keep property keys unique
836
+ displayName: 'Tool Parameters (Single)',
837
+ name: 'toolParametersSingle',
838
+ type: 'fixedCollection',
779
839
  default: {},
780
- placeholder: 'Add option',
781
- description: 'Optional tool parameters (only applied when the selected tool supports them).',
840
+ placeholder: 'Add tool parameters',
841
+ description: 'Parameters for the selected tool.',
842
+ typeOptions: { multipleValues: false },
782
843
  displayOptions: { show: { resource: ['tools'], operation: ['single'] } },
783
844
  options: [
784
- { displayName: 'Include Raw EXIF', name: 'includeRawExif', type: 'boolean', default: false, description: 'Include raw EXIF data (metadata tool only).' },
785
- { displayName: 'Palette Size', name: 'paletteSize', type: 'number', default: 5, description: 'Number of colors to extract (palette tool).' },
786
845
  {
787
- displayName: 'Hash Type',
788
- name: 'hashType',
789
- type: 'options',
790
- default: 'phash',
791
- description: 'Hash algorithm to compute (hash tool).',
792
- options: [
793
- { name: 'pHash', value: 'phash' },
794
- { name: 'MD5', value: 'md5' },
795
- { name: 'SHA1', value: 'sha1' },
846
+ name: 'metadata',
847
+ displayName: 'Metadata',
848
+ values: [{ displayName: 'Include Raw EXIF', name: 'metadataIncludeRawExifSingle', type: 'boolean', default: false, description: 'Include raw EXIF data when available.' }],
849
+ },
850
+ {
851
+ name: 'palette',
852
+ displayName: 'Palette',
853
+ values: [{ displayName: 'Palette Size', name: 'paletteSizeSingle', type: 'number', default: 5, description: 'Number of colors to extract.' }],
854
+ },
855
+ {
856
+ name: 'hash',
857
+ displayName: 'Hash',
858
+ values: [
859
+ {
860
+ displayName: 'Hash Type',
861
+ name: 'hashTypeSingle',
862
+ type: 'options',
863
+ default: 'phash',
864
+ description: 'Hash algorithm to compute.',
865
+ options: [
866
+ { name: 'pHash', value: 'phash' },
867
+ { name: 'MD5', value: 'md5' },
868
+ { name: 'SHA1', value: 'sha1' },
869
+ ],
870
+ },
871
+ ],
872
+ },
873
+ {
874
+ name: 'similarity',
875
+ displayName: 'Similarity',
876
+ values: [
877
+ { displayName: 'Similarity Mode', name: 'similarityModeSingle', type: 'string', default: '', description: 'Similarity mode.' },
878
+ { displayName: 'Similarity Threshold', name: 'similarityThresholdSingle', type: 'number', default: 0, description: 'Similarity threshold.' },
879
+ ],
880
+ },
881
+ {
882
+ name: 'quality',
883
+ displayName: 'Quality',
884
+ values: [{ displayName: 'Quality Sample', name: 'qualitySampleSingle', type: 'number', default: 0, description: 'Sample size for quality analysis.' }],
885
+ },
886
+ {
887
+ name: 'transparency',
888
+ displayName: 'Transparency',
889
+ values: [{ displayName: 'Transparency Sample', name: 'transparencySampleSingle', type: 'number', default: 0, description: 'Sample size for transparency analysis.' }],
890
+ },
891
+ {
892
+ name: 'efficiency',
893
+ displayName: 'Efficiency',
894
+ values: [
895
+ { displayName: 'Efficiency Format', name: 'efficiencyFormatSingle', type: 'string', default: '', description: 'Output format for efficiency tool.' },
896
+ { displayName: 'Efficiency Quality', name: 'efficiencyQualitySingle', type: 'number', default: 0, description: 'Quality setting for efficiency tool.' },
796
897
  ],
797
898
  },
798
- { displayName: 'Similarity Mode', name: 'similarityMode', type: 'string', default: '', description: 'Similarity mode (similarity tool).' },
799
- { displayName: 'Similarity Threshold', name: 'similarityThreshold', type: 'number', default: 0, description: 'Similarity threshold (similarity tool).' },
800
- { displayName: 'Quality Sample', name: 'qualitySample', type: 'number', default: 0, description: 'Sample size for quality analysis (quality tool).' },
801
- { displayName: 'Transparency Sample', name: 'transparencySample', type: 'number', default: 0, description: 'Sample size for transparency analysis (transparency tool).' },
802
- { displayName: 'Efficiency Format', name: 'efficiencyFormat', type: 'string', default: '', description: 'Output format for efficiency tool.' },
803
- { displayName: 'Efficiency Quality', name: 'efficiencyQuality', type: 'number', default: 0, description: 'Quality setting for efficiency tool.' },
804
899
  ],
805
900
  },
806
901
  {
807
- displayName: 'Options',
808
- name: 'options',
809
- type: 'collection',
902
+ // Multitask tool parameters grouped to keep property keys unique
903
+ displayName: 'Tool Parameters (Multitask)',
904
+ name: 'toolParametersMulti',
905
+ type: 'fixedCollection',
810
906
  default: {},
811
- placeholder: 'Add option',
812
- description: 'Optional tool parameters (applied per selected tool).',
907
+ placeholder: 'Add tool parameters',
908
+ description: 'Parameters for selected tools in multitask.',
909
+ typeOptions: { multipleValues: false },
813
910
  displayOptions: { show: { resource: ['tools'], operation: ['multitask'] } },
814
911
  options: [
815
- { displayName: 'Include Raw EXIF', name: 'includeRawExif', type: 'boolean', default: false, description: 'Include raw EXIF data (metadata tool).' },
816
- { displayName: 'Palette Size', name: 'paletteSize', type: 'number', default: 5, description: 'Number of colors to extract (palette tool).' },
817
912
  {
818
- displayName: 'Hash Type',
819
- name: 'hashType',
820
- type: 'options',
821
- default: 'phash',
822
- description: 'Hash algorithm to compute (hash tool).',
823
- options: [
824
- { name: 'pHash', value: 'phash' },
825
- { name: 'MD5', value: 'md5' },
826
- { name: 'SHA1', value: 'sha1' },
913
+ name: 'metadata',
914
+ displayName: 'Metadata',
915
+ values: [{ displayName: 'Include Raw EXIF', name: 'metadataIncludeRawExifMulti', type: 'boolean', default: false, description: 'Include raw EXIF data when available.' }],
916
+ },
917
+ {
918
+ name: 'palette',
919
+ displayName: 'Palette',
920
+ values: [{ displayName: 'Palette Size', name: 'paletteSizeMulti', type: 'number', default: 5, description: 'Number of colors to extract.' }],
921
+ },
922
+ {
923
+ name: 'hash',
924
+ displayName: 'Hash',
925
+ values: [
926
+ {
927
+ displayName: 'Hash Type',
928
+ name: 'hashTypeMulti',
929
+ type: 'options',
930
+ default: 'phash',
931
+ description: 'Hash algorithm to compute.',
932
+ options: [
933
+ { name: 'pHash', value: 'phash' },
934
+ { name: 'MD5', value: 'md5' },
935
+ { name: 'SHA1', value: 'sha1' },
936
+ ],
937
+ },
938
+ ],
939
+ },
940
+ {
941
+ name: 'similarity',
942
+ displayName: 'Similarity',
943
+ values: [
944
+ { displayName: 'Similarity Mode', name: 'similarityModeMulti', type: 'string', default: '', description: 'Similarity mode.' },
945
+ { displayName: 'Similarity Threshold', name: 'similarityThresholdMulti', type: 'number', default: 0, description: 'Similarity threshold.' },
946
+ ],
947
+ },
948
+ {
949
+ name: 'quality',
950
+ displayName: 'Quality',
951
+ values: [{ displayName: 'Quality Sample', name: 'qualitySampleMulti', type: 'number', default: 0, description: 'Sample size for quality analysis.' }],
952
+ },
953
+ {
954
+ name: 'transparency',
955
+ displayName: 'Transparency',
956
+ values: [{ displayName: 'Transparency Sample', name: 'transparencySampleMulti', type: 'number', default: 0, description: 'Sample size for transparency analysis.' }],
957
+ },
958
+ {
959
+ name: 'efficiency',
960
+ displayName: 'Efficiency',
961
+ values: [
962
+ { displayName: 'Efficiency Format', name: 'efficiencyFormatMulti', type: 'string', default: '', description: 'Output format for efficiency tool.' },
963
+ { displayName: 'Efficiency Quality', name: 'efficiencyQualityMulti', type: 'number', default: 0, description: 'Quality setting for efficiency tool.' },
964
+ ],
965
+ },
966
+ ],
967
+ },
968
+ {
969
+ displayName: 'Similarity Parameters (Multitask)',
970
+ name: 'similarityParametersMulti',
971
+ type: 'fixedCollection',
972
+ default: {},
973
+ placeholder: 'Add similarity parameters',
974
+ description: 'Similarity tool options for multitask.',
975
+ typeOptions: { multipleValues: false },
976
+ displayOptions: { show: { resource: ['tools'], operation: ['multitask'], tools: ['similarity'] } },
977
+ options: [
978
+ {
979
+ name: 'parameters',
980
+ displayName: 'Parameters',
981
+ values: [
982
+ { displayName: 'Similarity Mode', name: 'similarityMode', type: 'string', default: '', description: 'Similarity mode.' },
983
+ { displayName: 'Similarity Threshold', name: 'similarityThreshold', type: 'number', default: 0, description: 'Similarity threshold.' },
827
984
  ],
828
985
  },
829
- { displayName: 'Similarity Mode', name: 'similarityMode', type: 'string', default: '', description: 'Similarity mode (similarity tool).' },
830
- { displayName: 'Similarity Threshold', name: 'similarityThreshold', type: 'number', default: 0, description: 'Similarity threshold (similarity tool).' },
831
- { displayName: 'Quality Sample', name: 'qualitySample', type: 'number', default: 0, description: 'Sample size for quality analysis (quality tool).' },
832
- { displayName: 'Transparency Sample', name: 'transparencySample', type: 'number', default: 0, description: 'Sample size for transparency analysis (transparency tool).' },
833
- { displayName: 'Efficiency Format', name: 'efficiencyFormat', type: 'string', default: '', description: 'Output format for efficiency tool.' },
834
- { displayName: 'Efficiency Quality', name: 'efficiencyQuality', type: 'number', default: 0, description: 'Quality setting for efficiency tool.' },
835
986
  ],
836
987
  },
988
+ {
989
+ displayName: 'Quality Parameters (Multitask)',
990
+ name: 'qualityParametersMulti',
991
+ type: 'fixedCollection',
992
+ default: {},
993
+ placeholder: 'Add quality parameters',
994
+ description: 'Quality tool options for multitask.',
995
+ typeOptions: { multipleValues: false },
996
+ displayOptions: { show: { resource: ['tools'], operation: ['multitask'], tools: ['quality'] } },
997
+ options: [
998
+ {
999
+ name: 'parameters',
1000
+ displayName: 'Parameters',
1001
+ values: [{ displayName: 'Quality Sample', name: 'qualitySample', type: 'number', default: 0, description: 'Sample size for quality analysis.' }],
1002
+ },
1003
+ ],
1004
+ },
1005
+ {
1006
+ displayName: 'Transparency Parameters (Multitask)',
1007
+ name: 'transparencyParametersMulti',
1008
+ type: 'fixedCollection',
1009
+ default: {},
1010
+ placeholder: 'Add transparency parameters',
1011
+ description: 'Transparency tool options for multitask.',
1012
+ typeOptions: { multipleValues: false },
1013
+ displayOptions: { show: { resource: ['tools'], operation: ['multitask'], tools: ['transparency'] } },
1014
+ options: [
1015
+ {
1016
+ name: 'parameters',
1017
+ displayName: 'Parameters',
1018
+ values: [{ displayName: 'Transparency Sample', name: 'transparencySample', type: 'number', default: 0, description: 'Sample size for transparency analysis.' }],
1019
+ },
1020
+ ],
1021
+ },
1022
+ {
1023
+ displayName: 'Efficiency Parameters (Multitask)',
1024
+ name: 'efficiencyParametersMulti',
1025
+ type: 'fixedCollection',
1026
+ default: {},
1027
+ placeholder: 'Add efficiency parameters',
1028
+ description: 'Efficiency tool options for multitask.',
1029
+ typeOptions: { multipleValues: false },
1030
+ displayOptions: { show: { resource: ['tools'], operation: ['multitask'], tools: ['efficiency'] } },
1031
+ options: [
1032
+ {
1033
+ name: 'parameters',
1034
+ displayName: 'Parameters',
1035
+ values: [
1036
+ { displayName: 'Efficiency Format', name: 'efficiencyFormat', type: 'string', default: '', description: 'Output format for efficiency tool.' },
1037
+ { displayName: 'Efficiency Quality', name: 'efficiencyQuality', type: 'number', default: 0, description: 'Quality setting for efficiency tool.' },
1038
+ ],
1039
+ },
1040
+ ],
1041
+ },
1042
+ {
1043
+ displayName: 'Similarity Tool',
1044
+ name: 'similarityToolNoticeMulti',
1045
+ type: 'notice',
1046
+ default: '────────── Similarity tool ──────────',
1047
+ description: 'Parameters for the Similarity tool.',
1048
+ displayOptions: { show: { resource: ['tools'], operation: ['multitask'], tools: ['similarity'] } },
1049
+ },
1050
+ { displayName: 'Similarity Mode', name: 'similarityModeMulti', type: 'string', default: '', description: 'Similarity mode (similarity tool).', displayOptions: { show: { resource: ['tools'], operation: ['multitask'], tools: ['similarity'] } } },
1051
+ { displayName: 'Similarity Threshold', name: 'similarityThresholdMulti', type: 'number', default: 0, description: 'Similarity threshold (similarity tool).', displayOptions: { show: { resource: ['tools'], operation: ['multitask'], tools: ['similarity'] } } },
1052
+ {
1053
+ displayName: 'Quality Tool',
1054
+ name: 'qualityToolNoticeMulti',
1055
+ type: 'notice',
1056
+ default: '────────── Quality tool ──────────',
1057
+ description: 'Parameters for the Quality tool.',
1058
+ displayOptions: { show: { resource: ['tools'], operation: ['multitask'], tools: ['quality'] } },
1059
+ },
1060
+ { displayName: 'Quality Sample', name: 'qualitySampleMulti', type: 'number', default: 0, description: 'Sample size for quality analysis.', displayOptions: { show: { resource: ['tools'], operation: ['multitask'], tools: ['quality'] } } },
1061
+ {
1062
+ displayName: 'Transparency Tool',
1063
+ name: 'transparencyToolNoticeMulti',
1064
+ type: 'notice',
1065
+ default: '────────── Transparency tool ──────────',
1066
+ description: 'Parameters for the Transparency tool.',
1067
+ displayOptions: { show: { resource: ['tools'], operation: ['multitask'], tools: ['transparency'] } },
1068
+ },
1069
+ { displayName: 'Transparency Sample', name: 'transparencySampleMulti', type: 'number', default: 0, description: 'Sample size for transparency analysis.', displayOptions: { show: { resource: ['tools'], operation: ['multitask'], tools: ['transparency'] } } },
1070
+ {
1071
+ displayName: 'Efficiency Tool',
1072
+ name: 'efficiencyToolNoticeMulti',
1073
+ type: 'notice',
1074
+ default: '────────── Efficiency tool ──────────',
1075
+ description: 'Parameters for the Efficiency tool.',
1076
+ displayOptions: { show: { resource: ['tools'], operation: ['multitask'], tools: ['efficiency'] } },
1077
+ },
1078
+ { displayName: 'Efficiency Format', name: 'efficiencyFormatMulti', type: 'string', default: '', description: 'Output format for efficiency tool.', displayOptions: { show: { resource: ['tools'], operation: ['multitask'], tools: ['efficiency'] } } },
1079
+ { displayName: 'Efficiency Quality', name: 'efficiencyQualityMulti', type: 'number', default: 0, description: 'Quality setting for efficiency tool.', displayOptions: { show: { resource: ['tools'], operation: ['multitask'], tools: ['efficiency'] } } },
837
1080
  ],
838
1081
  };
839
1082
  async execute() {
@@ -1065,108 +1308,117 @@ class DavixH2I {
1065
1308
  setBool('includeRawExif', this.getNodeParameter('includeRawExif', itemIndex));
1066
1309
  break;
1067
1310
  case 'multitask': {
1068
- const options = this.getNodeParameter('options', itemIndex, {}) || {};
1069
- const hasVal = (key) => Object.prototype.hasOwnProperty.call(options, key);
1070
- const getOpt = (key) => options[key];
1071
- if (hasVal('format'))
1072
- setString('format', getOpt('format'));
1073
- if (hasVal('width'))
1074
- setNumber('width', Number(getOpt('width')));
1075
- if (hasVal('height'))
1076
- setNumber('height', Number(getOpt('height')));
1077
- if (hasVal('enlarge'))
1078
- setBool('enlarge', Boolean(getOpt('enlarge')));
1079
- if (hasVal('normalizeOrientation'))
1080
- setBool('normalizeOrientation', Boolean(getOpt('normalizeOrientation')));
1081
- if (hasVal('cropX'))
1082
- setNumber('cropX', Number(getOpt('cropX')));
1083
- if (hasVal('cropY'))
1084
- setNumber('cropY', Number(getOpt('cropY')));
1085
- if (hasVal('cropWidth'))
1086
- setNumber('cropWidth', Number(getOpt('cropWidth')));
1087
- if (hasVal('cropHeight'))
1088
- setNumber('cropHeight', Number(getOpt('cropHeight')));
1089
- if (hasVal('backgroundColor'))
1090
- setString('backgroundColor', String(getOpt('backgroundColor')));
1091
- if (hasVal('rotate'))
1092
- setNumber('rotate', Number(getOpt('rotate')));
1093
- if (hasVal('flipH'))
1094
- setBool('flipH', Boolean(getOpt('flipH')));
1095
- if (hasVal('flipV'))
1096
- setBool('flipV', Boolean(getOpt('flipV')));
1097
- if (hasVal('colorSpace'))
1098
- formData.colorSpace = String(getOpt('colorSpace'));
1099
- if (hasVal('targetSizeKB'))
1100
- setNumber('targetSizeKB', Number(getOpt('targetSizeKB')));
1101
- if (hasVal('quality'))
1102
- setNumber('quality', Number(getOpt('quality')));
1103
- if (hasVal('keepMetadata'))
1104
- setBool('keepMetadata', Boolean(getOpt('keepMetadata')));
1105
- if (hasVal('blur'))
1106
- setNumber('blur', Number(getOpt('blur')));
1107
- if (hasVal('sharpen'))
1108
- setNumber('sharpen', Number(getOpt('sharpen')));
1109
- if (hasVal('grayscale'))
1110
- setBool('grayscale', Boolean(getOpt('grayscale')));
1111
- if (hasVal('sepia'))
1112
- setBool('sepia', Boolean(getOpt('sepia')));
1113
- if (hasVal('brightness'))
1114
- setNumber('brightness', Number(getOpt('brightness')));
1115
- if (hasVal('contrast'))
1116
- setNumber('contrast', Number(getOpt('contrast')));
1117
- if (hasVal('saturation'))
1118
- setNumber('saturation', Number(getOpt('saturation')));
1119
- if (hasVal('pad'))
1120
- setNumber('pad', Number(getOpt('pad')));
1121
- if (hasVal('padTop'))
1122
- setNumber('padTop', Number(getOpt('padTop')));
1123
- if (hasVal('padRight'))
1124
- setNumber('padRight', Number(getOpt('padRight')));
1125
- if (hasVal('padBottom'))
1126
- setNumber('padBottom', Number(getOpt('padBottom')));
1127
- if (hasVal('padLeft'))
1128
- setNumber('padLeft', Number(getOpt('padLeft')));
1129
- if (hasVal('padColor'))
1130
- setString('padColor', String(getOpt('padColor')));
1131
- if (hasVal('borderRadius'))
1132
- setNumber('borderRadius', Number(getOpt('borderRadius')));
1133
- if (hasVal('border'))
1134
- setNumber('border', Number(getOpt('border')));
1135
- if (hasVal('borderColor'))
1136
- setString('borderColor', String(getOpt('borderColor')));
1137
- if (hasVal('backgroundBlur'))
1138
- setNumber('backgroundBlur', Number(getOpt('backgroundBlur')));
1139
- if (hasVal('watermarkText'))
1140
- setString('watermarkText', String(getOpt('watermarkText')));
1141
- if (hasVal('watermarkFontSize'))
1142
- setNumber('watermarkFontSize', Number(getOpt('watermarkFontSize')));
1143
- if (hasVal('watermarkColor'))
1144
- setString('watermarkColor', String(getOpt('watermarkColor')));
1145
- if (hasVal('watermarkOpacity'))
1146
- setNumber('watermarkOpacity', Number(getOpt('watermarkOpacity')));
1147
- if (hasVal('watermarkPosition'))
1148
- formData.watermarkPosition = String(getOpt('watermarkPosition'));
1149
- if (hasVal('watermarkMargin'))
1150
- setNumber('watermarkMargin', Number(getOpt('watermarkMargin')));
1151
- if (hasVal('watermarkScale'))
1152
- setNumber('watermarkScale', Number(getOpt('watermarkScale')));
1153
- if (hasVal('pdfMode'))
1154
- formData.pdfMode = String(getOpt('pdfMode'));
1155
- if (hasVal('pdfPageSize'))
1156
- formData.pdfPageSize = String(getOpt('pdfPageSize'));
1157
- if (hasVal('pdfOrientation'))
1158
- formData.pdfOrientation = String(getOpt('pdfOrientation'));
1159
- if (hasVal('pdfMargin'))
1160
- setNumber('pdfMargin', Number(getOpt('pdfMargin')));
1161
- if (hasVal('pdfEmbedFormat'))
1162
- formData.pdfEmbedFormat = String(getOpt('pdfEmbedFormat'));
1163
- if (hasVal('pdfJpegQuality'))
1164
- setNumber('pdfJpegQuality', Number(getOpt('pdfJpegQuality')));
1165
- if (hasVal('includeRawExif'))
1166
- setBool('includeRawExif', Boolean(getOpt('includeRawExif')));
1167
- const watermarkProp = this.getNodeParameter('watermarkBinaryProperty', itemIndex, '');
1168
- if (watermarkProp)
1169
- await includeWatermarkFile(watermarkProp);
1311
+ const selectedActions = this.getNodeParameter('actions', itemIndex, []) || [];
1312
+ if (selectedActions.length === 0)
1313
+ throw new Error('Select at least one action for multitask.');
1314
+ const setNumberOnce = (name, value) => {
1315
+ if (value !== undefined && value !== null && value !== 0 && formData[name] === undefined)
1316
+ formData[name] = String(value);
1317
+ };
1318
+ const setStringOnce = (name, value) => {
1319
+ if (value && formData[name] === undefined)
1320
+ formData[name] = value;
1321
+ };
1322
+ const setBoolOnce = (name, value) => {
1323
+ if (value !== undefined && value !== null && formData[name] === undefined)
1324
+ formData[name] = toBoolString(value);
1325
+ };
1326
+ setStringOnce('format', this.getNodeParameter('multitaskFormat', itemIndex));
1327
+ setBoolOnce('keepMetadata', this.getNodeParameter('multitaskKeepMetadata', itemIndex));
1328
+ for (const a of selectedActions) {
1329
+ switch (a) {
1330
+ case 'format':
1331
+ {
1332
+ const params = this.getNodeParameter('imageActionParams.format', itemIndex, {}) || {};
1333
+ setNumberOnce('width', Number(params.formatWidthMulti ?? 0));
1334
+ setNumberOnce('height', Number(params.formatHeightMulti ?? 0));
1335
+ }
1336
+ break;
1337
+ case 'resize':
1338
+ {
1339
+ const params = this.getNodeParameter('imageActionParams.resize', itemIndex, {}) || {};
1340
+ setNumberOnce('width', Number(params.resizeWidthMulti ?? 0));
1341
+ setNumberOnce('height', Number(params.resizeHeightMulti ?? 0));
1342
+ setBoolOnce('enlarge', Boolean(params.resizeEnlargeMulti));
1343
+ setBoolOnce('normalizeOrientation', Boolean(params.resizeNormalizeOrientationMulti));
1344
+ }
1345
+ break;
1346
+ case 'crop':
1347
+ {
1348
+ const params = this.getNodeParameter('imageActionParams.crop', itemIndex, {}) || {};
1349
+ setNumberOnce('cropX', Number(params.cropXMulti ?? 0));
1350
+ setNumberOnce('cropY', Number(params.cropYMulti ?? 0));
1351
+ setNumberOnce('cropWidth', Number(params.cropWidthMulti ?? 0));
1352
+ setNumberOnce('cropHeight', Number(params.cropHeightMulti ?? 0));
1353
+ setBoolOnce('normalizeOrientation', Boolean(params.cropNormalizeOrientationMulti));
1354
+ setStringOnce('backgroundColor', String(params.cropBackgroundColorMulti ?? ''));
1355
+ }
1356
+ break;
1357
+ case 'transform':
1358
+ {
1359
+ const params = this.getNodeParameter('imageActionParams.transform', itemIndex, {}) || {};
1360
+ setNumberOnce('rotate', Number(params.transformRotateMulti ?? 0));
1361
+ setBoolOnce('flipH', Boolean(params.transformFlipHMulti));
1362
+ setBoolOnce('flipV', Boolean(params.transformFlipVMulti));
1363
+ setStringOnce('colorSpace', String(params.transformColorSpaceMulti ?? ''));
1364
+ }
1365
+ break;
1366
+ case 'compress':
1367
+ {
1368
+ const params = this.getNodeParameter('imageActionParams.compress', itemIndex, {}) || {};
1369
+ setNumberOnce('quality', Number(params.compressQualityMulti ?? 0));
1370
+ setNumberOnce('targetSizeKB', Number(params.compressTargetSizeKBMulti ?? 0));
1371
+ setStringOnce('backgroundColor', String(params.compressBackgroundColorMulti ?? ''));
1372
+ setStringOnce('colorSpace', String(params.compressColorSpaceMulti ?? ''));
1373
+ }
1374
+ break;
1375
+ case 'enhance':
1376
+ {
1377
+ const params = this.getNodeParameter('imageActionParams.enhance', itemIndex, {}) || {};
1378
+ setNumberOnce('blur', Number(params.enhanceBlurMulti ?? 0));
1379
+ setNumberOnce('sharpen', Number(params.enhanceSharpenMulti ?? 0));
1380
+ setBoolOnce('grayscale', Boolean(params.enhanceGrayscaleMulti));
1381
+ setBoolOnce('sepia', Boolean(params.enhanceSepiaMulti));
1382
+ setNumberOnce('brightness', Number(params.enhanceBrightnessMulti ?? 0));
1383
+ setNumberOnce('contrast', Number(params.enhanceContrastMulti ?? 0));
1384
+ setNumberOnce('saturation', Number(params.enhanceSaturationMulti ?? 0));
1385
+ setBoolOnce('normalizeOrientation', Boolean(params.enhanceNormalizeOrientationMulti));
1386
+ }
1387
+ break;
1388
+ case 'frame':
1389
+ {
1390
+ const params = this.getNodeParameter('imageActionParams.frame', itemIndex, {}) || {};
1391
+ setNumberOnce('pad', Number(params.framePadMulti ?? 0));
1392
+ setStringOnce('padColor', String(params.framePadColorMulti ?? ''));
1393
+ setNumberOnce('border', Number(params.frameBorderMulti ?? 0));
1394
+ setStringOnce('borderColor', String(params.frameBorderColorMulti ?? ''));
1395
+ setNumberOnce('borderRadius', Number(params.frameBorderRadiusMulti ?? 0));
1396
+ }
1397
+ break;
1398
+ case 'background':
1399
+ {
1400
+ const params = this.getNodeParameter('imageActionParams.background', itemIndex, {}) || {};
1401
+ setStringOnce('backgroundColor', String(params.backgroundColorMulti ?? ''));
1402
+ setNumberOnce('backgroundBlur', Number(params.backgroundBlurMulti ?? 0));
1403
+ setNumberOnce('borderRadius', Number(params.backgroundBorderRadiusMulti ?? 0));
1404
+ setStringOnce('padColor', String(params.backgroundPadColorMulti ?? ''));
1405
+ }
1406
+ break;
1407
+ case 'watermark':
1408
+ {
1409
+ const params = this.getNodeParameter('imageActionParams.watermark', itemIndex, {}) || {};
1410
+ setStringOnce('watermarkText', String(params.watermarkTextMulti ?? ''));
1411
+ setNumberOnce('watermarkOpacity', Number(params.watermarkOpacityMulti ?? 0));
1412
+ formData.watermarkPosition = formData.watermarkPosition ?? params.watermarkPositionMulti;
1413
+ setNumberOnce('watermarkMargin', Number(params.watermarkMarginMulti ?? 0));
1414
+ setNumberOnce('watermarkScale', Number(params.watermarkScaleMulti ?? 0));
1415
+ setStringOnce('watermarkColor', String(params.watermarkColorMulti ?? ''));
1416
+ setNumberOnce('watermarkFontSize', Number(params.watermarkFontSizeMulti ?? 0));
1417
+ await includeWatermarkFile(String(params.watermarkImageBinaryProperty ?? ''));
1418
+ }
1419
+ break;
1420
+ }
1421
+ }
1170
1422
  break;
1171
1423
  }
1172
1424
  }
@@ -1323,41 +1575,62 @@ class DavixH2I {
1323
1575
  selectedTools = tools;
1324
1576
  formData.tools = tools.join(',');
1325
1577
  }
1326
- const toolOptions = this.getNodeParameter('options', itemIndex, {}) || {};
1327
- const hasOpt = (key) => Object.prototype.hasOwnProperty.call(toolOptions, key);
1328
- const getOpt = (key) => toolOptions[key];
1329
1578
  const hasTool = (toolName) => selectedTools.includes(toolName);
1579
+ const getParams = (path) => this.getNodeParameter(path, itemIndex, {}) || {};
1330
1580
  if (hasTool('metadata')) {
1331
- if (hasOpt('includeRawExif'))
1332
- setBool('includeRawExif', Boolean(getOpt('includeRawExif')));
1581
+ const params = action === 'single'
1582
+ ? getParams('toolParametersSingle.metadata')
1583
+ : getParams('toolParametersMulti.metadata');
1584
+ if (params.metadataIncludeRawExifSingle ?? params.metadataIncludeRawExifMulti)
1585
+ setBool('includeRawExif', Boolean(params.metadataIncludeRawExifSingle ?? params.metadataIncludeRawExifMulti));
1333
1586
  }
1334
1587
  if (hasTool('palette')) {
1335
- if (hasOpt('paletteSize'))
1336
- setNumber('paletteSize', Number(getOpt('paletteSize')));
1588
+ const params = action === 'single' ? getParams('toolParametersSingle.palette') : getParams('toolParametersMulti.palette');
1589
+ const val = params.paletteSizeSingle ?? params.paletteSizeMulti;
1590
+ if (val)
1591
+ setNumber('paletteSize', Number(val));
1337
1592
  }
1338
1593
  if (hasTool('hash')) {
1339
- if (hasOpt('hashType'))
1340
- setString('hashType', String(getOpt('hashType')));
1594
+ const params = action === 'single' ? getParams('toolParametersSingle.hash') : getParams('toolParametersMulti.hash');
1595
+ const val = params.hashTypeSingle ?? params.hashTypeMulti;
1596
+ if (val)
1597
+ setString('hashType', String(val));
1341
1598
  }
1342
1599
  if (hasTool('quality')) {
1343
- if (hasOpt('qualitySample'))
1344
- setNumber('qualitySample', Number(getOpt('qualitySample')));
1600
+ const params = action === 'single' ? getParams('toolParametersSingle.quality') : getParams('toolParametersMulti.quality');
1601
+ const val = params.qualitySampleSingle ?? params.qualitySampleMulti;
1602
+ if (val)
1603
+ setNumber('qualitySample', Number(val));
1345
1604
  }
1346
1605
  if (hasTool('transparency')) {
1347
- if (hasOpt('transparencySample'))
1348
- setNumber('transparencySample', Number(getOpt('transparencySample')));
1606
+ const params = action === 'single'
1607
+ ? getParams('toolParametersSingle.transparency')
1608
+ : getParams('toolParametersMulti.transparency');
1609
+ const val = params.transparencySampleSingle ?? params.transparencySampleMulti;
1610
+ if (val)
1611
+ setNumber('transparencySample', Number(val));
1349
1612
  }
1350
1613
  if (hasTool('similarity')) {
1351
- if (hasOpt('similarityMode'))
1352
- setString('similarityMode', String(getOpt('similarityMode')));
1353
- if (hasOpt('similarityThreshold'))
1354
- setNumber('similarityThreshold', Number(getOpt('similarityThreshold')));
1614
+ const params = action === 'single'
1615
+ ? getParams('toolParametersSingle.similarity')
1616
+ : getParams('toolParametersMulti.similarity');
1617
+ const mode = params.similarityModeSingle ?? params.similarityModeMulti;
1618
+ const threshold = params.similarityThresholdSingle ?? params.similarityThresholdMulti;
1619
+ if (mode)
1620
+ setString('similarityMode', String(mode));
1621
+ if (threshold)
1622
+ setNumber('similarityThreshold', Number(threshold));
1355
1623
  }
1356
1624
  if (hasTool('efficiency')) {
1357
- if (hasOpt('efficiencyFormat'))
1358
- setString('efficiencyFormat', String(getOpt('efficiencyFormat')));
1359
- if (hasOpt('efficiencyQuality'))
1360
- setNumber('efficiencyQuality', Number(getOpt('efficiencyQuality')));
1625
+ const params = action === 'single'
1626
+ ? getParams('toolParametersSingle.efficiency')
1627
+ : getParams('toolParametersMulti.efficiency');
1628
+ const formatVal = params.efficiencyFormatSingle ?? params.efficiencyFormatMulti;
1629
+ const qualityVal = params.efficiencyQualitySingle ?? params.efficiencyQualityMulti;
1630
+ if (formatVal)
1631
+ setString('efficiencyFormat', String(formatVal));
1632
+ if (qualityVal)
1633
+ setNumber('efficiencyQuality', Number(qualityVal));
1361
1634
  }
1362
1635
  const response = await GenericFunctions_1.davixRequest.call(this, {
1363
1636
  method: 'POST',
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "n8n-nodes-h2i",
3
- "version": "1.0.4",
3
+ "version": "1.0.8",
4
4
  "description": "Davix H2I (PixLab) community node for n8n: H2I, Image, PDF, Tools endpoints",
5
5
  "license": "MIT",
6
6
  "keywords": [