import { mkdir, readdir } from "node:fs/promises"; import { join, parse } from "node:path"; import { fileURLToPath } from "node:url"; import sharp from "sharp"; const root = fileURLToPath(new URL("../public/catalog-products/", import.meta.url)); async function optimizeDirectory(sourceDirectory, targetDirectory, width) { const sourcePath = join(root, sourceDirectory); const targetPath = join(root, targetDirectory); await mkdir(targetPath, { recursive: true }); const entries = await readdir(sourcePath, { withFileTypes: true }); const imageEntries = entries.filter((entry) => entry.isFile() && /\.(?:jpe?g|png)$/i.test(entry.name)); await Promise.all(imageEntries.map(async (entry) => { const filename = `${parse(entry.name).name}.webp`; await sharp(join(sourcePath, entry.name)) .resize({ width, withoutEnlargement: true }) .webp({ quality: 78, effort: 4 }) .toFile(join(targetPath, filename)); })); console.log(`${sourceDirectory} -> ${targetDirectory}: ${imageEntries.length} images`); } await optimizeDirectory("precision-gears/", "precision-gears-thumb/", 480); await optimizeDirectory("source-main/", "source-main-thumb/", 640);