@codemarc/blt 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 (87) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +184 -0
  3. package/dist/commands/bucket.d.ts +3 -0
  4. package/dist/commands/bucket.d.ts.map +1 -0
  5. package/dist/commands/bucket.js +399 -0
  6. package/dist/commands/bucket.js.map +1 -0
  7. package/dist/commands/check.d.ts +3 -0
  8. package/dist/commands/check.d.ts.map +1 -0
  9. package/dist/commands/check.js +43 -0
  10. package/dist/commands/check.js.map +1 -0
  11. package/dist/commands/cleanup.d.ts +6 -0
  12. package/dist/commands/cleanup.d.ts.map +1 -0
  13. package/dist/commands/cleanup.js +65 -0
  14. package/dist/commands/cleanup.js.map +1 -0
  15. package/dist/commands/data.d.ts +8 -0
  16. package/dist/commands/data.d.ts.map +1 -0
  17. package/dist/commands/data.js +222 -0
  18. package/dist/commands/data.js.map +1 -0
  19. package/dist/commands/env.d.ts +6 -0
  20. package/dist/commands/env.d.ts.map +1 -0
  21. package/dist/commands/env.js +29 -0
  22. package/dist/commands/env.js.map +1 -0
  23. package/dist/commands/image/color.d.ts +12 -0
  24. package/dist/commands/image/color.d.ts.map +1 -0
  25. package/dist/commands/image/color.js +274 -0
  26. package/dist/commands/image/color.js.map +1 -0
  27. package/dist/commands/image/convert.d.ts +11 -0
  28. package/dist/commands/image/convert.d.ts.map +1 -0
  29. package/dist/commands/image/convert.js +230 -0
  30. package/dist/commands/image/convert.js.map +1 -0
  31. package/dist/commands/image/enhance.d.ts +10 -0
  32. package/dist/commands/image/enhance.d.ts.map +1 -0
  33. package/dist/commands/image/enhance.js +174 -0
  34. package/dist/commands/image/enhance.js.map +1 -0
  35. package/dist/commands/image/sharpen.d.ts +13 -0
  36. package/dist/commands/image/sharpen.d.ts.map +1 -0
  37. package/dist/commands/image/sharpen.js +205 -0
  38. package/dist/commands/image/sharpen.js.map +1 -0
  39. package/dist/commands/image.d.ts +3 -0
  40. package/dist/commands/image.d.ts.map +1 -0
  41. package/dist/commands/image.js +125 -0
  42. package/dist/commands/image.js.map +1 -0
  43. package/dist/commands/repo.d.ts +6 -0
  44. package/dist/commands/repo.d.ts.map +1 -0
  45. package/dist/commands/repo.js +75 -0
  46. package/dist/commands/repo.js.map +1 -0
  47. package/dist/config/config.d.ts +16 -0
  48. package/dist/config/config.d.ts.map +1 -0
  49. package/dist/config/config.js +57 -0
  50. package/dist/config/config.js.map +1 -0
  51. package/dist/index.d.ts +3 -0
  52. package/dist/index.d.ts.map +1 -0
  53. package/dist/index.js +27 -0
  54. package/dist/index.js.map +1 -0
  55. package/dist/lib/constants.d.ts +23 -0
  56. package/dist/lib/constants.d.ts.map +1 -0
  57. package/dist/lib/constants.js +22 -0
  58. package/dist/lib/constants.js.map +1 -0
  59. package/dist/lib/data-generator.d.ts +11 -0
  60. package/dist/lib/data-generator.d.ts.map +1 -0
  61. package/dist/lib/data-generator.js +78 -0
  62. package/dist/lib/data-generator.js.map +1 -0
  63. package/dist/lib/database-runner.d.ts +14 -0
  64. package/dist/lib/database-runner.d.ts.map +1 -0
  65. package/dist/lib/database-runner.js +186 -0
  66. package/dist/lib/database-runner.js.map +1 -0
  67. package/dist/lib/instance-discovery.d.ts +13 -0
  68. package/dist/lib/instance-discovery.d.ts.map +1 -0
  69. package/dist/lib/instance-discovery.js +48 -0
  70. package/dist/lib/instance-discovery.js.map +1 -0
  71. package/dist/lib/schema-discovery.d.ts +30 -0
  72. package/dist/lib/schema-discovery.d.ts.map +1 -0
  73. package/dist/lib/schema-discovery.js +85 -0
  74. package/dist/lib/schema-discovery.js.map +1 -0
  75. package/dist/lib/sql-builder.d.ts +25 -0
  76. package/dist/lib/sql-builder.d.ts.map +1 -0
  77. package/dist/lib/sql-builder.js +108 -0
  78. package/dist/lib/sql-builder.js.map +1 -0
  79. package/dist/lib/yaml-converter.d.ts +26 -0
  80. package/dist/lib/yaml-converter.d.ts.map +1 -0
  81. package/dist/lib/yaml-converter.js +350 -0
  82. package/dist/lib/yaml-converter.js.map +1 -0
  83. package/dist/utils/supabase.d.ts +3 -0
  84. package/dist/utils/supabase.d.ts.map +1 -0
  85. package/dist/utils/supabase.js +19 -0
  86. package/dist/utils/supabase.js.map +1 -0
  87. package/package.json +61 -0
@@ -0,0 +1,274 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.imageColorHelp = imageColorHelp;
40
+ exports.imageColorCommand = imageColorCommand;
41
+ const debug_1 = __importDefault(require("debug"));
42
+ const fs_1 = require("fs");
43
+ const path_1 = require("path");
44
+ const log = (0, debug_1.default)("blt:image:color");
45
+ function imageColorHelp() {
46
+ console.log("\nChange the base color of an image\n");
47
+ console.log("Usage:");
48
+ console.log(" blt image color <input> [options]\n");
49
+ console.log("Options:");
50
+ console.log(" -t, --to <color> Target color (hex, rgb, or color name)");
51
+ console.log(" -f, --from <color> Source color to replace (hex, rgb, or color name)");
52
+ console.log(" If not specified, detects dominant color");
53
+ console.log(" -o, --output <path> Output file path (defaults to overwriting input)");
54
+ console.log(" -q, --quality <quality> WebP quality (0-100)");
55
+ console.log(" -z, --tolerance <num> Color matching tolerance (0-100, default: 30)\n");
56
+ }
57
+ // Color helper functions
58
+ function parseColor(color) {
59
+ const normalized = color.trim().toLowerCase();
60
+ // Named colors
61
+ const namedColors = {
62
+ red: { r: 255, g: 0, b: 0 },
63
+ green: { r: 0, g: 255, b: 0 },
64
+ blue: { r: 0, g: 0, b: 255 },
65
+ yellow: { r: 255, g: 255, b: 0 },
66
+ cyan: { r: 0, g: 255, b: 255 },
67
+ magenta: { r: 255, g: 0, b: 255 },
68
+ orange: { r: 255, g: 165, b: 0 },
69
+ purple: { r: 128, g: 0, b: 128 },
70
+ pink: { r: 255, g: 192, b: 203 },
71
+ white: { r: 255, g: 255, b: 255 },
72
+ black: { r: 0, g: 0, b: 0 },
73
+ gray: { r: 128, g: 128, b: 128 },
74
+ grey: { r: 128, g: 128, b: 128 },
75
+ };
76
+ if (namedColors[normalized]) {
77
+ return namedColors[normalized];
78
+ }
79
+ // Hex color (#FF0000 or FF0000)
80
+ if (normalized.startsWith("#") || /^[0-9a-f]{6}$/i.test(normalized)) {
81
+ const hex = normalized.startsWith("#") ? normalized.slice(1) : normalized;
82
+ if (/^[0-9a-f]{6}$/i.test(hex)) {
83
+ return {
84
+ r: parseInt(hex.slice(0, 2), 16),
85
+ g: parseInt(hex.slice(2, 4), 16),
86
+ b: parseInt(hex.slice(4, 6), 16),
87
+ };
88
+ }
89
+ }
90
+ // RGB format (255,0,0 or rgb(255,0,0))
91
+ const rgbMatch = normalized.match(/(?:rgb\()?(\d+),?\s*(\d+),?\s*(\d+)\)?/);
92
+ if (rgbMatch) {
93
+ return {
94
+ r: parseInt(rgbMatch[1], 10),
95
+ g: parseInt(rgbMatch[2], 10),
96
+ b: parseInt(rgbMatch[3], 10),
97
+ };
98
+ }
99
+ return null;
100
+ }
101
+ function detectDominantColor(data, info) {
102
+ const colorCounts = new Map();
103
+ const sampleSize = Math.min(10000, data.length); // Sample up to 10k pixels for performance
104
+ const step = Math.max(1, Math.floor(data.length / sampleSize));
105
+ for (let i = 0; i < data.length; i += step * info.channels) {
106
+ if (info.channels >= 3) {
107
+ const r = data[i];
108
+ const g = data[i + 1];
109
+ const b = data[i + 2];
110
+ // Quantize colors to reduce noise (group similar colors)
111
+ const quantizedR = Math.floor(r / 16) * 16;
112
+ const quantizedG = Math.floor(g / 16) * 16;
113
+ const quantizedB = Math.floor(b / 16) * 16;
114
+ const key = `${quantizedR},${quantizedG},${quantizedB}`;
115
+ colorCounts.set(key, (colorCounts.get(key) || 0) + 1);
116
+ }
117
+ }
118
+ // Find most common color
119
+ let maxCount = 0;
120
+ let dominantKey = "0,0,0";
121
+ for (const [key, count] of colorCounts.entries()) {
122
+ if (count > maxCount) {
123
+ maxCount = count;
124
+ dominantKey = key;
125
+ }
126
+ }
127
+ const [r, g, b] = dominantKey.split(",").map(Number);
128
+ return { r, g, b };
129
+ }
130
+ function colorDistance(c1, c2) {
131
+ // Euclidean distance in RGB space
132
+ const dr = c1.r - c2.r;
133
+ const dg = c1.g - c2.g;
134
+ const db = c1.b - c2.b;
135
+ return Math.sqrt(dr * dr + dg * dg + db * db);
136
+ }
137
+ function replaceColor(data, info, sourceColor, targetColor, tolerance) {
138
+ const output = Buffer.from(data);
139
+ const maxDistance = (tolerance / 100) * 441; // Max RGB distance is ~441 (sqrt(255^2 * 3))
140
+ for (let i = 0; i < data.length; i += info.channels) {
141
+ if (info.channels >= 3) {
142
+ const r = data[i];
143
+ const g = data[i + 1];
144
+ const b = data[i + 2];
145
+ const pixelColor = { r, g, b };
146
+ const distance = colorDistance(pixelColor, sourceColor);
147
+ if (distance <= maxDistance) {
148
+ // Calculate replacement strength based on distance
149
+ const strength = 1 - distance / maxDistance;
150
+ // Blend between original and target based on distance
151
+ output[i] = Math.round(r + (targetColor.r - r) * strength);
152
+ output[i + 1] = Math.round(g + (targetColor.g - g) * strength);
153
+ output[i + 2] = Math.round(b + (targetColor.b - b) * strength);
154
+ }
155
+ }
156
+ }
157
+ return output;
158
+ }
159
+ // entry point for the image color command
160
+ async function imageColorCommand(args, options, logger) {
161
+ try {
162
+ const inputPath = args.input;
163
+ const targetColor = (options.to || "").toLowerCase();
164
+ const sourceColor = (options.from || "").toLowerCase();
165
+ const outputPath = options.output;
166
+ const quality = options.quality;
167
+ const tolerance = options.tolerance;
168
+ log("Changing color: %s", inputPath);
169
+ if (!inputPath) {
170
+ imageColorHelp();
171
+ process.exit(1);
172
+ }
173
+ if (!targetColor) {
174
+ logger.error("Target color is required. Use --to <color> to specify the target color.");
175
+ process.exit(1);
176
+ }
177
+ // Check if input exists
178
+ try {
179
+ (0, fs_1.statSync)(inputPath);
180
+ }
181
+ catch {
182
+ logger.error(`Input file not found: ${inputPath}`);
183
+ process.exit(1);
184
+ }
185
+ // Validate quality
186
+ if (quality < 0 || quality > 100) {
187
+ logger.error("Quality must be between 0 and 100");
188
+ process.exit(1);
189
+ }
190
+ // Validate tolerance
191
+ if (tolerance < 0 || tolerance > 100) {
192
+ logger.error("Tolerance must be between 0 and 100");
193
+ process.exit(1);
194
+ }
195
+ // Import sharp dynamically
196
+ let sharp;
197
+ try {
198
+ const sharpModule = await Promise.resolve().then(() => __importStar(require("sharp")));
199
+ sharp = sharpModule.default;
200
+ }
201
+ catch {
202
+ logger.error("Sharp library not found. Install with: bun add sharp");
203
+ process.exit(1);
204
+ }
205
+ // Parse colors
206
+ const targetRgb = parseColor(targetColor);
207
+ if (!targetRgb) {
208
+ logger.error(`Invalid target color: ${targetColor}. Use hex (#FF0000), rgb (255,0,0), or color name (red).`);
209
+ process.exit(1);
210
+ }
211
+ let sourceRgb = null;
212
+ if (sourceColor) {
213
+ sourceRgb = parseColor(sourceColor);
214
+ if (!sourceRgb) {
215
+ logger.error(`Invalid source color: ${sourceColor}. Use hex (#0000FF), rgb (0,0,255), or color name (blue).`);
216
+ process.exit(1);
217
+ }
218
+ }
219
+ // If output is same as input, use a temp file
220
+ const isSameFile = !outputPath;
221
+ const finalOutputPath = outputPath || inputPath;
222
+ const tempPath = isSameFile
223
+ ? (0, path_1.join)((0, path_1.dirname)(inputPath), `.${(0, path_1.basename)(inputPath)}.tmp`)
224
+ : finalOutputPath;
225
+ const image = sharp(inputPath);
226
+ const metadata = await image.metadata();
227
+ console.log(` Original: ${metadata.width}x${metadata.height}, format: ${metadata.format}`);
228
+ // Get image buffer for color analysis
229
+ const { data, info } = await image.raw().toBuffer({ resolveWithObject: true });
230
+ // Detect source color if not provided
231
+ if (!sourceRgb) {
232
+ console.log(" Detecting dominant color...");
233
+ sourceRgb = detectDominantColor(data, info);
234
+ console.log(` Detected base color: rgb(${sourceRgb.r}, ${sourceRgb.g}, ${sourceRgb.b})`);
235
+ }
236
+ else {
237
+ console.log(` Using source color: rgb(${sourceRgb.r}, ${sourceRgb.g}, ${sourceRgb.b})`);
238
+ }
239
+ console.log(` Target color: rgb(${targetRgb.r}, ${targetRgb.g}, ${targetRgb.b})`);
240
+ // Replace colors in the image
241
+ const replacedData = replaceColor(data, info, sourceRgb, targetRgb, tolerance);
242
+ // Reconstruct image with new colors
243
+ await sharp(replacedData, {
244
+ raw: {
245
+ width: info.width,
246
+ height: info.height,
247
+ channels: info.channels,
248
+ },
249
+ })
250
+ .webp({
251
+ quality,
252
+ effort: 6,
253
+ })
254
+ .toFile(tempPath);
255
+ // If same file, replace original with temp
256
+ if (isSameFile) {
257
+ (0, fs_1.renameSync)(tempPath, inputPath);
258
+ }
259
+ const inputSize = (0, fs_1.statSync)(inputPath).size;
260
+ const finalPath = isSameFile ? inputPath : finalOutputPath;
261
+ const outputSize = (0, fs_1.statSync)(finalPath).size;
262
+ console.log(`✓ Color changed: ${finalPath}`);
263
+ console.log(` Input: ${(inputSize / 1024).toFixed(2)} KB`);
264
+ console.log(` Output: ${(outputSize / 1024).toFixed(2)} KB`);
265
+ }
266
+ catch (error) {
267
+ logger.error("Error:", error.message);
268
+ if (error.stack) {
269
+ log("Stack trace: %s", error.stack);
270
+ }
271
+ process.exit(1);
272
+ }
273
+ }
274
+ //# sourceMappingURL=color.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"color.js","sourceRoot":"","sources":["../../../src/commands/image/color.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import type { Logger } from "@caporal/core";
2
+ export declare function imageConvertHelp(logger: Logger): void;
3
+ export declare function imageConvertCommand(args: {
4
+ input?: string;
5
+ }, options: {
6
+ output?: string;
7
+ quality?: number;
8
+ recursive?: boolean;
9
+ overwrite?: boolean;
10
+ }, logger: Logger): Promise<void>;
11
+ //# sourceMappingURL=convert.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"convert.d.ts","sourceRoot":"","sources":["../../../src/commands/image/convert.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAO5C,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,QAS9C;AAwDD,wBAAsB,mBAAmB,CACvC,IAAI,EAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,EACxB,OAAO,EAAE;IACP,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB,EACD,MAAM,EAAE,MAAM,iBA4Jf"}
@@ -0,0 +1,230 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.imageConvertHelp = imageConvertHelp;
40
+ exports.imageConvertCommand = imageConvertCommand;
41
+ const debug_1 = __importDefault(require("debug"));
42
+ const fs_1 = require("fs");
43
+ const path_1 = require("path");
44
+ const log = (0, debug_1.default)("blt:image:convert");
45
+ function imageConvertHelp(logger) {
46
+ console.log("\nConvert images to WebP format\n");
47
+ console.log("Usage:");
48
+ console.log(" blt image convert <input> [options]\n");
49
+ console.log("Options:");
50
+ console.log(" -o, --output <path> Output file or directory");
51
+ console.log(" -q, --quality <quality> WebP quality (0-100)");
52
+ console.log(" -r, --recursive Process directories recursively");
53
+ console.log(" --overwrite Overwrite existing files\n");
54
+ }
55
+ // Helper functions
56
+ function isImageFile(filePath) {
57
+ const ext = (0, path_1.extname)(filePath).toLowerCase();
58
+ return [".png", ".jpg", ".jpeg", ".gif", ".tiff", ".tif", ".bmp"].includes(ext);
59
+ }
60
+ function getImageFiles(dirPath) {
61
+ const files = (0, fs_1.readdirSync)(dirPath);
62
+ return files
63
+ .filter((file) => file !== '.DS_Store' && !file.startsWith('._'))
64
+ .map((file) => (0, path_1.join)(dirPath, file))
65
+ .filter((filePath) => {
66
+ try {
67
+ return (0, fs_1.statSync)(filePath).isFile() && isImageFile(filePath);
68
+ }
69
+ catch {
70
+ return false;
71
+ }
72
+ });
73
+ }
74
+ function getAllImageFiles(dirPath, arrayOfFiles = []) {
75
+ const files = (0, fs_1.readdirSync)(dirPath);
76
+ files.forEach((file) => {
77
+ // Skip .DS_Store and other hidden system files
78
+ if (file === '.DS_Store' || file.startsWith('._')) {
79
+ return;
80
+ }
81
+ const filePath = (0, path_1.join)(dirPath, file);
82
+ try {
83
+ if ((0, fs_1.statSync)(filePath).isDirectory()) {
84
+ arrayOfFiles = getAllImageFiles(filePath, arrayOfFiles);
85
+ }
86
+ else if (isImageFile(filePath)) {
87
+ arrayOfFiles.push(filePath);
88
+ }
89
+ }
90
+ catch {
91
+ // Skip files we can't access
92
+ }
93
+ });
94
+ return arrayOfFiles;
95
+ }
96
+ function formatBytes(bytes) {
97
+ if (bytes === 0)
98
+ return "0 B";
99
+ const k = 1024;
100
+ const sizes = ["B", "KB", "MB", "GB"];
101
+ const i = Math.floor(Math.log(bytes) / Math.log(k));
102
+ return `${parseFloat((bytes / Math.pow(k, i)).toFixed(2))} ${sizes[i]}`;
103
+ }
104
+ // entry point for the image convert command
105
+ async function imageConvertCommand(args, options, logger) {
106
+ try {
107
+ const inputPath = args.input;
108
+ const outputPath = options.output;
109
+ const quality = options.quality;
110
+ const recursive = options.recursive;
111
+ const overwrite = options.overwrite;
112
+ log("Converting to WebP: %s", inputPath);
113
+ // Check if input exists
114
+ let isDirectory = false;
115
+ try {
116
+ const stat = (0, fs_1.statSync)(inputPath);
117
+ isDirectory = stat.isDirectory();
118
+ }
119
+ catch {
120
+ logger.error(`Input not found: ${inputPath}`);
121
+ process.exit(1);
122
+ }
123
+ // Validate quality
124
+ if (quality < 0 || quality > 100) {
125
+ logger.error("Quality must be between 0 and 100");
126
+ process.exit(1);
127
+ }
128
+ let sharp;
129
+ try {
130
+ const sharpModule = await Promise.resolve().then(() => __importStar(require("sharp")));
131
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
132
+ sharp = sharpModule.default;
133
+ }
134
+ catch {
135
+ logger.error("Sharp library not found. Install with: bun add sharp");
136
+ process.exit(1);
137
+ }
138
+ if (isDirectory) {
139
+ // Process directory
140
+ const files = recursive
141
+ ? getAllImageFiles(inputPath)
142
+ : getImageFiles(inputPath);
143
+ if (files.length === 0) {
144
+ console.log("No image files found");
145
+ return;
146
+ }
147
+ console.log(`Found ${files.length} image(s) to convert`);
148
+ console.log("");
149
+ let successCount = 0;
150
+ let errorCount = 0;
151
+ let skippedCount = 0;
152
+ for (const filePath of files) {
153
+ const ext = (0, path_1.extname)(filePath).toLowerCase();
154
+ if (ext === ".webp") {
155
+ console.log(` ⊘ ${(0, path_1.basename)(filePath)} (already WebP)`);
156
+ skippedCount++;
157
+ continue;
158
+ }
159
+ try {
160
+ const outputFilePath = outputPath
161
+ ? (0, path_1.join)(outputPath, (0, path_1.basename)(filePath, ext) + ".webp")
162
+ : filePath.replace(ext, ".webp");
163
+ // Check if output exists
164
+ if (!overwrite) {
165
+ try {
166
+ (0, fs_1.statSync)(outputFilePath);
167
+ console.log(` ⊘ ${(0, path_1.basename)(filePath)} (output exists, use --overwrite)`);
168
+ skippedCount++;
169
+ continue;
170
+ }
171
+ catch {
172
+ // File doesn't exist, proceed
173
+ }
174
+ }
175
+ await sharp(filePath).webp({ quality }).toFile(outputFilePath);
176
+ const inputSize = (0, fs_1.statSync)(filePath).size;
177
+ const outputSize = (0, fs_1.statSync)(outputFilePath).size;
178
+ const savings = ((1 - outputSize / inputSize) * 100).toFixed(1);
179
+ console.log(` ✓ ${(0, path_1.basename)(filePath)} → ${(0, path_1.basename)(outputFilePath)} (${savings}% smaller)`);
180
+ successCount++;
181
+ }
182
+ catch (error) {
183
+ logger.error(` ✗ ${(0, path_1.basename)(filePath)}: ${error.message}`);
184
+ errorCount++;
185
+ }
186
+ }
187
+ console.log("");
188
+ console.log(`Completed: ${successCount} converted, ${skippedCount} skipped, ${errorCount} failed`);
189
+ }
190
+ else {
191
+ // Process single file
192
+ const ext = (0, path_1.extname)(inputPath).toLowerCase();
193
+ if (ext === ".webp") {
194
+ console.log("Input is already a WebP file");
195
+ return;
196
+ }
197
+ if (!isImageFile(inputPath)) {
198
+ logger.error("Input is not a supported image file (png, jpg, jpeg, gif, tiff, bmp)");
199
+ process.exit(1);
200
+ }
201
+ const outputFilePath = outputPath
202
+ ? outputPath
203
+ : inputPath.replace(ext, ".webp");
204
+ // Check if output exists
205
+ if (!overwrite) {
206
+ try {
207
+ (0, fs_1.statSync)(outputFilePath);
208
+ logger.error(`Output file exists: ${outputFilePath}. Use --overwrite to replace it.`);
209
+ process.exit(1);
210
+ }
211
+ catch {
212
+ // File doesn't exist, proceed
213
+ }
214
+ }
215
+ await sharp(inputPath).webp({ quality }).toFile(outputFilePath);
216
+ const inputSize = (0, fs_1.statSync)(inputPath).size;
217
+ const outputSize = (0, fs_1.statSync)(outputFilePath).size;
218
+ const savings = ((1 - outputSize / inputSize) * 100).toFixed(1);
219
+ console.log(`✓ Converted: ${outputFilePath}`);
220
+ console.log(` Input: ${formatBytes(inputSize)}`);
221
+ console.log(` Output: ${formatBytes(outputSize)}`);
222
+ console.log(` Saved: ${savings}%`);
223
+ }
224
+ }
225
+ catch (error) {
226
+ logger.error("Error:", error.message);
227
+ process.exit(1);
228
+ }
229
+ }
230
+ //# sourceMappingURL=convert.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"convert.js","sourceRoot":"","sources":["../../../src/commands/image/convert.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import type { Logger } from "@caporal/core";
2
+ export declare function imageEnhanceHelp(): void;
3
+ export declare function imageEnhanceCommand(args: {
4
+ input?: string;
5
+ }, options: {
6
+ mode?: string;
7
+ output?: string;
8
+ quality?: number;
9
+ }, logger: Logger): Promise<void>;
10
+ //# sourceMappingURL=enhance.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"enhance.d.ts","sourceRoot":"","sources":["../../../src/commands/image/enhance.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAO5C,wBAAgB,gBAAgB,SAQ/B;AAkBD,wBAAsB,mBAAmB,CACvC,IAAI,EAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,EACxB,OAAO,EAAE;IACP,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,EACD,MAAM,EAAE,MAAM,iBAkIf"}