@mediaproc/image 1.3.6 → 1.4.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.
- package/README.md +4 -9
- package/dist/cli.js +9 -14
- package/dist/cli.js.map +1 -1
- package/dist/commands/affine.d.ts +1 -1
- package/dist/commands/affine.d.ts.map +1 -1
- package/dist/commands/affine.js +79 -84
- package/dist/commands/affine.js.map +1 -1
- package/dist/commands/auto-enhance.d.ts.map +1 -1
- package/dist/commands/auto-enhance.js +3 -7
- package/dist/commands/auto-enhance.js.map +1 -1
- package/dist/commands/auto-orient.d.ts.map +1 -1
- package/dist/commands/auto-orient.js +2 -6
- package/dist/commands/auto-orient.js.map +1 -1
- package/dist/commands/batch.d.ts.map +1 -1
- package/dist/commands/batch.js +8 -13
- package/dist/commands/batch.js.map +1 -1
- package/dist/commands/blur.d.ts.map +1 -1
- package/dist/commands/blur.js +37 -18
- package/dist/commands/blur.js.map +1 -1
- package/dist/commands/boolean.d.ts.map +1 -1
- package/dist/commands/boolean.js +25 -16
- package/dist/commands/boolean.js.map +1 -1
- package/dist/commands/border.d.ts.map +1 -1
- package/dist/commands/border.js +21 -14
- package/dist/commands/border.js.map +1 -1
- package/dist/commands/clahe.d.ts.map +1 -1
- package/dist/commands/clahe.js +27 -13
- package/dist/commands/clahe.js.map +1 -1
- package/dist/commands/composite.d.ts.map +1 -1
- package/dist/commands/composite.js +26 -11
- package/dist/commands/composite.js.map +1 -1
- package/dist/commands/compress.d.ts.map +1 -1
- package/dist/commands/compress.js +57 -37
- package/dist/commands/compress.js.map +1 -1
- package/dist/commands/convert.d.ts.map +1 -1
- package/dist/commands/convert.js +41 -21
- package/dist/commands/convert.js.map +1 -1
- package/dist/commands/convolve.d.ts.map +1 -1
- package/dist/commands/convolve.js +38 -16
- package/dist/commands/convolve.js.map +1 -1
- package/dist/commands/crop.d.ts.map +1 -1
- package/dist/commands/crop.js +9 -15
- package/dist/commands/crop.js.map +1 -1
- package/dist/commands/dilate.d.ts.map +1 -1
- package/dist/commands/dilate.js +9 -15
- package/dist/commands/dilate.js.map +1 -1
- package/dist/commands/dominant-color.d.ts.map +1 -1
- package/dist/commands/dominant-color.js +4 -11
- package/dist/commands/dominant-color.js.map +1 -1
- package/dist/commands/erode.d.ts.map +1 -1
- package/dist/commands/erode.js +24 -16
- package/dist/commands/erode.js.map +1 -1
- package/dist/commands/extend.d.ts.map +1 -1
- package/dist/commands/extend.js +9 -15
- package/dist/commands/extend.js.map +1 -1
- package/dist/commands/extract.d.ts.map +1 -1
- package/dist/commands/extract.js +23 -10
- package/dist/commands/extract.js.map +1 -1
- package/dist/commands/flatten.d.ts.map +1 -1
- package/dist/commands/flatten.js +36 -17
- package/dist/commands/flatten.js.map +1 -1
- package/dist/commands/flip.d.ts.map +1 -1
- package/dist/commands/flip.js +10 -16
- package/dist/commands/flip.js.map +1 -1
- package/dist/commands/flop.d.ts.map +1 -1
- package/dist/commands/flop.js +9 -15
- package/dist/commands/flop.js.map +1 -1
- package/dist/commands/gamma.d.ts.map +1 -1
- package/dist/commands/gamma.js +10 -16
- package/dist/commands/gamma.js.map +1 -1
- package/dist/commands/grayscale.d.ts.map +1 -1
- package/dist/commands/grayscale.js +10 -16
- package/dist/commands/grayscale.js.map +1 -1
- package/dist/commands/grid.d.ts.map +1 -1
- package/dist/commands/grid.js +45 -19
- package/dist/commands/grid.js.map +1 -1
- package/dist/commands/info.d.ts.map +1 -1
- package/dist/commands/info.js +4 -9
- package/dist/commands/info.js.map +1 -1
- package/dist/commands/linear.d.ts.map +1 -1
- package/dist/commands/linear.js +9 -14
- package/dist/commands/linear.js.map +1 -1
- package/dist/commands/median.d.ts.map +1 -1
- package/dist/commands/median.js +41 -20
- package/dist/commands/median.js.map +1 -1
- package/dist/commands/metadata-cmd.d.ts.map +1 -1
- package/dist/commands/metadata-cmd.js +4 -10
- package/dist/commands/metadata-cmd.js.map +1 -1
- package/dist/commands/mirror.d.ts.map +1 -1
- package/dist/commands/mirror.js +26 -11
- package/dist/commands/mirror.js.map +1 -1
- package/dist/commands/modulate.d.ts.map +1 -1
- package/dist/commands/modulate.js +10 -16
- package/dist/commands/modulate.js.map +1 -1
- package/dist/commands/negate.d.ts.map +1 -1
- package/dist/commands/negate.js +10 -16
- package/dist/commands/negate.js.map +1 -1
- package/dist/commands/normalize.d.ts.map +1 -1
- package/dist/commands/normalize.js +10 -16
- package/dist/commands/normalize.js.map +1 -1
- package/dist/commands/optimize.d.ts.map +1 -1
- package/dist/commands/optimize.js +62 -24
- package/dist/commands/optimize.js.map +1 -1
- package/dist/commands/palette.d.ts.map +1 -1
- package/dist/commands/palette.js +47 -18
- package/dist/commands/palette.js.map +1 -1
- package/dist/commands/pixelate.d.ts.map +1 -1
- package/dist/commands/pixelate.js +27 -18
- package/dist/commands/pixelate.js.map +1 -1
- package/dist/commands/recomb.d.ts.map +1 -1
- package/dist/commands/recomb.js +39 -19
- package/dist/commands/recomb.js.map +1 -1
- package/dist/commands/resize.d.ts.map +1 -1
- package/dist/commands/resize.js +32 -18
- package/dist/commands/resize.js.map +1 -1
- package/dist/commands/rotate.d.ts.map +1 -1
- package/dist/commands/rotate.js +40 -20
- package/dist/commands/rotate.js.map +1 -1
- package/dist/commands/sepia.d.ts.map +1 -1
- package/dist/commands/sepia.js +46 -13
- package/dist/commands/sepia.js.map +1 -1
- package/dist/commands/sharpen.d.ts.map +1 -1
- package/dist/commands/sharpen.js +39 -19
- package/dist/commands/sharpen.js.map +1 -1
- package/dist/commands/smart-crop.d.ts.map +1 -1
- package/dist/commands/smart-crop.js +4 -9
- package/dist/commands/smart-crop.js.map +1 -1
- package/dist/commands/split.d.ts.map +1 -1
- package/dist/commands/split.js +44 -13
- package/dist/commands/split.js.map +1 -1
- package/dist/commands/stack.d.ts.map +1 -1
- package/dist/commands/stack.js +48 -33
- package/dist/commands/stack.js.map +1 -1
- package/dist/commands/stats.d.ts.map +1 -1
- package/dist/commands/stats.js +4 -10
- package/dist/commands/stats.js.map +1 -1
- package/dist/commands/threshold.d.ts.map +1 -1
- package/dist/commands/threshold.js +21 -17
- package/dist/commands/threshold.js.map +1 -1
- package/dist/commands/thumbnail.d.ts.map +1 -1
- package/dist/commands/thumbnail.js +38 -19
- package/dist/commands/thumbnail.js.map +1 -1
- package/dist/commands/tint.d.ts.map +1 -1
- package/dist/commands/tint.js +37 -19
- package/dist/commands/tint.js.map +1 -1
- package/dist/commands/trim.d.ts.map +1 -1
- package/dist/commands/trim.js +22 -18
- package/dist/commands/trim.js.map +1 -1
- package/dist/commands/unflatten.d.ts.map +1 -1
- package/dist/commands/unflatten.js +23 -19
- package/dist/commands/unflatten.js.map +1 -1
- package/dist/commands/vignette.d.ts.map +1 -1
- package/dist/commands/vignette.js +30 -13
- package/dist/commands/vignette.js.map +1 -1
- package/dist/commands/watermark.d.ts.map +1 -1
- package/dist/commands/watermark.js +34 -17
- package/dist/commands/watermark.js.map +1 -1
- package/dist/register.d.ts +1 -1
- package/dist/register.d.ts.map +1 -1
- package/dist/register.js +3 -12
- package/dist/register.js.map +1 -1
- package/dist/utils/colorUtils.js +1 -1
- package/dist/utils/colorUtils.js.map +1 -1
- package/package.json +2 -2
package/dist/commands/erode.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import chalk from 'chalk';
|
|
2
2
|
import ora from 'ora';
|
|
3
|
-
import { validatePaths, resolveOutputPaths, IMAGE_EXTENSIONS, getFileName, createStandardHelp
|
|
3
|
+
import { validatePaths, resolveOutputPaths, IMAGE_EXTENSIONS, getFileName, createStandardHelp } from '@mediaproc/core';
|
|
4
4
|
import { createSharpInstance } from '../utils/sharp.js';
|
|
5
5
|
import path from 'node:path';
|
|
6
6
|
export function erodeCommand(imageCmd) {
|
|
@@ -8,9 +8,9 @@ export function erodeCommand(imageCmd) {
|
|
|
8
8
|
.command('erode <input>')
|
|
9
9
|
.description('Erode image (expand dark regions)')
|
|
10
10
|
.option('-o, --output <path>', 'Output file path')
|
|
11
|
-
.option('-q, --quality <quality>', 'Quality (1-100)', parseInt
|
|
11
|
+
.option('-q, --quality <quality>', 'Quality (1-100)', parseInt)
|
|
12
12
|
.option('--dry-run', 'Show what would be done without executing')
|
|
13
|
-
.option('--explain', '
|
|
13
|
+
.option('--explain [mode]', 'Show a detailed explanation of what this command will do, including technical and human-readable output. Modes: human, details, json. Adds context like timestamp, user, and platform.')
|
|
14
14
|
.option('-v, --verbose', 'Verbose output');
|
|
15
15
|
cmd.addHelpText('after', () => {
|
|
16
16
|
return '\n' +
|
|
@@ -23,7 +23,7 @@ export function erodeCommand(imageCmd) {
|
|
|
23
23
|
{ flag: '-o, --output <path>', description: 'Output file path (default: <input>-eroded.<ext>)' },
|
|
24
24
|
{ flag: '-q, --quality <quality>', description: 'Output quality 1-100 (default: 90)' },
|
|
25
25
|
{ flag: '--dry-run', description: 'Preview changes without executing' },
|
|
26
|
-
{ flag: '--explain', description: '
|
|
26
|
+
{ flag: '--explain [mode]', description: 'Show a detailed explanation of what this command will do, including technical and human-readable output. Modes: human, details, json. Adds context like timestamp, user, and platform.' },
|
|
27
27
|
{ flag: '-v, --verbose', description: 'Show detailed output' }
|
|
28
28
|
],
|
|
29
29
|
examples: [
|
|
@@ -102,7 +102,7 @@ export function erodeCommand(imageCmd) {
|
|
|
102
102
|
if (options.verbose) {
|
|
103
103
|
console.log(chalk.blue('\nConfiguration:'));
|
|
104
104
|
console.log(chalk.dim(` Operation: Morphological erosion (3x3 kernel)`));
|
|
105
|
-
console.log(chalk.dim(` Quality: ${options.quality
|
|
105
|
+
console.log(chalk.dim(` Quality: ${options.quality}`));
|
|
106
106
|
}
|
|
107
107
|
if (options.dryRun) {
|
|
108
108
|
console.log(chalk.yellow('\nDry run mode - no changes will be made\n'));
|
|
@@ -111,13 +111,8 @@ export function erodeCommand(imageCmd) {
|
|
|
111
111
|
const outputPath = outputPaths.get(inputFile);
|
|
112
112
|
console.log(chalk.dim(` ${index + 1}. ${getFileName(inputFile)} → ${getFileName(outputPath)}`));
|
|
113
113
|
});
|
|
114
|
-
showPluginBranding('Image', '../../package.json');
|
|
115
114
|
return;
|
|
116
115
|
}
|
|
117
|
-
if (options.explain) {
|
|
118
|
-
console.log(chalk.gray('Explain mode is not yet available.'));
|
|
119
|
-
console.log(chalk.cyan('Planned for v0.8.x.'));
|
|
120
|
-
}
|
|
121
116
|
let successCount = 0;
|
|
122
117
|
let failCount = 0;
|
|
123
118
|
// Erosion kernel (3x3 matrix)
|
|
@@ -133,15 +128,29 @@ export function erodeCommand(imageCmd) {
|
|
|
133
128
|
try {
|
|
134
129
|
const pipeline = createSharpInstance(inputFile).convolve(erodeKernel);
|
|
135
130
|
const outputExt = path.extname(outputPath).toLowerCase();
|
|
131
|
+
const quality = typeof options.quality === 'number' ? options.quality : 90;
|
|
136
132
|
if (outputExt === '.jpg' || outputExt === '.jpeg') {
|
|
137
|
-
pipeline.jpeg({ quality
|
|
138
|
-
}
|
|
139
|
-
else if (outputExt === '.png') {
|
|
140
|
-
pipeline.png({ quality: options.quality || 90 });
|
|
133
|
+
pipeline.jpeg({ quality });
|
|
141
134
|
}
|
|
142
135
|
else if (outputExt === '.webp') {
|
|
143
|
-
pipeline.webp({ quality
|
|
136
|
+
pipeline.webp({ quality });
|
|
137
|
+
}
|
|
138
|
+
else if (outputExt === '.avif') {
|
|
139
|
+
pipeline.avif({ quality });
|
|
140
|
+
}
|
|
141
|
+
else if (outputExt === '.png') {
|
|
142
|
+
// PNG uses compressionLevel (0-9), map quality 1-100 to 9-0
|
|
143
|
+
let compressionLevel = 6;
|
|
144
|
+
if (typeof options.quality === 'number') {
|
|
145
|
+
compressionLevel = Math.round(9 - (quality / 100) * 9);
|
|
146
|
+
if (compressionLevel < 0)
|
|
147
|
+
compressionLevel = 0;
|
|
148
|
+
if (compressionLevel > 9)
|
|
149
|
+
compressionLevel = 9;
|
|
150
|
+
}
|
|
151
|
+
pipeline.png({ compressionLevel });
|
|
144
152
|
}
|
|
153
|
+
// For other formats, do not set quality
|
|
145
154
|
await pipeline.toFile(outputPath);
|
|
146
155
|
spinner.succeed(chalk.green(`✓ ${fileName} processed`));
|
|
147
156
|
successCount++;
|
|
@@ -159,7 +168,6 @@ export function erodeCommand(imageCmd) {
|
|
|
159
168
|
if (failCount > 0) {
|
|
160
169
|
console.log(chalk.red(` ✗ Failed: ${failCount}`));
|
|
161
170
|
}
|
|
162
|
-
showPluginBranding('Image', '../../package.json');
|
|
163
171
|
}
|
|
164
172
|
catch (error) {
|
|
165
173
|
spinner.fail(chalk.red('Failed to apply erosion'));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"erode.js","sourceRoot":"","sources":["../../src/commands/erode.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,GAAG,MAAM,KAAK,CAAC;AAEtB,OAAO,EAAE,aAAa,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,WAAW,EAAE,kBAAkB,EAAE,
|
|
1
|
+
{"version":3,"file":"erode.js","sourceRoot":"","sources":["../../src/commands/erode.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"extend.d.ts","sourceRoot":"","sources":["../../src/commands/extend.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAkBzC,wBAAgB,aAAa,CAAC,QAAQ,EAAE,OAAO,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"extend.d.ts","sourceRoot":"","sources":["../../src/commands/extend.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAkBzC,wBAAgB,aAAa,CAAC,QAAQ,EAAE,OAAO,GAAG,IAAI,CA+KrD"}
|
package/dist/commands/extend.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import chalk from 'chalk';
|
|
2
2
|
import ora from 'ora';
|
|
3
|
-
import { validatePaths, resolveOutputPaths, IMAGE_EXTENSIONS, getFileName, createStandardHelp
|
|
3
|
+
import { validatePaths, resolveOutputPaths, IMAGE_EXTENSIONS, getFileName, createStandardHelp } from '@mediaproc/core';
|
|
4
4
|
import { createSharpInstance } from '../utils/sharp.js';
|
|
5
5
|
import path from 'node:path';
|
|
6
6
|
export function extendCommand(imageCmd) {
|
|
@@ -14,13 +14,13 @@ export function extendCommand(imageCmd) {
|
|
|
14
14
|
.option('--all <pixels>', 'All sides padding in pixels', parseInt)
|
|
15
15
|
.option('--background <color>', 'Background color (default: white)', 'white')
|
|
16
16
|
.option('-o, --output <path>', 'Output file path')
|
|
17
|
-
.option('-q, --quality <quality>', 'Quality (1-100)', parseInt
|
|
17
|
+
.option('-q, --quality <quality>', 'Quality (1-100)', parseInt)
|
|
18
18
|
.option('--dry-run', 'Show what would be done without executing')
|
|
19
19
|
.option('-v, --verbose', 'Verbose output')
|
|
20
|
-
.option('--explain', '
|
|
20
|
+
.option('--explain [mode]', 'Show a detailed explanation of what this command will do, including technical and human-readable output. Modes: human, details, json. Adds context like timestamp, user, and platform.')
|
|
21
21
|
.option('--help', 'Display help for extend command')
|
|
22
22
|
.action(async (input, options) => {
|
|
23
|
-
if (options.help) {
|
|
23
|
+
if (options.help || !input) {
|
|
24
24
|
createStandardHelp({
|
|
25
25
|
commandName: 'extend',
|
|
26
26
|
emoji: '🖼️',
|
|
@@ -34,9 +34,9 @@ export function extendCommand(imageCmd) {
|
|
|
34
34
|
{ flag: '--right <pixels>', description: 'Right padding in pixels' },
|
|
35
35
|
{ flag: '--background <color>', description: 'Background color (default: white, accepts hex/rgb/names)' },
|
|
36
36
|
{ flag: '-o, --output <path>', description: 'Output file path (default: <input>-extended.<ext>)' },
|
|
37
|
-
{ flag: '-q, --quality <quality>', description: 'Output quality 1-100 (
|
|
37
|
+
{ flag: '-q, --quality <quality>', description: 'Output quality (1-100). Optional. Applies to JPEG/WEBP/AVIF. For PNG, maps to compression level (higher quality = lower compression). Ignored for other formats.' },
|
|
38
38
|
{ flag: '--dry-run', description: 'Preview changes without executing' },
|
|
39
|
-
{ flag: '--explain', description: '
|
|
39
|
+
{ flag: '--explain [mode]', description: 'Show a detailed explanation of what this command will do, including technical and human-readable output. Modes: human, details, json. Adds context like timestamp, user, and platform.' },
|
|
40
40
|
{ flag: '-v, --verbose', description: 'Show detailed output' }
|
|
41
41
|
],
|
|
42
42
|
examples: [
|
|
@@ -110,13 +110,8 @@ export function extendCommand(imageCmd) {
|
|
|
110
110
|
const outputPath = outputPaths.get(inputFile);
|
|
111
111
|
console.log(chalk.dim(` ${index + 1}. ${getFileName(inputFile)} → ${getFileName(outputPath)}`));
|
|
112
112
|
});
|
|
113
|
-
showPluginBranding('Image', '../../package.json');
|
|
114
113
|
return;
|
|
115
114
|
}
|
|
116
|
-
if (options.explain) {
|
|
117
|
-
console.log(chalk.gray('Explain mode is not yet available.'));
|
|
118
|
-
console.log(chalk.cyan('Planned for v0.8.x.'));
|
|
119
|
-
}
|
|
120
115
|
let successCount = 0;
|
|
121
116
|
let failCount = 0;
|
|
122
117
|
for (const [index, inputFile] of inputFiles.entries()) {
|
|
@@ -133,13 +128,13 @@ export function extendCommand(imageCmd) {
|
|
|
133
128
|
});
|
|
134
129
|
const outputExt = path.extname(outputPath).toLowerCase();
|
|
135
130
|
if (outputExt === '.jpg' || outputExt === '.jpeg') {
|
|
136
|
-
pipeline.jpeg({ quality: options.quality
|
|
131
|
+
pipeline.jpeg({ quality: options.quality });
|
|
137
132
|
}
|
|
138
133
|
else if (outputExt === '.png') {
|
|
139
|
-
pipeline.png({ quality: options.quality
|
|
134
|
+
pipeline.png({ quality: options.quality });
|
|
140
135
|
}
|
|
141
136
|
else if (outputExt === '.webp') {
|
|
142
|
-
pipeline.webp({ quality: options.quality
|
|
137
|
+
pipeline.webp({ quality: options.quality });
|
|
143
138
|
}
|
|
144
139
|
await pipeline.toFile(outputPath);
|
|
145
140
|
spinner.succeed(chalk.green(`✓ ${fileName} extended`));
|
|
@@ -158,7 +153,6 @@ export function extendCommand(imageCmd) {
|
|
|
158
153
|
if (failCount > 0) {
|
|
159
154
|
console.log(chalk.red(` ✗ Failed: ${failCount}`));
|
|
160
155
|
}
|
|
161
|
-
showPluginBranding('Image', '../../package.json');
|
|
162
156
|
}
|
|
163
157
|
catch (error) {
|
|
164
158
|
spinner.fail(chalk.red('Processing failed'));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"extend.js","sourceRoot":"","sources":["../../src/commands/extend.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,GAAG,MAAM,KAAK,CAAC;AAEtB,OAAO,EAAE,aAAa,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,WAAW,EAAE,kBAAkB,EAAE,
|
|
1
|
+
{"version":3,"file":"extend.js","sourceRoot":"","sources":["../../src/commands/extend.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"extract.d.ts","sourceRoot":"","sources":["../../src/commands/extract.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"extract.d.ts","sourceRoot":"","sources":["../../src/commands/extract.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAazC,wBAAgB,cAAc,CAAC,QAAQ,EAAE,OAAO,GAAG,IAAI,CAsNtD"}
|
package/dist/commands/extract.js
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import chalk from 'chalk';
|
|
2
2
|
import ora from 'ora';
|
|
3
|
-
import { validatePaths, resolveOutputPaths, IMAGE_EXTENSIONS, getFileName, createStandardHelp
|
|
3
|
+
import { validatePaths, resolveOutputPaths, IMAGE_EXTENSIONS, getFileName, createStandardHelp } from '@mediaproc/core';
|
|
4
4
|
import { createSharpInstance } from '../utils/sharp.js';
|
|
5
|
+
import path from 'node:path';
|
|
5
6
|
export function extractCommand(imageCmd) {
|
|
6
7
|
imageCmd
|
|
7
8
|
.command('extract <input>')
|
|
@@ -12,12 +13,13 @@ export function extractCommand(imageCmd) {
|
|
|
12
13
|
.option('-w, --width <pixels>', 'Width for region extraction', parseInt)
|
|
13
14
|
.option('-h, --height <pixels>', 'Height for region extraction', parseInt)
|
|
14
15
|
.option('-o, --output <path>', 'Output file path')
|
|
16
|
+
.option('-q, --quality <quality>', 'Quality (1-100)', parseInt)
|
|
15
17
|
.option('--dry-run', 'Show what would be done without executing')
|
|
16
18
|
.option('-v, --verbose', 'Verbose output')
|
|
17
|
-
.option('--explain', '
|
|
19
|
+
.option('--explain [mode]', 'Show a detailed explanation of what this command will do, including technical and human-readable output. Modes: human, details, json. Adds context like timestamp, user, and platform.')
|
|
18
20
|
.option('--help', 'Display help for extract command')
|
|
19
21
|
.action(async (input, options) => {
|
|
20
|
-
if (options.help) {
|
|
22
|
+
if (options.help || !input) {
|
|
21
23
|
createStandardHelp({
|
|
22
24
|
commandName: 'extract',
|
|
23
25
|
emoji: '✂️',
|
|
@@ -31,7 +33,8 @@ export function extractCommand(imageCmd) {
|
|
|
31
33
|
{ flag: '-h, --height <pixels>', description: 'Height for region extraction' },
|
|
32
34
|
{ flag: '-o, --output <path>', description: 'Output file path' },
|
|
33
35
|
{ flag: '--dry-run', description: 'Preview changes without executing' },
|
|
34
|
-
{ flag: '--
|
|
36
|
+
{ flag: '-q, --quality <quality>', description: 'Output quality (1-100). Optional. Applies to JPEG/WEBP/AVIF. For PNG, maps to compression level (higher quality = lower compression). Ignored for other formats.' },
|
|
37
|
+
{ flag: '--explain [mode]', description: 'Show a detailed explanation of what this command will do, including technical and human-readable output. Modes: human, details, json. Adds context like timestamp, user, and platform.' },
|
|
35
38
|
{ flag: '-v, --verbose', description: 'Show detailed output' }
|
|
36
39
|
],
|
|
37
40
|
examples: [
|
|
@@ -111,13 +114,8 @@ export function extractCommand(imageCmd) {
|
|
|
111
114
|
else {
|
|
112
115
|
console.log(chalk.dim(` Region: ${options.left},${options.top} ${options.width}x${options.height}`));
|
|
113
116
|
}
|
|
114
|
-
showPluginBranding('Image', '../../package.json');
|
|
115
117
|
return;
|
|
116
118
|
}
|
|
117
|
-
if (options.explain) {
|
|
118
|
-
console.log(chalk.gray('Explain mode is not yet available.'));
|
|
119
|
-
console.log(chalk.cyan('Planned for v0.8.x.'));
|
|
120
|
-
}
|
|
121
119
|
// Validate channel or region options once before processing
|
|
122
120
|
if (options.channel) {
|
|
123
121
|
const channelMap = {
|
|
@@ -167,6 +165,22 @@ export function extractCommand(imageCmd) {
|
|
|
167
165
|
height: options.height
|
|
168
166
|
});
|
|
169
167
|
}
|
|
168
|
+
const outputExt = path.extname(outputPath).toLowerCase();
|
|
169
|
+
if (options.quality !== undefined) {
|
|
170
|
+
if (outputExt === '.jpg' || outputExt === '.jpeg') {
|
|
171
|
+
pipeline = pipeline.jpeg({ quality: options.quality });
|
|
172
|
+
}
|
|
173
|
+
else if (outputExt === '.webp') {
|
|
174
|
+
pipeline = pipeline.webp({ quality: options.quality });
|
|
175
|
+
}
|
|
176
|
+
else if (outputExt === '.avif') {
|
|
177
|
+
pipeline = pipeline.avif({ quality: options.quality });
|
|
178
|
+
}
|
|
179
|
+
else if (outputExt === '.png') {
|
|
180
|
+
pipeline = pipeline.png({ compressionLevel: options.quality });
|
|
181
|
+
}
|
|
182
|
+
// Ignore for other formats
|
|
183
|
+
}
|
|
170
184
|
await pipeline.toFile(outputPath);
|
|
171
185
|
spinner.succeed(chalk.green(`✓ ${fileName} extracted`));
|
|
172
186
|
successCount++;
|
|
@@ -184,7 +198,6 @@ export function extractCommand(imageCmd) {
|
|
|
184
198
|
if (failCount > 0) {
|
|
185
199
|
console.log(chalk.red(` ✗ Failed: ${failCount}`));
|
|
186
200
|
}
|
|
187
|
-
showPluginBranding('Image', '../../package.json');
|
|
188
201
|
}
|
|
189
202
|
catch (error) {
|
|
190
203
|
spinner.fail(chalk.red('Processing failed'));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"extract.js","sourceRoot":"","sources":["../../src/commands/extract.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,GAAG,MAAM,KAAK,CAAC;AAEtB,OAAO,EAAE,aAAa,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,WAAW,EAAE,kBAAkB,EAAE,
|
|
1
|
+
{"version":3,"file":"extract.js","sourceRoot":"","sources":["../../src/commands/extract.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"flatten.d.ts","sourceRoot":"","sources":["../../src/commands/flatten.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAazC,wBAAgB,cAAc,CAAC,QAAQ,EAAE,OAAO,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"flatten.d.ts","sourceRoot":"","sources":["../../src/commands/flatten.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAazC,wBAAgB,cAAc,CAAC,QAAQ,EAAE,OAAO,GAAG,IAAI,CAwLtD"}
|
package/dist/commands/flatten.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import chalk from 'chalk';
|
|
2
2
|
import ora from 'ora';
|
|
3
|
-
import { validatePaths, resolveOutputPaths, IMAGE_EXTENSIONS, getFileName,
|
|
3
|
+
import { validatePaths, resolveOutputPaths, IMAGE_EXTENSIONS, getFileName, createStandardHelp } from '@mediaproc/core';
|
|
4
4
|
import { createSharpInstance } from '../utils/sharp.js';
|
|
5
5
|
import path from 'node:path';
|
|
6
6
|
export function flattenCommand(imageCmd) {
|
|
@@ -9,9 +9,9 @@ export function flattenCommand(imageCmd) {
|
|
|
9
9
|
.description('Flatten alpha transparency onto background color')
|
|
10
10
|
.option('--background <color>', 'Background color as hex (default: #ffffff)', '#ffffff')
|
|
11
11
|
.option('-o, --output <path>', 'Output file path')
|
|
12
|
-
.option('-q, --quality <quality>', 'Quality (1-100)', parseInt
|
|
12
|
+
.option('-q, --quality <quality>', 'Quality (1-100)', parseInt)
|
|
13
13
|
.option('--dry-run', 'Show what would be done without executing')
|
|
14
|
-
.option('--explain', '
|
|
14
|
+
.option('--explain [mode]', 'Show a detailed explanation of what this command will do, including technical and human-readable output. Modes: human, details, json. Adds context like timestamp, user, and platform.')
|
|
15
15
|
.option('-v, --verbose', 'Verbose output');
|
|
16
16
|
cmd.addHelpText('after', () => {
|
|
17
17
|
return '\n' + createStandardHelp({
|
|
@@ -22,9 +22,9 @@ export function flattenCommand(imageCmd) {
|
|
|
22
22
|
options: [
|
|
23
23
|
{ flag: '--background <color>', description: 'Background color as hex (default: #ffffff white)' },
|
|
24
24
|
{ flag: '-o, --output <path>', description: 'Output file path (default: <input>-flat.<ext>)' },
|
|
25
|
-
{ flag: '-q, --quality <quality>', description: 'Output quality 1-100 (
|
|
25
|
+
{ flag: '-q, --quality <quality>', description: 'Output quality 1-100 (optional, only applies to JPEG, WEBP, AVIF; for PNG, mapped to compression level)' },
|
|
26
26
|
{ flag: '--dry-run', description: 'Preview changes without executing' },
|
|
27
|
-
{ flag: '--explain', description: '
|
|
27
|
+
{ flag: '--explain [mode]', description: 'Show a detailed explanation of what this command will do, including technical and human-readable output. Modes: human, details, json. Adds context like timestamp, user, and platform.' },
|
|
28
28
|
{ flag: '-v, --verbose', description: 'Show detailed output' }
|
|
29
29
|
],
|
|
30
30
|
examples: [
|
|
@@ -94,7 +94,9 @@ export function flattenCommand(imageCmd) {
|
|
|
94
94
|
if (options.verbose) {
|
|
95
95
|
console.log(chalk.blue('\nConfiguration:'));
|
|
96
96
|
console.log(chalk.dim(` Background: ${bgColor} (R:${r}, G:${g}, B:${b})`));
|
|
97
|
-
|
|
97
|
+
if (typeof options.quality !== 'undefined') {
|
|
98
|
+
console.log(chalk.dim(` Quality: ${options.quality}`));
|
|
99
|
+
}
|
|
98
100
|
}
|
|
99
101
|
if (options.dryRun) {
|
|
100
102
|
console.log(chalk.yellow('\nDry run mode - no changes will be made\n'));
|
|
@@ -103,13 +105,8 @@ export function flattenCommand(imageCmd) {
|
|
|
103
105
|
const outputPath = outputPaths.get(inputFile);
|
|
104
106
|
console.log(chalk.dim(` ${index + 1}. ${getFileName(inputFile)} → ${getFileName(outputPath)}`));
|
|
105
107
|
});
|
|
106
|
-
showPluginBranding('Image', '../../package.json');
|
|
107
108
|
return;
|
|
108
109
|
}
|
|
109
|
-
if (options.explain) {
|
|
110
|
-
console.log(chalk.gray('Explain mode is not yet available.'));
|
|
111
|
-
console.log(chalk.cyan('Planned for v0.8.x.'));
|
|
112
|
-
}
|
|
113
110
|
let successCount = 0;
|
|
114
111
|
let failCount = 0;
|
|
115
112
|
for (const [index, inputFile] of inputFiles.entries()) {
|
|
@@ -122,14 +119,37 @@ export function flattenCommand(imageCmd) {
|
|
|
122
119
|
});
|
|
123
120
|
const outputExt = path.extname(outputPath).toLowerCase();
|
|
124
121
|
if (outputExt === '.jpg' || outputExt === '.jpeg') {
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
122
|
+
if (typeof options.quality === 'number') {
|
|
123
|
+
pipeline.jpeg({ quality: options.quality });
|
|
124
|
+
}
|
|
125
|
+
else {
|
|
126
|
+
pipeline.jpeg();
|
|
127
|
+
}
|
|
129
128
|
}
|
|
130
129
|
else if (outputExt === '.webp') {
|
|
131
|
-
|
|
130
|
+
if (typeof options.quality === 'number') {
|
|
131
|
+
pipeline.webp({ quality: options.quality });
|
|
132
|
+
}
|
|
133
|
+
else {
|
|
134
|
+
pipeline.webp();
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
else if (outputExt === '.avif') {
|
|
138
|
+
if (typeof options.quality === 'number') {
|
|
139
|
+
pipeline.avif({ quality: options.quality });
|
|
140
|
+
}
|
|
141
|
+
else {
|
|
142
|
+
pipeline.avif();
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
else if (outputExt === '.png') {
|
|
146
|
+
let compressionLevel = 9;
|
|
147
|
+
if (typeof options.quality === 'number') {
|
|
148
|
+
compressionLevel = Math.round((100 - Math.max(1, Math.min(100, options.quality))) * 9 / 99);
|
|
149
|
+
}
|
|
150
|
+
pipeline.png({ compressionLevel });
|
|
132
151
|
}
|
|
152
|
+
// For other formats, do not set quality
|
|
133
153
|
await pipeline.toFile(outputPath);
|
|
134
154
|
spinner.succeed(chalk.green(`✓ ${fileName} processed`));
|
|
135
155
|
successCount++;
|
|
@@ -147,7 +167,6 @@ export function flattenCommand(imageCmd) {
|
|
|
147
167
|
if (failCount > 0) {
|
|
148
168
|
console.log(chalk.red(` ✗ Failed: ${failCount}`));
|
|
149
169
|
}
|
|
150
|
-
showPluginBranding('Image', '../../package.json');
|
|
151
170
|
}
|
|
152
171
|
catch (error) {
|
|
153
172
|
spinner.fail(chalk.red('Failed to flatten image'));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"flatten.js","sourceRoot":"","sources":["../../src/commands/flatten.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,GAAG,MAAM,KAAK,CAAC;AAEtB,OAAO,EAAE,aAAa,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,WAAW,EAAE,kBAAkB,EAAE,
|
|
1
|
+
{"version":3,"file":"flatten.js","sourceRoot":"","sources":["../../src/commands/flatten.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"flip.d.ts","sourceRoot":"","sources":["../../src/commands/flip.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAgBzC,wBAAgB,WAAW,CAAC,QAAQ,EAAE,OAAO,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"flip.d.ts","sourceRoot":"","sources":["../../src/commands/flip.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAgBzC,wBAAgB,WAAW,CAAC,QAAQ,EAAE,OAAO,GAAG,IAAI,CAsJnD"}
|
package/dist/commands/flip.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import chalk from 'chalk';
|
|
2
2
|
import ora from 'ora';
|
|
3
|
-
import { validatePaths, resolveOutputPaths, IMAGE_EXTENSIONS, getFileName, createStandardHelp
|
|
3
|
+
import { validatePaths, resolveOutputPaths, IMAGE_EXTENSIONS, getFileName, createStandardHelp } from '@mediaproc/core';
|
|
4
4
|
import { createSharpInstance } from '../utils/sharp.js';
|
|
5
5
|
import path from 'node:path';
|
|
6
6
|
export function flipCommand(imageCmd) {
|
|
@@ -11,13 +11,13 @@ export function flipCommand(imageCmd) {
|
|
|
11
11
|
.option('--vertical', 'Flip vertically (mirror top-bottom)')
|
|
12
12
|
.option('--both', 'Flip both horizontally and vertically (rotate 180°)')
|
|
13
13
|
.option('-o, --output <path>', 'Output file path')
|
|
14
|
-
.option('-q, --quality <quality>', 'Quality (1-100)', parseInt
|
|
14
|
+
.option('-q, --quality <quality>', 'Quality (1-100)', parseInt)
|
|
15
15
|
.option('--dry-run', 'Show what would be done without executing')
|
|
16
|
-
.option('--explain', '
|
|
16
|
+
.option('--explain [mode]', 'Show a detailed explanation of what this command will do, including technical and human-readable output. Modes: human, details, json. Adds context like timestamp, user, and platform.')
|
|
17
17
|
.option('-v, --verbose', 'Verbose output')
|
|
18
18
|
.option('--help', 'Display help for flip command')
|
|
19
19
|
.action(async (input, options) => {
|
|
20
|
-
if (options.help) {
|
|
20
|
+
if (options.help || !input) {
|
|
21
21
|
createStandardHelp({
|
|
22
22
|
commandName: 'flip',
|
|
23
23
|
emoji: '🔃',
|
|
@@ -28,9 +28,9 @@ export function flipCommand(imageCmd) {
|
|
|
28
28
|
{ flag: '--vertical', description: 'Flip vertically (mirror top-bottom)' },
|
|
29
29
|
{ flag: '--both', description: 'Flip both ways (equivalent to 180° rotation)' },
|
|
30
30
|
{ flag: '-o, --output <path>', description: 'Output file path (default: <input>-flipped.<ext>)' },
|
|
31
|
-
{ flag: '-q, --quality <quality>', description: 'Output quality 1-100 (
|
|
31
|
+
{ flag: '-q, --quality <quality>', description: 'Output quality (1-100). Optional. Applies to JPEG/WEBP/AVIF. For PNG, maps to compression level (higher quality = lower compression). Ignored for other formats.' },
|
|
32
32
|
{ flag: '--dry-run', description: 'Preview changes without executing' },
|
|
33
|
-
{ flag: '--explain', description: '
|
|
33
|
+
{ flag: '--explain [mode]', description: 'Show a detailed explanation of what this command will do, including technical and human-readable output. Modes: human, details, json. Adds context like timestamp, user, and platform.' },
|
|
34
34
|
{ flag: '-v, --verbose', description: 'Show detailed output' }
|
|
35
35
|
],
|
|
36
36
|
examples: [
|
|
@@ -68,7 +68,7 @@ export function flipCommand(imageCmd) {
|
|
|
68
68
|
if (options.verbose) {
|
|
69
69
|
console.log(chalk.blue('\nConfiguration:'));
|
|
70
70
|
console.log(chalk.dim(` Mode: ${flipType}`));
|
|
71
|
-
console.log(chalk.dim(` Quality: ${options.quality
|
|
71
|
+
console.log(chalk.dim(` Quality: ${options.quality}`));
|
|
72
72
|
}
|
|
73
73
|
if (options.dryRun) {
|
|
74
74
|
console.log(chalk.yellow('\nDry run mode - no changes will be made\n'));
|
|
@@ -77,13 +77,8 @@ export function flipCommand(imageCmd) {
|
|
|
77
77
|
const outputPath = outputPaths.get(inputFile);
|
|
78
78
|
console.log(chalk.dim(` ${index + 1}. ${getFileName(inputFile)} → ${getFileName(outputPath)}`));
|
|
79
79
|
});
|
|
80
|
-
showPluginBranding('Image', '../../package.json');
|
|
81
80
|
return;
|
|
82
81
|
}
|
|
83
|
-
if (options.explain) {
|
|
84
|
-
console.log(chalk.gray('Explain mode is not yet available.'));
|
|
85
|
-
console.log(chalk.cyan('Planned for v0.8.x.'));
|
|
86
|
-
}
|
|
87
82
|
let successCount = 0;
|
|
88
83
|
let failCount = 0;
|
|
89
84
|
for (const [index, inputFile] of inputFiles.entries()) {
|
|
@@ -104,13 +99,13 @@ export function flipCommand(imageCmd) {
|
|
|
104
99
|
}
|
|
105
100
|
const outputExt = path.extname(outputPath).toLowerCase();
|
|
106
101
|
if (outputExt === '.jpg' || outputExt === '.jpeg') {
|
|
107
|
-
pipeline.jpeg({ quality: options.quality
|
|
102
|
+
pipeline.jpeg({ quality: options.quality });
|
|
108
103
|
}
|
|
109
104
|
else if (outputExt === '.png') {
|
|
110
|
-
pipeline.png({ quality: options.quality
|
|
105
|
+
pipeline.png({ quality: options.quality });
|
|
111
106
|
}
|
|
112
107
|
else if (outputExt === '.webp') {
|
|
113
|
-
pipeline.webp({ quality: options.quality
|
|
108
|
+
pipeline.webp({ quality: options.quality });
|
|
114
109
|
}
|
|
115
110
|
await pipeline.toFile(outputPath);
|
|
116
111
|
if (options.verbose) {
|
|
@@ -134,7 +129,6 @@ export function flipCommand(imageCmd) {
|
|
|
134
129
|
if (failCount > 0) {
|
|
135
130
|
console.log(chalk.red(` ✗ Failed: ${failCount}`));
|
|
136
131
|
}
|
|
137
|
-
showPluginBranding('Image', '../../package.json');
|
|
138
132
|
}
|
|
139
133
|
catch (error) {
|
|
140
134
|
spinner.fail(chalk.red('Processing failed'));
|