@mediaproc/image 1.1.0 → 1.2.1
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/dist/commands/affine.d.ts.map +1 -1
- package/dist/commands/affine.js +65 -37
- package/dist/commands/affine.js.map +1 -1
- package/dist/commands/auto-enhance.d.ts.map +1 -1
- package/dist/commands/auto-enhance.js +74 -49
- 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 +60 -35
- package/dist/commands/auto-orient.js.map +1 -1
- package/dist/commands/batch.d.ts.map +1 -1
- package/dist/commands/batch.js +17 -34
- package/dist/commands/batch.js.map +1 -1
- package/dist/commands/blur.d.ts.map +1 -1
- package/dist/commands/blur.js +64 -36
- package/dist/commands/blur.js.map +1 -1
- package/dist/commands/boolean.d.ts.map +1 -1
- package/dist/commands/boolean.js +61 -32
- package/dist/commands/boolean.js.map +1 -1
- package/dist/commands/border.d.ts.map +1 -1
- package/dist/commands/border.js +60 -34
- package/dist/commands/border.js.map +1 -1
- package/dist/commands/clahe.d.ts.map +1 -1
- package/dist/commands/clahe.js +58 -31
- package/dist/commands/clahe.js.map +1 -1
- package/dist/commands/composite.d.ts.map +1 -1
- package/dist/commands/composite.js +52 -26
- package/dist/commands/composite.js.map +1 -1
- package/dist/commands/convert.d.ts.map +1 -1
- package/dist/commands/convert.js +94 -47
- package/dist/commands/convert.js.map +1 -1
- package/dist/commands/convolve.d.ts.map +1 -1
- package/dist/commands/convolve.js +63 -37
- package/dist/commands/convolve.js.map +1 -1
- package/dist/commands/crop.d.ts.map +1 -1
- package/dist/commands/crop.js +73 -48
- package/dist/commands/crop.js.map +1 -1
- package/dist/commands/dilate.d.ts.map +1 -1
- package/dist/commands/dilate.js +60 -31
- package/dist/commands/dilate.js.map +1 -1
- package/dist/commands/dominant-color.d.ts.map +1 -1
- package/dist/commands/dominant-color.js +154 -89
- package/dist/commands/dominant-color.js.map +1 -1
- package/dist/commands/erode.d.ts.map +1 -1
- package/dist/commands/erode.js +61 -32
- package/dist/commands/erode.js.map +1 -1
- package/dist/commands/extend.d.ts.map +1 -1
- package/dist/commands/extend.js +66 -41
- package/dist/commands/extend.js.map +1 -1
- package/dist/commands/extract.d.ts.map +1 -1
- package/dist/commands/extract.js +75 -45
- package/dist/commands/extract.js.map +1 -1
- package/dist/commands/flatten.d.ts.map +1 -1
- package/dist/commands/flatten.js +64 -38
- package/dist/commands/flatten.js.map +1 -1
- package/dist/commands/flip.d.ts.map +1 -1
- package/dist/commands/flip.js +78 -43
- package/dist/commands/flip.js.map +1 -1
- package/dist/commands/flop.d.ts.map +1 -1
- package/dist/commands/flop.js +67 -32
- package/dist/commands/flop.js.map +1 -1
- package/dist/commands/gamma.d.ts.map +1 -1
- package/dist/commands/gamma.js +66 -33
- package/dist/commands/gamma.js.map +1 -1
- package/dist/commands/grayscale.d.ts.map +1 -1
- package/dist/commands/grayscale.js +67 -34
- package/dist/commands/grayscale.js.map +1 -1
- package/dist/commands/grid.d.ts.map +1 -1
- package/dist/commands/grid.js +19 -14
- package/dist/commands/grid.js.map +1 -1
- package/dist/commands/linear.d.ts.map +1 -1
- package/dist/commands/linear.js +60 -32
- package/dist/commands/linear.js.map +1 -1
- package/dist/commands/median.d.ts.map +1 -1
- package/dist/commands/median.js +66 -33
- package/dist/commands/median.js.map +1 -1
- package/dist/commands/metadata-cmd.d.ts.map +1 -1
- package/dist/commands/metadata-cmd.js +229 -93
- package/dist/commands/metadata-cmd.js.map +1 -1
- package/dist/commands/mirror.d.ts.map +1 -1
- package/dist/commands/mirror.js +127 -105
- package/dist/commands/mirror.js.map +1 -1
- package/dist/commands/modulate.d.ts.map +1 -1
- package/dist/commands/modulate.js +64 -41
- package/dist/commands/modulate.js.map +1 -1
- package/dist/commands/negate.d.ts.map +1 -1
- package/dist/commands/negate.js +66 -31
- package/dist/commands/negate.js.map +1 -1
- package/dist/commands/normalize.d.ts.map +1 -1
- package/dist/commands/normalize.js +60 -31
- package/dist/commands/normalize.js.map +1 -1
- package/dist/commands/optimize.d.ts.map +1 -1
- package/dist/commands/optimize.js +68 -45
- package/dist/commands/optimize.js.map +1 -1
- package/dist/commands/palette.d.ts.map +1 -1
- package/dist/commands/palette.js +115 -56
- package/dist/commands/palette.js.map +1 -1
- package/dist/commands/pixelate.d.ts.map +1 -1
- package/dist/commands/pixelate.js +63 -35
- package/dist/commands/pixelate.js.map +1 -1
- package/dist/commands/recomb.d.ts.map +1 -1
- package/dist/commands/recomb.js +87 -57
- package/dist/commands/recomb.js.map +1 -1
- package/dist/commands/resize.d.ts.map +1 -1
- package/dist/commands/resize.js +99 -69
- package/dist/commands/resize.js.map +1 -1
- package/dist/commands/rotate.d.ts.map +1 -1
- package/dist/commands/rotate.js +69 -36
- package/dist/commands/rotate.js.map +1 -1
- package/dist/commands/sepia.d.ts.map +1 -1
- package/dist/commands/sepia.js +67 -34
- package/dist/commands/sepia.js.map +1 -1
- package/dist/commands/sharpen.d.ts.map +1 -1
- package/dist/commands/sharpen.js +71 -38
- package/dist/commands/sharpen.js.map +1 -1
- package/dist/commands/smart-crop.d.ts.map +1 -1
- package/dist/commands/smart-crop.js +50 -27
- package/dist/commands/smart-crop.js.map +1 -1
- package/dist/commands/split.d.ts.map +1 -1
- package/dist/commands/split.js +79 -47
- package/dist/commands/split.js.map +1 -1
- package/dist/commands/stack.d.ts.map +1 -1
- package/dist/commands/stack.js +19 -3
- package/dist/commands/stack.js.map +1 -1
- package/dist/commands/stats.d.ts.map +1 -1
- package/dist/commands/stats.js +159 -97
- package/dist/commands/stats.js.map +1 -1
- package/dist/commands/threshold.d.ts.map +1 -1
- package/dist/commands/threshold.js +65 -39
- package/dist/commands/threshold.js.map +1 -1
- package/dist/commands/thumbnail.d.ts.map +1 -1
- package/dist/commands/thumbnail.js +70 -36
- package/dist/commands/thumbnail.js.map +1 -1
- package/dist/commands/tint.d.ts.map +1 -1
- package/dist/commands/tint.js +66 -32
- package/dist/commands/tint.js.map +1 -1
- package/dist/commands/trim.d.ts.map +1 -1
- package/dist/commands/trim.js +60 -34
- package/dist/commands/trim.js.map +1 -1
- package/dist/commands/unflatten.d.ts.map +1 -1
- package/dist/commands/unflatten.js +63 -36
- package/dist/commands/unflatten.js.map +1 -1
- package/dist/commands/vignette.d.ts.map +1 -1
- package/dist/commands/vignette.js +69 -50
- package/dist/commands/vignette.js.map +1 -1
- package/dist/commands/watermark.d.ts.map +1 -1
- package/dist/commands/watermark.js +81 -57
- package/dist/commands/watermark.js.map +1 -1
- package/dist/utils/pathValidator.d.ts +74 -0
- package/dist/utils/pathValidator.d.ts.map +1 -0
- package/dist/utils/pathValidator.js +208 -0
- package/dist/utils/pathValidator.js.map +1 -0
- package/package.json +12 -5
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
export interface PathValidationOptions {
|
|
2
|
+
/**
|
|
3
|
+
* Allowed file extensions (e.g., ['.jpg', '.png'] for images)
|
|
4
|
+
* If not provided, all files are allowed
|
|
5
|
+
*/
|
|
6
|
+
allowedExtensions?: string[];
|
|
7
|
+
/**
|
|
8
|
+
* Whether to search directories recursively
|
|
9
|
+
* @default true
|
|
10
|
+
*/
|
|
11
|
+
recursive?: boolean;
|
|
12
|
+
/**
|
|
13
|
+
* Maximum depth for recursive directory search
|
|
14
|
+
* @default 10
|
|
15
|
+
*/
|
|
16
|
+
maxDepth?: number;
|
|
17
|
+
}
|
|
18
|
+
export interface ValidatedPaths {
|
|
19
|
+
inputFiles: string[];
|
|
20
|
+
outputDir: string;
|
|
21
|
+
errors: string[];
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Parse comma-separated input paths and expand them into individual file paths
|
|
25
|
+
* Supports:
|
|
26
|
+
* - Single file: "photo.jpg"
|
|
27
|
+
* - Multiple files: "photo1.jpg,photo2.jpg,photo3.jpg"
|
|
28
|
+
* - Directories: "./photos/" (finds all matching files)
|
|
29
|
+
* - Mixed: "photo.jpg,./photos/,another.jpg"
|
|
30
|
+
*/
|
|
31
|
+
export declare function parseInputPaths(inputPath: string, options?: PathValidationOptions): string[];
|
|
32
|
+
/**
|
|
33
|
+
* Find all files in a directory that match the allowed extensions
|
|
34
|
+
*/
|
|
35
|
+
export declare function findFilesInDirectory(dirPath: string, options?: PathValidationOptions, currentDepth?: number): string[];
|
|
36
|
+
/**
|
|
37
|
+
* Validate and resolve output path
|
|
38
|
+
* - If outputPath is provided and is a directory, use it
|
|
39
|
+
* - If outputPath is provided and doesn't exist, create it as a directory
|
|
40
|
+
* - If outputPath is not provided, use current working directory
|
|
41
|
+
*/
|
|
42
|
+
export declare function validateOutputPath(outputPath?: string): string;
|
|
43
|
+
/**
|
|
44
|
+
* Generate output file paths for a list of input files
|
|
45
|
+
* @param inputFiles - Array of input file paths
|
|
46
|
+
* @param outputDir - Directory where output files should be placed
|
|
47
|
+
* @param suffix - Suffix to add to output filenames (e.g., "-resized")
|
|
48
|
+
* @param newExtension - New extension for output files (e.g., ".webp")
|
|
49
|
+
* @param preserveStructure - Whether to preserve directory structure for nested inputs
|
|
50
|
+
*/
|
|
51
|
+
export declare function resolveOutputPaths(inputFiles: string[], outputDir: string, options?: {
|
|
52
|
+
suffix?: string;
|
|
53
|
+
newExtension?: string;
|
|
54
|
+
preserveStructure?: boolean;
|
|
55
|
+
}): Map<string, string>;
|
|
56
|
+
/**
|
|
57
|
+
* Validate paths and return structured result with errors
|
|
58
|
+
* This is a convenience function that combines all validation steps
|
|
59
|
+
*/
|
|
60
|
+
export declare function validatePaths(inputPath: string, outputPath: string | undefined, options?: PathValidationOptions): ValidatedPaths;
|
|
61
|
+
/**
|
|
62
|
+
* Common file extension sets for different media types
|
|
63
|
+
* Plugins can use these or define their own
|
|
64
|
+
*/
|
|
65
|
+
export declare const MediaExtensions: {
|
|
66
|
+
IMAGE: string[];
|
|
67
|
+
VIDEO: string[];
|
|
68
|
+
AUDIO: string[];
|
|
69
|
+
DOCUMENT: string[];
|
|
70
|
+
THREED: string[];
|
|
71
|
+
ANIMATION: string[];
|
|
72
|
+
ALL: never[];
|
|
73
|
+
};
|
|
74
|
+
//# sourceMappingURL=pathValidator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pathValidator.d.ts","sourceRoot":"","sources":["../../src/utils/pathValidator.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,qBAAqB;IACpC;;;OAGG;IACH,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAC;IAE7B;;;OAGG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;IAEpB;;;OAGG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,cAAc;IAC7B,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAC7B,SAAS,EAAE,MAAM,EACjB,OAAO,GAAE,qBAA0B,GAClC,MAAM,EAAE,CAoCV;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,MAAM,EACf,OAAO,GAAE,qBAA0B,EACnC,YAAY,GAAE,MAAU,GACvB,MAAM,EAAE,CA+BV;AAUD;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM,CA4B9D;AAED;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAChC,UAAU,EAAE,MAAM,EAAE,EACpB,SAAS,EAAE,MAAM,EACjB,OAAO,GAAE;IACP,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,iBAAiB,CAAC,EAAE,OAAO,CAAC;CACxB,GACL,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAmCrB;AA2BD;;;GAGG;AACH,wBAAgB,aAAa,CAC3B,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,GAAG,SAAS,EAC9B,OAAO,GAAE,qBAA0B,GAClC,cAAc,CAqBhB;AAED;;;GAGG;AACH,eAAO,MAAM,eAAe;;;;;;;;CAQ3B,CAAC"}
|
|
@@ -0,0 +1,208 @@
|
|
|
1
|
+
import * as fs from 'fs';
|
|
2
|
+
import * as path from 'path';
|
|
3
|
+
/**
|
|
4
|
+
* Parse comma-separated input paths and expand them into individual file paths
|
|
5
|
+
* Supports:
|
|
6
|
+
* - Single file: "photo.jpg"
|
|
7
|
+
* - Multiple files: "photo1.jpg,photo2.jpg,photo3.jpg"
|
|
8
|
+
* - Directories: "./photos/" (finds all matching files)
|
|
9
|
+
* - Mixed: "photo.jpg,./photos/,another.jpg"
|
|
10
|
+
*/
|
|
11
|
+
export function parseInputPaths(inputPath, options = {}) {
|
|
12
|
+
const { allowedExtensions, recursive = true, maxDepth = 10 } = options;
|
|
13
|
+
// Split by comma and trim whitespace
|
|
14
|
+
const paths = inputPath.split(',').map(p => p.trim()).filter(p => p.length > 0);
|
|
15
|
+
const allFiles = [];
|
|
16
|
+
for (const p of paths) {
|
|
17
|
+
const resolvedPath = path.resolve(p);
|
|
18
|
+
// Check if path exists
|
|
19
|
+
if (!fs.existsSync(resolvedPath)) {
|
|
20
|
+
continue; // Skip non-existent paths
|
|
21
|
+
}
|
|
22
|
+
const stats = fs.statSync(resolvedPath);
|
|
23
|
+
if (stats.isFile()) {
|
|
24
|
+
// Check if file extension is allowed
|
|
25
|
+
if (!allowedExtensions || isAllowedExtension(resolvedPath, allowedExtensions)) {
|
|
26
|
+
allFiles.push(resolvedPath);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
else if (stats.isDirectory()) {
|
|
30
|
+
// Find all matching files in directory
|
|
31
|
+
const filesInDir = findFilesInDirectory(resolvedPath, {
|
|
32
|
+
allowedExtensions,
|
|
33
|
+
recursive,
|
|
34
|
+
maxDepth,
|
|
35
|
+
});
|
|
36
|
+
allFiles.push(...filesInDir);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
// Remove duplicates
|
|
40
|
+
return [...new Set(allFiles)];
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Find all files in a directory that match the allowed extensions
|
|
44
|
+
*/
|
|
45
|
+
export function findFilesInDirectory(dirPath, options = {}, currentDepth = 0) {
|
|
46
|
+
const { allowedExtensions, recursive = true, maxDepth = 10 } = options;
|
|
47
|
+
if (currentDepth > maxDepth) {
|
|
48
|
+
return [];
|
|
49
|
+
}
|
|
50
|
+
const files = [];
|
|
51
|
+
try {
|
|
52
|
+
const entries = fs.readdirSync(dirPath, { withFileTypes: true });
|
|
53
|
+
for (const entry of entries) {
|
|
54
|
+
const fullPath = path.join(dirPath, entry.name);
|
|
55
|
+
if (entry.isFile()) {
|
|
56
|
+
// Check if file extension is allowed
|
|
57
|
+
if (!allowedExtensions || isAllowedExtension(fullPath, allowedExtensions)) {
|
|
58
|
+
files.push(fullPath);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
else if (entry.isDirectory() && recursive) {
|
|
62
|
+
// Recursively search subdirectories
|
|
63
|
+
const subFiles = findFilesInDirectory(fullPath, options, currentDepth + 1);
|
|
64
|
+
files.push(...subFiles);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
catch (error) {
|
|
69
|
+
// Ignore errors (e.g., permission denied)
|
|
70
|
+
}
|
|
71
|
+
return files;
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Check if a file has an allowed extension
|
|
75
|
+
*/
|
|
76
|
+
function isAllowedExtension(filePath, allowedExtensions) {
|
|
77
|
+
const ext = path.extname(filePath).toLowerCase();
|
|
78
|
+
return allowedExtensions.some(allowed => allowed.toLowerCase() === ext);
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Validate and resolve output path
|
|
82
|
+
* - If outputPath is provided and is a directory, use it
|
|
83
|
+
* - If outputPath is provided and doesn't exist, create it as a directory
|
|
84
|
+
* - If outputPath is not provided, use current working directory
|
|
85
|
+
*/
|
|
86
|
+
export function validateOutputPath(outputPath) {
|
|
87
|
+
if (!outputPath) {
|
|
88
|
+
// Default to current working directory
|
|
89
|
+
return process.cwd();
|
|
90
|
+
}
|
|
91
|
+
const resolvedPath = path.resolve(outputPath);
|
|
92
|
+
// If path exists and is a directory, use it
|
|
93
|
+
if (fs.existsSync(resolvedPath)) {
|
|
94
|
+
const stats = fs.statSync(resolvedPath);
|
|
95
|
+
if (stats.isDirectory()) {
|
|
96
|
+
return resolvedPath;
|
|
97
|
+
}
|
|
98
|
+
else {
|
|
99
|
+
// If it's a file, use its directory
|
|
100
|
+
return path.dirname(resolvedPath);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
// Path doesn't exist - create it as a directory
|
|
104
|
+
try {
|
|
105
|
+
fs.mkdirSync(resolvedPath, { recursive: true });
|
|
106
|
+
return resolvedPath;
|
|
107
|
+
}
|
|
108
|
+
catch (error) {
|
|
109
|
+
// If we can't create the directory, fall back to current directory
|
|
110
|
+
console.warn(`Could not create output directory ${resolvedPath}, using current directory`);
|
|
111
|
+
return process.cwd();
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Generate output file paths for a list of input files
|
|
116
|
+
* @param inputFiles - Array of input file paths
|
|
117
|
+
* @param outputDir - Directory where output files should be placed
|
|
118
|
+
* @param suffix - Suffix to add to output filenames (e.g., "-resized")
|
|
119
|
+
* @param newExtension - New extension for output files (e.g., ".webp")
|
|
120
|
+
* @param preserveStructure - Whether to preserve directory structure for nested inputs
|
|
121
|
+
*/
|
|
122
|
+
export function resolveOutputPaths(inputFiles, outputDir, options = {}) {
|
|
123
|
+
const { suffix = '', newExtension, preserveStructure = false } = options;
|
|
124
|
+
const outputMap = new Map();
|
|
125
|
+
// Find common base path if preserving structure
|
|
126
|
+
let basePath = '';
|
|
127
|
+
if (preserveStructure && inputFiles.length > 1) {
|
|
128
|
+
basePath = findCommonBasePath(inputFiles);
|
|
129
|
+
}
|
|
130
|
+
for (const inputFile of inputFiles) {
|
|
131
|
+
const inputPath = path.parse(inputFile);
|
|
132
|
+
// Determine output filename
|
|
133
|
+
const ext = newExtension || inputPath.ext;
|
|
134
|
+
const outputFilename = `${inputPath.name}${suffix}${ext}`;
|
|
135
|
+
// Determine output directory
|
|
136
|
+
let finalOutputDir = outputDir;
|
|
137
|
+
if (preserveStructure && basePath) {
|
|
138
|
+
const relativePath = path.relative(basePath, inputPath.dir);
|
|
139
|
+
finalOutputDir = path.join(outputDir, relativePath);
|
|
140
|
+
// Create nested directories if needed
|
|
141
|
+
if (!fs.existsSync(finalOutputDir)) {
|
|
142
|
+
fs.mkdirSync(finalOutputDir, { recursive: true });
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
const outputPath = path.join(finalOutputDir, outputFilename);
|
|
146
|
+
outputMap.set(inputFile, outputPath);
|
|
147
|
+
}
|
|
148
|
+
return outputMap;
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* Find the common base path for a list of file paths
|
|
152
|
+
*/
|
|
153
|
+
function findCommonBasePath(files) {
|
|
154
|
+
if (files.length === 0)
|
|
155
|
+
return '';
|
|
156
|
+
if (files.length === 1)
|
|
157
|
+
return path.dirname(files[0]);
|
|
158
|
+
const dirs = files.map(f => path.dirname(f));
|
|
159
|
+
const parts = dirs.map(d => d.split(path.sep));
|
|
160
|
+
const minLength = Math.min(...parts.map(p => p.length));
|
|
161
|
+
const commonParts = [];
|
|
162
|
+
for (let i = 0; i < minLength; i++) {
|
|
163
|
+
const part = parts[0][i];
|
|
164
|
+
if (parts.every(p => p[i] === part)) {
|
|
165
|
+
commonParts.push(part);
|
|
166
|
+
}
|
|
167
|
+
else {
|
|
168
|
+
break;
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
return commonParts.join(path.sep) || '/';
|
|
172
|
+
}
|
|
173
|
+
/**
|
|
174
|
+
* Validate paths and return structured result with errors
|
|
175
|
+
* This is a convenience function that combines all validation steps
|
|
176
|
+
*/
|
|
177
|
+
export function validatePaths(inputPath, outputPath, options = {}) {
|
|
178
|
+
const errors = [];
|
|
179
|
+
// Parse and validate input paths
|
|
180
|
+
const inputFiles = parseInputPaths(inputPath, options);
|
|
181
|
+
if (inputFiles.length === 0) {
|
|
182
|
+
errors.push(`No valid input files found matching the criteria`);
|
|
183
|
+
if (options.allowedExtensions) {
|
|
184
|
+
errors.push(`Allowed extensions: ${options.allowedExtensions.join(', ')}`);
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
// Validate output directory
|
|
188
|
+
const outputDir = validateOutputPath(outputPath);
|
|
189
|
+
return {
|
|
190
|
+
inputFiles,
|
|
191
|
+
outputDir,
|
|
192
|
+
errors,
|
|
193
|
+
};
|
|
194
|
+
}
|
|
195
|
+
/**
|
|
196
|
+
* Common file extension sets for different media types
|
|
197
|
+
* Plugins can use these or define their own
|
|
198
|
+
*/
|
|
199
|
+
export const MediaExtensions = {
|
|
200
|
+
IMAGE: ['.jpg', '.jpeg', '.png', '.gif', '.bmp', '.webp', '.tiff', '.tif', '.svg', '.ico', '.heic', '.heif'],
|
|
201
|
+
VIDEO: ['.mp4', '.avi', '.mov', '.mkv', '.flv', '.wmv', '.webm', '.m4v', '.mpg', '.mpeg', '.3gp'],
|
|
202
|
+
AUDIO: ['.mp3', '.wav', '.flac', '.aac', '.ogg', '.m4a', '.wma', '.opus', '.ape', '.alac'],
|
|
203
|
+
DOCUMENT: ['.pdf', '.doc', '.docx', '.txt', '.rtf', '.odt', '.md', '.html', '.xml'],
|
|
204
|
+
THREED: ['.obj', '.fbx', '.gltf', '.glb', '.stl', '.dae', '.3ds', '.blend', '.ply'],
|
|
205
|
+
ANIMATION: ['.gif', '.apng', '.webp', '.mp4'],
|
|
206
|
+
ALL: [], // Empty array means all files are allowed
|
|
207
|
+
};
|
|
208
|
+
//# sourceMappingURL=pathValidator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pathValidator.js","sourceRoot":"","sources":["../../src/utils/pathValidator.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@mediaproc/image",
|
|
3
|
-
"version": "1.1
|
|
3
|
+
"version": "1.2.1",
|
|
4
4
|
"description": "Image processing plugin for mediaproc - powered by Sharp",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -38,8 +38,10 @@
|
|
|
38
38
|
"dev": "tsx src/cli.ts",
|
|
39
39
|
"watch": "tsc --watch",
|
|
40
40
|
"clean": "rm -rf dist",
|
|
41
|
-
"
|
|
42
|
-
"test": "
|
|
41
|
+
"test": "jest --config ../../jest.config.js",
|
|
42
|
+
"test:watch": "jest --config ../../jest.config.js --watch",
|
|
43
|
+
"test:coverage": "jest --config ../../jest.config.js --coverage",
|
|
44
|
+
"prepublishOnly": "pnpm build"
|
|
43
45
|
},
|
|
44
46
|
"dependencies": {
|
|
45
47
|
"chalk": "^5.3.0",
|
|
@@ -48,8 +50,13 @@
|
|
|
48
50
|
"sharp": "^0.34.5"
|
|
49
51
|
},
|
|
50
52
|
"devDependencies": {
|
|
53
|
+
"@jest/globals": "^30.2.0",
|
|
54
|
+
"@types/jest": "^30.0.0",
|
|
51
55
|
"@types/node": "^25.0.3",
|
|
52
|
-
"
|
|
53
|
-
"
|
|
56
|
+
"jest": "^30.2.0",
|
|
57
|
+
"ts-jest": "^29.4.6",
|
|
58
|
+
"ts-node": "^10.9.2",
|
|
59
|
+
"tsx": "^4.7.0",
|
|
60
|
+
"typescript": "^5.3.3"
|
|
54
61
|
}
|
|
55
62
|
}
|