import { execFile as execFileOriginal } from "node:child_process"; import { ExecFileFn } from "./types"; export const properties = { from: { images: ["jpg", "jpeg", "png", "bmp", "gif", "tiff", "tif", "webp"], }, to: { images: ["svg"], }, }; interface VTracerOptions { colormode?: string; hierarchical?: string; mode?: string; filter_speckle?: string | number; color_precision?: string | number; layer_difference?: string | number; corner_threshold?: string | number; length_threshold?: string | number; max_iterations?: string | number; splice_threshold?: string | number; path_precision?: string | number; } export function convert( filePath: string, fileType: string, convertTo: string, targetPath: string, options?: unknown, execFile: ExecFileFn = execFileOriginal, // to make it mockable ): Promise { return new Promise((resolve, reject) => { // Build vtracer arguments const args = ["--input", filePath, "--output", targetPath]; // Add optional parameter if provided if (options && typeof options === "object") { const opts = options as VTracerOptions; const validOptions: Array = [ "colormode", "hierarchical", "mode", "filter_speckle", "color_precision", "layer_difference", "corner_threshold", "length_threshold", "max_iterations", "splice_threshold", "path_precision", ]; for (const option of validOptions) { if (opts[option] !== undefined) { args.push(`--${option}`, String(opts[option])); } } } execFile("vtracer", args, (error, stdout, stderr) => { if (error) { reject(`error: ${error}${stderr ? `\nstderr: ${stderr}` : ""}`); return; } if (stdout) { console.log(`stdout: ${stdout}`); } if (stderr) { console.log(`stderr: ${stderr}`); } resolve("Done"); }); }); }