@mediaproc/image 1.0.0

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 (179) hide show
  1. package/README.md +2516 -0
  2. package/bin/cli.js +6 -0
  3. package/dist/cli.d.ts +3 -0
  4. package/dist/cli.d.ts.map +1 -0
  5. package/dist/cli.js +89 -0
  6. package/dist/cli.js.map +1 -0
  7. package/dist/commands/auto-enhance.d.ts +3 -0
  8. package/dist/commands/auto-enhance.d.ts.map +1 -0
  9. package/dist/commands/auto-enhance.js +148 -0
  10. package/dist/commands/auto-enhance.js.map +1 -0
  11. package/dist/commands/batch.d.ts +3 -0
  12. package/dist/commands/batch.d.ts.map +1 -0
  13. package/dist/commands/batch.js +230 -0
  14. package/dist/commands/batch.js.map +1 -0
  15. package/dist/commands/blur.d.ts +3 -0
  16. package/dist/commands/blur.d.ts.map +1 -0
  17. package/dist/commands/blur.js +122 -0
  18. package/dist/commands/blur.js.map +1 -0
  19. package/dist/commands/border.d.ts +3 -0
  20. package/dist/commands/border.d.ts.map +1 -0
  21. package/dist/commands/border.js +122 -0
  22. package/dist/commands/border.js.map +1 -0
  23. package/dist/commands/clahe.d.ts +3 -0
  24. package/dist/commands/clahe.d.ts.map +1 -0
  25. package/dist/commands/clahe.js +121 -0
  26. package/dist/commands/clahe.js.map +1 -0
  27. package/dist/commands/composite.d.ts +3 -0
  28. package/dist/commands/composite.d.ts.map +1 -0
  29. package/dist/commands/composite.js +167 -0
  30. package/dist/commands/composite.js.map +1 -0
  31. package/dist/commands/convert.d.ts +3 -0
  32. package/dist/commands/convert.d.ts.map +1 -0
  33. package/dist/commands/convert.js +136 -0
  34. package/dist/commands/convert.js.map +1 -0
  35. package/dist/commands/convolve.d.ts +3 -0
  36. package/dist/commands/convolve.d.ts.map +1 -0
  37. package/dist/commands/convolve.js +171 -0
  38. package/dist/commands/convolve.js.map +1 -0
  39. package/dist/commands/crop.d.ts +3 -0
  40. package/dist/commands/crop.d.ts.map +1 -0
  41. package/dist/commands/crop.js +120 -0
  42. package/dist/commands/crop.js.map +1 -0
  43. package/dist/commands/dominant-color.d.ts +3 -0
  44. package/dist/commands/dominant-color.d.ts.map +1 -0
  45. package/dist/commands/dominant-color.js +175 -0
  46. package/dist/commands/dominant-color.js.map +1 -0
  47. package/dist/commands/extend.d.ts +3 -0
  48. package/dist/commands/extend.d.ts.map +1 -0
  49. package/dist/commands/extend.js +146 -0
  50. package/dist/commands/extend.js.map +1 -0
  51. package/dist/commands/extract.d.ts +3 -0
  52. package/dist/commands/extract.d.ts.map +1 -0
  53. package/dist/commands/extract.js +169 -0
  54. package/dist/commands/extract.js.map +1 -0
  55. package/dist/commands/flip.d.ts +3 -0
  56. package/dist/commands/flip.d.ts.map +1 -0
  57. package/dist/commands/flip.js +112 -0
  58. package/dist/commands/flip.js.map +1 -0
  59. package/dist/commands/gamma.d.ts +3 -0
  60. package/dist/commands/gamma.d.ts.map +1 -0
  61. package/dist/commands/gamma.js +129 -0
  62. package/dist/commands/gamma.js.map +1 -0
  63. package/dist/commands/grayscale.d.ts +3 -0
  64. package/dist/commands/grayscale.d.ts.map +1 -0
  65. package/dist/commands/grayscale.js +94 -0
  66. package/dist/commands/grayscale.js.map +1 -0
  67. package/dist/commands/grid.d.ts +3 -0
  68. package/dist/commands/grid.d.ts.map +1 -0
  69. package/dist/commands/grid.js +193 -0
  70. package/dist/commands/grid.js.map +1 -0
  71. package/dist/commands/median.d.ts +3 -0
  72. package/dist/commands/median.d.ts.map +1 -0
  73. package/dist/commands/median.js +132 -0
  74. package/dist/commands/median.js.map +1 -0
  75. package/dist/commands/metadata-cmd.d.ts +3 -0
  76. package/dist/commands/metadata-cmd.d.ts.map +1 -0
  77. package/dist/commands/metadata-cmd.js +201 -0
  78. package/dist/commands/metadata-cmd.js.map +1 -0
  79. package/dist/commands/mirror.d.ts +3 -0
  80. package/dist/commands/mirror.d.ts.map +1 -0
  81. package/dist/commands/mirror.js +218 -0
  82. package/dist/commands/mirror.js.map +1 -0
  83. package/dist/commands/modulate.d.ts +3 -0
  84. package/dist/commands/modulate.d.ts.map +1 -0
  85. package/dist/commands/modulate.js +151 -0
  86. package/dist/commands/modulate.js.map +1 -0
  87. package/dist/commands/negate.d.ts +3 -0
  88. package/dist/commands/negate.d.ts.map +1 -0
  89. package/dist/commands/negate.js +111 -0
  90. package/dist/commands/negate.js.map +1 -0
  91. package/dist/commands/normalize.d.ts +3 -0
  92. package/dist/commands/normalize.d.ts.map +1 -0
  93. package/dist/commands/normalize.js +119 -0
  94. package/dist/commands/normalize.js.map +1 -0
  95. package/dist/commands/optimize.d.ts +3 -0
  96. package/dist/commands/optimize.d.ts.map +1 -0
  97. package/dist/commands/optimize.js +137 -0
  98. package/dist/commands/optimize.js.map +1 -0
  99. package/dist/commands/palette.d.ts +3 -0
  100. package/dist/commands/palette.d.ts.map +1 -0
  101. package/dist/commands/palette.js +138 -0
  102. package/dist/commands/palette.js.map +1 -0
  103. package/dist/commands/pixelate.d.ts +3 -0
  104. package/dist/commands/pixelate.d.ts.map +1 -0
  105. package/dist/commands/pixelate.js +123 -0
  106. package/dist/commands/pixelate.js.map +1 -0
  107. package/dist/commands/resize.d.ts +3 -0
  108. package/dist/commands/resize.d.ts.map +1 -0
  109. package/dist/commands/resize.js +187 -0
  110. package/dist/commands/resize.js.map +1 -0
  111. package/dist/commands/rotate.d.ts +3 -0
  112. package/dist/commands/rotate.d.ts.map +1 -0
  113. package/dist/commands/rotate.js +103 -0
  114. package/dist/commands/rotate.js.map +1 -0
  115. package/dist/commands/sepia.d.ts +3 -0
  116. package/dist/commands/sepia.d.ts.map +1 -0
  117. package/dist/commands/sepia.js +119 -0
  118. package/dist/commands/sepia.js.map +1 -0
  119. package/dist/commands/sharpen.d.ts +3 -0
  120. package/dist/commands/sharpen.d.ts.map +1 -0
  121. package/dist/commands/sharpen.js +123 -0
  122. package/dist/commands/sharpen.js.map +1 -0
  123. package/dist/commands/smart-crop.d.ts +3 -0
  124. package/dist/commands/smart-crop.d.ts.map +1 -0
  125. package/dist/commands/smart-crop.js +137 -0
  126. package/dist/commands/smart-crop.js.map +1 -0
  127. package/dist/commands/split.d.ts +3 -0
  128. package/dist/commands/split.d.ts.map +1 -0
  129. package/dist/commands/split.js +177 -0
  130. package/dist/commands/split.js.map +1 -0
  131. package/dist/commands/stack.d.ts +3 -0
  132. package/dist/commands/stack.d.ts.map +1 -0
  133. package/dist/commands/stack.js +205 -0
  134. package/dist/commands/stack.js.map +1 -0
  135. package/dist/commands/stats.d.ts +3 -0
  136. package/dist/commands/stats.d.ts.map +1 -0
  137. package/dist/commands/stats.js +187 -0
  138. package/dist/commands/stats.js.map +1 -0
  139. package/dist/commands/thumbnail.d.ts +3 -0
  140. package/dist/commands/thumbnail.d.ts.map +1 -0
  141. package/dist/commands/thumbnail.js +131 -0
  142. package/dist/commands/thumbnail.js.map +1 -0
  143. package/dist/commands/tint.d.ts +3 -0
  144. package/dist/commands/tint.d.ts.map +1 -0
  145. package/dist/commands/tint.js +123 -0
  146. package/dist/commands/tint.js.map +1 -0
  147. package/dist/commands/trim.d.ts +3 -0
  148. package/dist/commands/trim.d.ts.map +1 -0
  149. package/dist/commands/trim.js +123 -0
  150. package/dist/commands/trim.js.map +1 -0
  151. package/dist/commands/vignette.d.ts +3 -0
  152. package/dist/commands/vignette.d.ts.map +1 -0
  153. package/dist/commands/vignette.js +139 -0
  154. package/dist/commands/vignette.js.map +1 -0
  155. package/dist/commands/watermark.d.ts +3 -0
  156. package/dist/commands/watermark.d.ts.map +1 -0
  157. package/dist/commands/watermark.js +172 -0
  158. package/dist/commands/watermark.js.map +1 -0
  159. package/dist/index.d.ts +3 -0
  160. package/dist/index.d.ts.map +1 -0
  161. package/dist/index.js +2 -0
  162. package/dist/index.js.map +1 -0
  163. package/dist/register.d.ts +5 -0
  164. package/dist/register.d.ts.map +1 -0
  165. package/dist/register.js +93 -0
  166. package/dist/register.js.map +1 -0
  167. package/dist/types.d.ts +91 -0
  168. package/dist/types.d.ts.map +1 -0
  169. package/dist/types.js +2 -0
  170. package/dist/types.js.map +1 -0
  171. package/dist/utils/helpFormatter.d.ts +63 -0
  172. package/dist/utils/helpFormatter.d.ts.map +1 -0
  173. package/dist/utils/helpFormatter.js +171 -0
  174. package/dist/utils/helpFormatter.js.map +1 -0
  175. package/dist/utils/sharp.d.ts +20 -0
  176. package/dist/utils/sharp.d.ts.map +1 -0
  177. package/dist/utils/sharp.js +14 -0
  178. package/dist/utils/sharp.js.map +1 -0
  179. package/package.json +55 -0
@@ -0,0 +1,151 @@
1
+ import chalk from 'chalk';
2
+ import ora from 'ora';
3
+ import path from 'path';
4
+ import fs from 'fs';
5
+ import { createSharpInstance } from '../utils/sharp.js';
6
+ import { createStandardHelp } from '../utils/helpFormatter.js';
7
+ export function modulateCommand(imageCmd) {
8
+ imageCmd
9
+ .command('modulate <input>')
10
+ .description('Adjust brightness, saturation, and hue')
11
+ .option('-b, --brightness <value>', 'Brightness multiplier (0.1-10, default: 1)', parseFloat, 1)
12
+ .option('-s, --saturation <value>', 'Saturation multiplier (0.1-10, default: 1)', parseFloat, 1)
13
+ .option('--hue <degrees>', 'Hue rotation in degrees (-360 to 360, default: 0)', parseInt, 0)
14
+ .option('-o, --output <path>', 'Output file path')
15
+ .option('-q, --quality <quality>', 'Quality (1-100)', parseInt, 90)
16
+ .option('--dry-run', 'Show what would be done without executing')
17
+ .option('-v, --verbose', 'Verbose output')
18
+ .option('--help', 'Display help for modulate command')
19
+ .action(async (input, options) => {
20
+ if (options.help) {
21
+ createStandardHelp({
22
+ commandName: 'modulate',
23
+ emoji: '🎚️',
24
+ description: 'Adjust brightness, saturation, and hue of images. Fine-tune colors and lighting for perfect image appearance.',
25
+ usage: ['modulate <input>', 'modulate <input> -b <brightness>', 'modulate <input> -b 1.2 -s 1.5 --hue 30'],
26
+ options: [
27
+ { flag: '-b, --brightness <value>', description: 'Brightness multiplier 0.1-10 (1 = no change, >1 = brighter, <1 = darker)' },
28
+ { flag: '-s, --saturation <value>', description: 'Saturation multiplier 0.1-10 (1 = no change, >1 = more vibrant, <1 = less vibrant)' },
29
+ { flag: '--hue <degrees>', description: 'Hue rotation -360 to 360 degrees (0 = no change)' },
30
+ { flag: '-o, --output <path>', description: 'Output file path (default: <input>-modulated.<ext>)' },
31
+ { flag: '-q, --quality <quality>', description: 'Output quality 1-100 (default: 90)' },
32
+ { flag: '--dry-run', description: 'Preview changes without executing' },
33
+ { flag: '-v, --verbose', description: 'Show detailed output' }
34
+ ],
35
+ examples: [
36
+ { command: 'modulate photo.jpg -b 1.2', description: 'Increase brightness by 20%' },
37
+ { command: 'modulate image.png -s 1.5', description: 'Boost saturation by 50%' },
38
+ { command: 'modulate pic.jpg --hue 180', description: 'Rotate hue by 180 degrees' },
39
+ { command: 'modulate photo.jpg -b 0.8 -s 1.3', description: 'Darker but more saturated' },
40
+ { command: 'modulate pic.jpg -b 1.2 -s 1.2 --hue 30', description: 'Adjust all three parameters' }
41
+ ],
42
+ additionalSections: [
43
+ {
44
+ title: 'Brightness Guide',
45
+ items: [
46
+ '0.5 - Much darker (50% brightness)',
47
+ '0.8 - Slightly darker',
48
+ '1.0 - No change (default)',
49
+ '1.2 - Slightly brighter',
50
+ '1.5 - Much brighter (150% brightness)',
51
+ '2.0 - Double brightness'
52
+ ]
53
+ },
54
+ {
55
+ title: 'Saturation Guide',
56
+ items: [
57
+ '0.0 - Completely desaturated (grayscale)',
58
+ '0.5 - Half saturation (muted colors)',
59
+ '1.0 - No change (default)',
60
+ '1.5 - 50% more vibrant',
61
+ '2.0 - Double saturation (very vivid)'
62
+ ]
63
+ },
64
+ {
65
+ title: 'Hue Rotation Effects',
66
+ items: [
67
+ '0° - No change',
68
+ '30° - Subtle color shift',
69
+ '60° - Noticeable shift',
70
+ '90° - Quarter rotation (e.g., blue → magenta)',
71
+ '180° - Opposite colors (e.g., blue → yellow)',
72
+ '360° - Full circle (back to original)'
73
+ ]
74
+ }
75
+ ],
76
+ tips: [
77
+ 'Start with small adjustments (±0.1-0.2)',
78
+ 'Brightness 1.2 and saturation 1.3 often work well together',
79
+ 'Use saturation 0 for grayscale effect',
80
+ 'Hue rotation creates artistic color effects'
81
+ ]
82
+ });
83
+ process.exit(0);
84
+ }
85
+ const spinner = ora('Processing image...').start();
86
+ try {
87
+ if (!fs.existsSync(input)) {
88
+ spinner.fail(chalk.red(`Input file not found: ${input}`));
89
+ process.exit(1);
90
+ }
91
+ const inputPath = path.parse(input);
92
+ const outputPath = options.output || path.join(process.cwd(), `${inputPath.name}-modulated${inputPath.ext}`);
93
+ if (options.verbose) {
94
+ spinner.info(chalk.blue('Configuration:'));
95
+ console.log(chalk.dim(` Input: ${input}`));
96
+ console.log(chalk.dim(` Output: ${outputPath}`));
97
+ console.log(chalk.dim(` Brightness: ${options.brightness || 1}`));
98
+ console.log(chalk.dim(` Saturation: ${options.saturation || 1}`));
99
+ console.log(chalk.dim(` Hue: ${options.hue || 0}°`));
100
+ spinner.start('Processing...');
101
+ }
102
+ if (options.dryRun) {
103
+ spinner.info(chalk.yellow('Dry run mode - no changes will be made'));
104
+ console.log(chalk.green('✓ Would modulate image:'));
105
+ console.log(chalk.dim(` From: ${input}`));
106
+ console.log(chalk.dim(` To: ${outputPath}`));
107
+ console.log(chalk.dim(` Brightness: ${options.brightness || 1}`));
108
+ console.log(chalk.dim(` Saturation: ${options.saturation || 1}`));
109
+ console.log(chalk.dim(` Hue: ${options.hue || 0}°`));
110
+ return;
111
+ }
112
+ const metadata = await createSharpInstance(input).metadata();
113
+ const pipeline = createSharpInstance(input).modulate({
114
+ brightness: options.brightness || 1,
115
+ saturation: options.saturation || 1,
116
+ hue: options.hue || 0
117
+ });
118
+ const outputExt = path.extname(outputPath).toLowerCase();
119
+ if (outputExt === '.jpg' || outputExt === '.jpeg') {
120
+ pipeline.jpeg({ quality: options.quality || 90 });
121
+ }
122
+ else if (outputExt === '.png') {
123
+ pipeline.png({ quality: options.quality || 90 });
124
+ }
125
+ else if (outputExt === '.webp') {
126
+ pipeline.webp({ quality: options.quality || 90 });
127
+ }
128
+ await pipeline.toFile(outputPath);
129
+ const outputStats = fs.statSync(outputPath);
130
+ spinner.succeed(chalk.green('✓ Image modulated successfully!'));
131
+ console.log(chalk.dim(` Input: ${input}`));
132
+ console.log(chalk.dim(` Output: ${outputPath}`));
133
+ console.log(chalk.dim(` Size: ${metadata.width}x${metadata.height}`));
134
+ console.log(chalk.dim(` Brightness: ${options.brightness || 1}x`));
135
+ console.log(chalk.dim(` Saturation: ${options.saturation || 1}x`));
136
+ console.log(chalk.dim(` Hue: ${options.hue || 0}°`));
137
+ console.log(chalk.dim(` File size: ${(outputStats.size / 1024).toFixed(2)}KB`));
138
+ }
139
+ catch (error) {
140
+ spinner.fail(chalk.red('Failed to modulate image'));
141
+ if (options.verbose) {
142
+ console.error(chalk.red('Error details:'), error);
143
+ }
144
+ else {
145
+ console.error(chalk.red(error.message));
146
+ }
147
+ process.exit(1);
148
+ }
149
+ });
150
+ }
151
+ //# sourceMappingURL=modulate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"modulate.js","sourceRoot":"","sources":["../../src/commands/modulate.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { Command } from 'commander';
2
+ export declare function negateCommand(imageCmd: Command): void;
3
+ //# sourceMappingURL=negate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"negate.d.ts","sourceRoot":"","sources":["../../src/commands/negate.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAczC,wBAAgB,aAAa,CAAC,QAAQ,EAAE,OAAO,GAAG,IAAI,CA8GrD"}
@@ -0,0 +1,111 @@
1
+ import chalk from 'chalk';
2
+ import ora from 'ora';
3
+ import path from 'path';
4
+ import fs from 'fs';
5
+ import { createSharpInstance } from '../utils/sharp.js';
6
+ import { createStandardHelp } from '../utils/helpFormatter.js';
7
+ export function negateCommand(imageCmd) {
8
+ imageCmd
9
+ .command('negate <input>')
10
+ .description('Create negative/inverted image')
11
+ .option('-o, --output <path>', 'Output file path')
12
+ .option('-q, --quality <quality>', 'Quality (1-100)', parseInt, 90)
13
+ .option('--alpha', 'Also negate alpha channel')
14
+ .option('--dry-run', 'Show what would be done without executing')
15
+ .option('-v, --verbose', 'Verbose output')
16
+ .option('--help', 'Display help for negate command')
17
+ .action(async (input, options) => {
18
+ if (options.help) {
19
+ createStandardHelp({
20
+ commandName: 'negate',
21
+ emoji: '🔄',
22
+ description: 'Create negative (inverted) image by reversing all colors. Perfect for artistic effects, X-ray style images, or creating unique visual styles.',
23
+ usage: ['negate <input>', 'negate <input> --alpha', 'negate <input> -o output.jpg'],
24
+ options: [
25
+ { flag: '-o, --output <path>', description: 'Output file path (default: <input>-negative.<ext>)' },
26
+ { flag: '-q, --quality <quality>', description: 'Output quality 1-100 (default: 90)' },
27
+ { flag: '--alpha', description: 'Also invert alpha/transparency channel' },
28
+ { flag: '--dry-run', description: 'Preview changes without executing' },
29
+ { flag: '-v, --verbose', description: 'Show detailed output' }
30
+ ],
31
+ examples: [
32
+ { command: 'negate photo.jpg', description: 'Create negative image' },
33
+ { command: 'negate image.png --alpha', description: 'Negate including alpha channel' },
34
+ { command: 'negate pic.jpg -o inverted.jpg', description: 'Negate with custom output' }
35
+ ],
36
+ additionalSections: [
37
+ {
38
+ title: 'Use Cases',
39
+ items: [
40
+ 'Artistic effects - Create unique visual styles',
41
+ 'X-ray style - Medical/technical aesthetic',
42
+ 'Film negatives - Traditional photo effect',
43
+ 'High contrast - Alternative viewing mode',
44
+ 'Dark mode - Invert for different theme'
45
+ ]
46
+ }
47
+ ],
48
+ tips: [
49
+ 'Negating twice returns to original image',
50
+ 'Works great for creating dark themes',
51
+ 'Combine with grayscale for classic negative look',
52
+ 'Use --alpha flag only if image has transparency'
53
+ ]
54
+ });
55
+ process.exit(0);
56
+ }
57
+ const spinner = ora('Processing image...').start();
58
+ try {
59
+ if (!fs.existsSync(input)) {
60
+ spinner.fail(chalk.red(`Input file not found: ${input}`));
61
+ process.exit(1);
62
+ }
63
+ const inputPath = path.parse(input);
64
+ const outputPath = options.output || path.join(process.cwd(), `${inputPath.name}-negative${inputPath.ext}`);
65
+ if (options.verbose) {
66
+ spinner.info(chalk.blue('Configuration:'));
67
+ console.log(chalk.dim(` Input: ${input}`));
68
+ console.log(chalk.dim(` Output: ${outputPath}`));
69
+ console.log(chalk.dim(` Negate alpha: ${options.alpha ? 'yes' : 'no'}`));
70
+ spinner.start('Processing...');
71
+ }
72
+ if (options.dryRun) {
73
+ spinner.info(chalk.yellow('Dry run mode - no changes will be made'));
74
+ console.log(chalk.green('✓ Would negate image:'));
75
+ console.log(chalk.dim(` From: ${input}`));
76
+ console.log(chalk.dim(` To: ${outputPath}`));
77
+ return;
78
+ }
79
+ const metadata = await createSharpInstance(input).metadata();
80
+ const pipeline = createSharpInstance(input).negate({ alpha: options.alpha || false });
81
+ const outputExt = path.extname(outputPath).toLowerCase();
82
+ if (outputExt === '.jpg' || outputExt === '.jpeg') {
83
+ pipeline.jpeg({ quality: options.quality || 90 });
84
+ }
85
+ else if (outputExt === '.png') {
86
+ pipeline.png({ quality: options.quality || 90 });
87
+ }
88
+ else if (outputExt === '.webp') {
89
+ pipeline.webp({ quality: options.quality || 90 });
90
+ }
91
+ await pipeline.toFile(outputPath);
92
+ const outputStats = fs.statSync(outputPath);
93
+ spinner.succeed(chalk.green('✓ Image negated successfully!'));
94
+ console.log(chalk.dim(` Input: ${input}`));
95
+ console.log(chalk.dim(` Output: ${outputPath}`));
96
+ console.log(chalk.dim(` Size: ${metadata.width}x${metadata.height}`));
97
+ console.log(chalk.dim(` File size: ${(outputStats.size / 1024).toFixed(2)}KB`));
98
+ }
99
+ catch (error) {
100
+ spinner.fail(chalk.red('Failed to negate image'));
101
+ if (options.verbose) {
102
+ console.error(chalk.red('Error details:'), error);
103
+ }
104
+ else {
105
+ console.error(chalk.red(error.message));
106
+ }
107
+ process.exit(1);
108
+ }
109
+ });
110
+ }
111
+ //# sourceMappingURL=negate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"negate.js","sourceRoot":"","sources":["../../src/commands/negate.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { Command } from 'commander';
2
+ export declare function normalizeCommand(imageCmd: Command): void;
3
+ //# sourceMappingURL=normalize.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"normalize.d.ts","sourceRoot":"","sources":["../../src/commands/normalize.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAazC,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,OAAO,GAAG,IAAI,CAsHxD"}
@@ -0,0 +1,119 @@
1
+ import chalk from 'chalk';
2
+ import ora from 'ora';
3
+ import path from 'path';
4
+ import fs from 'fs';
5
+ import { createSharpInstance } from '../utils/sharp.js';
6
+ import { createStandardHelp } from '../utils/helpFormatter.js';
7
+ export function normalizeCommand(imageCmd) {
8
+ imageCmd
9
+ .command('normalize <input>')
10
+ .description('Normalize image (enhance contrast)')
11
+ .option('-o, --output <path>', 'Output file path')
12
+ .option('-q, --quality <quality>', 'Quality (1-100)', parseInt, 90)
13
+ .option('--dry-run', 'Show what would be done without executing')
14
+ .option('-v, --verbose', 'Verbose output')
15
+ .option('--help', 'Display help for normalize command')
16
+ .action(async (input, options) => {
17
+ if (options.help) {
18
+ createStandardHelp({
19
+ commandName: 'normalize',
20
+ emoji: '📊',
21
+ description: 'Normalize image by enhancing contrast using histogram stretching. Automatically adjusts brightness and contrast for optimal image quality.',
22
+ usage: ['normalize <input>', 'normalize <input> -o output.jpg', 'normalize photo.jpg -q 95'],
23
+ options: [
24
+ { flag: '-o, --output <path>', description: 'Output file path (default: <input>-normalized.<ext>)' },
25
+ { flag: '-q, --quality <quality>', description: 'Output quality 1-100 (default: 90)' },
26
+ { flag: '--dry-run', description: 'Preview changes without executing' },
27
+ { flag: '-v, --verbose', description: 'Show detailed output' }
28
+ ],
29
+ examples: [
30
+ { command: 'normalize photo.jpg', description: 'Enhance contrast automatically' },
31
+ { command: 'normalize dark-image.png', description: 'Fix underexposed image' },
32
+ { command: 'normalize washed-out.jpg', description: 'Fix overexposed/washed out image' },
33
+ { command: 'normalize pic.jpg -q 95', description: 'Normalize with high quality' }
34
+ ],
35
+ additionalSections: [
36
+ {
37
+ title: 'How It Works',
38
+ items: [
39
+ 'Stretches histogram to use full dynamic range',
40
+ 'Enhances contrast by spreading pixel values',
41
+ 'Darkest pixels become black, brightest become white',
42
+ 'Improves visibility of details',
43
+ 'Non-destructive automatic adjustment'
44
+ ]
45
+ },
46
+ {
47
+ title: 'Best For',
48
+ items: [
49
+ 'Underexposed photos (too dark)',
50
+ 'Overexposed photos (too bright/washed out)',
51
+ 'Low contrast images (flat/dull)',
52
+ 'Scanned documents',
53
+ 'Images with poor lighting'
54
+ ]
55
+ }
56
+ ],
57
+ tips: [
58
+ 'Works best on images with poor exposure',
59
+ 'May not improve well-exposed images',
60
+ 'Great for batch processing old photos',
61
+ 'Combine with sharpen for best results'
62
+ ]
63
+ });
64
+ process.exit(0);
65
+ }
66
+ const spinner = ora('Processing image...').start();
67
+ try {
68
+ if (!fs.existsSync(input)) {
69
+ spinner.fail(chalk.red(`Input file not found: ${input}`));
70
+ process.exit(1);
71
+ }
72
+ const inputPath = path.parse(input);
73
+ const outputPath = options.output || path.join(process.cwd(), `${inputPath.name}-normalized${inputPath.ext}`);
74
+ if (options.verbose) {
75
+ spinner.info(chalk.blue('Configuration:'));
76
+ console.log(chalk.dim(` Input: ${input}`));
77
+ console.log(chalk.dim(` Output: ${outputPath}`));
78
+ spinner.start('Processing...');
79
+ }
80
+ if (options.dryRun) {
81
+ spinner.info(chalk.yellow('Dry run mode - no changes will be made'));
82
+ console.log(chalk.green('✓ Would normalize image:'));
83
+ console.log(chalk.dim(` From: ${input}`));
84
+ console.log(chalk.dim(` To: ${outputPath}`));
85
+ return;
86
+ }
87
+ const metadata = await createSharpInstance(input).metadata();
88
+ const pipeline = createSharpInstance(input).normalize();
89
+ const outputExt = path.extname(outputPath).toLowerCase();
90
+ if (outputExt === '.jpg' || outputExt === '.jpeg') {
91
+ pipeline.jpeg({ quality: options.quality || 90 });
92
+ }
93
+ else if (outputExt === '.png') {
94
+ pipeline.png({ quality: options.quality || 90 });
95
+ }
96
+ else if (outputExt === '.webp') {
97
+ pipeline.webp({ quality: options.quality || 90 });
98
+ }
99
+ await pipeline.toFile(outputPath);
100
+ const outputStats = fs.statSync(outputPath);
101
+ spinner.succeed(chalk.green('✓ Image normalized successfully!'));
102
+ console.log(chalk.dim(` Input: ${input}`));
103
+ console.log(chalk.dim(` Output: ${outputPath}`));
104
+ console.log(chalk.dim(` Size: ${metadata.width}x${metadata.height}`));
105
+ console.log(chalk.dim(` File size: ${(outputStats.size / 1024).toFixed(2)}KB`));
106
+ }
107
+ catch (error) {
108
+ spinner.fail(chalk.red('Failed to normalize image'));
109
+ if (options.verbose) {
110
+ console.error(chalk.red('Error details:'), error);
111
+ }
112
+ else {
113
+ console.error(chalk.red(error.message));
114
+ }
115
+ process.exit(1);
116
+ }
117
+ });
118
+ }
119
+ //# sourceMappingURL=normalize.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"normalize.js","sourceRoot":"","sources":["../../src/commands/normalize.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { Command } from 'commander';
2
+ export declare function optimizeCommand(imageCmd: Command): void;
3
+ //# sourceMappingURL=optimize.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"optimize.d.ts","sourceRoot":"","sources":["../../src/commands/optimize.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAczC,wBAAgB,eAAe,CAAC,QAAQ,EAAE,OAAO,GAAG,IAAI,CAyIvD"}
@@ -0,0 +1,137 @@
1
+ import chalk from 'chalk';
2
+ import ora from 'ora';
3
+ import path from 'path';
4
+ import fs from 'fs';
5
+ import { createSharpInstance } from '../utils/sharp.js';
6
+ import { createStandardHelp } from '../utils/helpFormatter.js';
7
+ export function optimizeCommand(imageCmd) {
8
+ imageCmd
9
+ .command('optimize <input>')
10
+ .description('Optimize image size without quality loss')
11
+ .option('-o, --output <path>', 'Output file path')
12
+ .option('-q, --quality <quality>', 'Quality (1-100, default: 85)', parseInt, 85)
13
+ .option('--aggressive', 'More aggressive compression (lower quality)')
14
+ .option('--dry-run', 'Show what would be done without executing')
15
+ .option('-v, --verbose', 'Verbose output')
16
+ .option('--help', 'Display help for optimize command')
17
+ .action(async (input, options) => {
18
+ if (options.help) {
19
+ createStandardHelp({
20
+ commandName: 'optimize',
21
+ emoji: '⚡',
22
+ description: 'Optimize image file size with minimal quality loss. Perfect for web optimization, faster loading times, and reduced storage.',
23
+ usage: ['optimize <input>', 'optimize <input> -q <quality>', 'optimize <input> --aggressive'],
24
+ options: [
25
+ { flag: '-o, --output <path>', description: 'Output file path (default: <input>-optimized.<ext>)' },
26
+ { flag: '-q, --quality <quality>', description: 'Quality 1-100 (default: 85)' },
27
+ { flag: '--aggressive', description: 'More aggressive compression (quality 70)' },
28
+ { flag: '--dry-run', description: 'Preview changes without executing' },
29
+ { flag: '-v, --verbose', description: 'Show detailed output' }
30
+ ],
31
+ examples: [
32
+ { command: 'optimize photo.jpg', description: 'Optimize with quality 85 (default)' },
33
+ { command: 'optimize image.png -q 90', description: 'Light optimization, high quality' },
34
+ { command: 'optimize pic.jpg --aggressive', description: 'Aggressive compression for maximum size reduction' },
35
+ { command: 'optimize photo.webp -q 80', description: 'Optimize WebP with custom quality' }
36
+ ],
37
+ additionalSections: [
38
+ {
39
+ title: 'Quality Guide',
40
+ items: [
41
+ 'Quality 90-100: Minimal compression, large files',
42
+ 'Quality 85-89: Balanced (recommended for web)',
43
+ 'Quality 70-84: Good compression, slight quality loss',
44
+ 'Quality 50-69: High compression, noticeable quality loss',
45
+ 'Aggressive mode: Uses quality 70 with max compression'
46
+ ]
47
+ },
48
+ {
49
+ title: 'Format Optimization',
50
+ items: [
51
+ 'JPG: Strips metadata, applies compression',
52
+ 'PNG: Max compression level, removes metadata',
53
+ 'WebP: Efficient modern compression',
54
+ 'All: Removes EXIF data to reduce size'
55
+ ]
56
+ }
57
+ ],
58
+ tips: [
59
+ 'Quality 85 offers best balance of size and quality',
60
+ 'Use --aggressive for thumbnails or previews',
61
+ 'Consider converting to WebP for even better compression',
62
+ 'Always keep original files before optimizing'
63
+ ]
64
+ });
65
+ process.exit(0);
66
+ }
67
+ const spinner = ora('Processing image...').start();
68
+ try {
69
+ if (!fs.existsSync(input)) {
70
+ spinner.fail(chalk.red(`Input file not found: ${input}`));
71
+ process.exit(1);
72
+ }
73
+ const inputPath = path.parse(input);
74
+ const outputPath = options.output || path.join(process.cwd(), `${inputPath.name}-optimized${inputPath.ext}`);
75
+ const quality = options.aggressive ? 70 : (options.quality || 85);
76
+ if (options.verbose) {
77
+ spinner.info(chalk.blue('Configuration:'));
78
+ console.log(chalk.dim(` Input: ${input}`));
79
+ console.log(chalk.dim(` Output: ${outputPath}`));
80
+ console.log(chalk.dim(` Quality: ${quality}`));
81
+ console.log(chalk.dim(` Mode: ${options.aggressive ? 'aggressive' : 'normal'}`));
82
+ spinner.start('Processing...');
83
+ }
84
+ if (options.dryRun) {
85
+ spinner.info(chalk.yellow('Dry run mode - no changes will be made'));
86
+ console.log(chalk.green('✓ Would optimize image:'));
87
+ console.log(chalk.dim(` From: ${input}`));
88
+ console.log(chalk.dim(` To: ${outputPath}`));
89
+ console.log(chalk.dim(` Quality: ${quality}`));
90
+ return;
91
+ }
92
+ const metadata = await createSharpInstance(input).metadata();
93
+ let pipeline = createSharpInstance(input);
94
+ // Strip metadata to reduce size
95
+ pipeline = pipeline.withMetadata({
96
+ orientation: metadata.orientation
97
+ });
98
+ // Apply format-specific optimization
99
+ const outputExt = path.extname(outputPath).toLowerCase();
100
+ if (outputExt === '.jpg' || outputExt === '.jpeg') {
101
+ pipeline.jpeg({ quality, progressive: true, mozjpeg: true });
102
+ }
103
+ else if (outputExt === '.png') {
104
+ pipeline.png({ quality, compressionLevel: 9, progressive: true, effort: 10 });
105
+ }
106
+ else if (outputExt === '.webp') {
107
+ pipeline.webp({ quality, effort: 6 });
108
+ }
109
+ else if (outputExt === '.avif') {
110
+ pipeline.avif({ quality, effort: 9 });
111
+ }
112
+ await pipeline.toFile(outputPath);
113
+ const inputStats = fs.statSync(input);
114
+ const outputStats = fs.statSync(outputPath);
115
+ const sizeDiff = ((outputStats.size - inputStats.size) / inputStats.size * 100).toFixed(2);
116
+ const saved = ((inputStats.size - outputStats.size) / 1024).toFixed(2);
117
+ spinner.succeed(chalk.green('✓ Image optimized successfully!'));
118
+ console.log(chalk.dim(` Input: ${input}`));
119
+ console.log(chalk.dim(` Output: ${outputPath}`));
120
+ console.log(chalk.dim(` Size: ${metadata.width}x${metadata.height}`));
121
+ console.log(chalk.dim(` Quality: ${quality}`));
122
+ console.log(chalk.dim(` File size: ${(inputStats.size / 1024).toFixed(2)}KB → ${(outputStats.size / 1024).toFixed(2)}KB`));
123
+ console.log(chalk.green(` Saved: ${saved}KB (${Math.abs(parseFloat(sizeDiff))}% reduction)`));
124
+ }
125
+ catch (error) {
126
+ spinner.fail(chalk.red('Failed to optimize image'));
127
+ if (options.verbose) {
128
+ console.error(chalk.red('Error details:'), error);
129
+ }
130
+ else {
131
+ console.error(chalk.red(error.message));
132
+ }
133
+ process.exit(1);
134
+ }
135
+ });
136
+ }
137
+ //# sourceMappingURL=optimize.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"optimize.js","sourceRoot":"","sources":["../../src/commands/optimize.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,MAAM,IAAI,CAAC;AAEpB,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAO/D,MAAM,UAAU,eAAe,CAAC,QAAiB;IAC/C,QAAQ;SACL,OAAO,CAAC,kBAAkB,CAAC;SAC3B,WAAW,CAAC,0CAA0C,CAAC;SACvD,MAAM,CAAC,qBAAqB,EAAE,kBAAkB,CAAC;SACjD,MAAM,CAAC,yBAAyB,EAAE,8BAA8B,EAAE,QAAQ,EAAE,EAAE,CAAC;SAC/E,MAAM,CAAC,cAAc,EAAE,6CAA6C,CAAC;SACrE,MAAM,CAAC,WAAW,EAAE,2CAA2C,CAAC;SAChE,MAAM,CAAC,eAAe,EAAE,gBAAgB,CAAC;SACzC,MAAM,CAAC,QAAQ,EAAE,mCAAmC,CAAC;SACrD,MAAM,CAAC,KAAK,EAAE,KAAa,EAAE,OAAwB,EAAE,EAAE;QACxD,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;YACjB,kBAAkB,CAAC;gBACjB,WAAW,EAAE,UAAU;gBACvB,KAAK,EAAE,GAAG;gBACV,WAAW,EAAE,8HAA8H;gBAC3I,KAAK,EAAE,CAAC,kBAAkB,EAAE,+BAA+B,EAAE,+BAA+B,CAAC;gBAC7F,OAAO,EAAE;oBACP,EAAE,IAAI,EAAE,qBAAqB,EAAE,WAAW,EAAE,qDAAqD,EAAE;oBACnG,EAAE,IAAI,EAAE,yBAAyB,EAAE,WAAW,EAAE,6BAA6B,EAAE;oBAC/E,EAAE,IAAI,EAAE,cAAc,EAAE,WAAW,EAAE,0CAA0C,EAAE;oBACjF,EAAE,IAAI,EAAE,WAAW,EAAE,WAAW,EAAE,mCAAmC,EAAE;oBACvE,EAAE,IAAI,EAAE,eAAe,EAAE,WAAW,EAAE,sBAAsB,EAAE;iBAC/D;gBACD,QAAQ,EAAE;oBACR,EAAE,OAAO,EAAE,oBAAoB,EAAE,WAAW,EAAE,oCAAoC,EAAE;oBACpF,EAAE,OAAO,EAAE,0BAA0B,EAAE,WAAW,EAAE,kCAAkC,EAAE;oBACxF,EAAE,OAAO,EAAE,+BAA+B,EAAE,WAAW,EAAE,mDAAmD,EAAE;oBAC9G,EAAE,OAAO,EAAE,2BAA2B,EAAE,WAAW,EAAE,mCAAmC,EAAE;iBAC3F;gBACD,kBAAkB,EAAE;oBAClB;wBACE,KAAK,EAAE,eAAe;wBACtB,KAAK,EAAE;4BACL,kDAAkD;4BAClD,+CAA+C;4BAC/C,sDAAsD;4BACtD,0DAA0D;4BAC1D,uDAAuD;yBACxD;qBACF;oBACD;wBACE,KAAK,EAAE,qBAAqB;wBAC5B,KAAK,EAAE;4BACL,2CAA2C;4BAC3C,8CAA8C;4BAC9C,oCAAoC;4BACpC,uCAAuC;yBACxC;qBACF;iBACF;gBACD,IAAI,EAAE;oBACJ,oDAAoD;oBACpD,6CAA6C;oBAC7C,yDAAyD;oBACzD,8CAA8C;iBAC/C;aACF,CAAC,CAAC;YACH,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,MAAM,OAAO,GAAG,GAAG,CAAC,qBAAqB,CAAC,CAAC,KAAK,EAAE,CAAC;QAEnD,IAAI,CAAC;YACH,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC1B,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,yBAAyB,KAAK,EAAE,CAAC,CAAC,CAAC;gBAC1D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;YAED,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YACpC,MAAM,UAAU,GAAG,OAAO,CAAC,MAAM,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,GAAG,SAAS,CAAC,IAAI,aAAa,SAAS,CAAC,GAAG,EAAE,CAAC,CAAC;YAE7G,MAAM,OAAO,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC;YAElE,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;gBACpB,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC;gBAC3C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,YAAY,KAAK,EAAE,CAAC,CAAC,CAAC;gBAC5C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,aAAa,UAAU,EAAE,CAAC,CAAC,CAAC;gBAClD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,cAAc,OAAO,EAAE,CAAC,CAAC,CAAC;gBAChD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,WAAW,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;gBAClF,OAAO,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;YACjC,CAAC;YAED,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;gBACnB,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,wCAAwC,CAAC,CAAC,CAAC;gBACrE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,yBAAyB,CAAC,CAAC,CAAC;gBACpD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,WAAW,KAAK,EAAE,CAAC,CAAC,CAAC;gBAC3C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,UAAU,EAAE,CAAC,CAAC,CAAC;gBAC9C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,cAAc,OAAO,EAAE,CAAC,CAAC,CAAC;gBAChD,OAAO;YACT,CAAC;YAED,MAAM,QAAQ,GAAG,MAAM,mBAAmB,CAAC,KAAK,CAAC,CAAC,QAAQ,EAAE,CAAC;YAC7D,IAAI,QAAQ,GAAG,mBAAmB,CAAC,KAAK,CAAC,CAAC;YAE1C,gCAAgC;YAChC,QAAQ,GAAG,QAAQ,CAAC,YAAY,CAAC;gBAC/B,WAAW,EAAE,QAAQ,CAAC,WAAW;aAClC,CAAC,CAAC;YAEH,qCAAqC;YACrC,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,WAAW,EAAE,CAAC;YACzD,IAAI,SAAS,KAAK,MAAM,IAAI,SAAS,KAAK,OAAO,EAAE,CAAC;gBAClD,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;YAC/D,CAAC;iBAAM,IAAI,SAAS,KAAK,MAAM,EAAE,CAAC;gBAChC,QAAQ,CAAC,GAAG,CAAC,EAAE,OAAO,EAAE,gBAAgB,EAAE,CAAC,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,CAAC;YAChF,CAAC;iBAAM,IAAI,SAAS,KAAK,OAAO,EAAE,CAAC;gBACjC,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC;YACxC,CAAC;iBAAM,IAAI,SAAS,KAAK,OAAO,EAAE,CAAC;gBACjC,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC;YACxC,CAAC;YAED,MAAM,QAAQ,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;YAElC,MAAM,UAAU,GAAG,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;YACtC,MAAM,WAAW,GAAG,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;YAC5C,MAAM,QAAQ,GAAG,CAAC,CAAC,WAAW,CAAC,IAAI,GAAG,UAAU,CAAC,IAAI,CAAC,GAAG,UAAU,CAAC,IAAI,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;YAC3F,MAAM,KAAK,GAAG,CAAC,CAAC,UAAU,CAAC,IAAI,GAAG,WAAW,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;YAEvE,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,iCAAiC,CAAC,CAAC,CAAC;YAChE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,YAAY,KAAK,EAAE,CAAC,CAAC,CAAC;YAC5C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,aAAa,UAAU,EAAE,CAAC,CAAC,CAAC;YAClD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,WAAW,QAAQ,CAAC,KAAK,IAAI,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;YACvE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,cAAc,OAAO,EAAE,CAAC,CAAC,CAAC;YAChD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,gBAAgB,CAAC,UAAU,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;YAC5H,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,YAAY,KAAK,OAAO,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC;QAEjG,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC,CAAC;YACpD,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;gBACpB,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,gBAAgB,CAAC,EAAE,KAAK,CAAC,CAAC;YACpD,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAE,KAAe,CAAC,OAAO,CAAC,CAAC,CAAC;YACrD,CAAC;YACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { Command } from 'commander';
2
+ export declare function paletteCommand(imageCmd: Command): void;
3
+ //# sourceMappingURL=palette.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"palette.d.ts","sourceRoot":"","sources":["../../src/commands/palette.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAezC,wBAAgB,cAAc,CAAC,QAAQ,EAAE,OAAO,GAAG,IAAI,CAoJtD"}