@gouvfr/dsfr-nexus
Version:
Le module `dsfr-nexus` est l'interface de ligne de commande (CLI) centrale du Système de Design de l’État - DSFR. Il offre des outils pour gérer et compiler les ressources du DSFR
62 lines (51 loc) • 1.75 kB
JavaScript
import { copyFile, log } from '@gouvfr/dsfr-forge';
import sharp from 'sharp';
import fs from 'fs';
const DIR_REGEX = /^(?<dir>.*[\\/])/;
const CONFIG = {
jpeg: { quality: 80 },
webp: { quality: 80 },
png: { compressionLevel: 9, palette: true },
}
class ImageRefiner {
constructor (name, state) {
this._name = name;
this._state = state;
const img = fs.readFileSync(this._state.src, 'utf8');
const stats = fs.statSync(this._state.src);
this._size = (stats.size / 1024).toFixed(2);
this._written = this.written.bind(this);
}
async write () {
const dir = DIR_REGEX.exec(this._state.dest).groups.dir;
if (!fs.existsSync(dir)) {
fs.mkdirSync(dir, { recursive: true });
}
const image = sharp(this._state.src);
const { format } = await image.metadata();
switch (format) {
case 'jpeg':
await image.jpeg(CONFIG.jpeg).toFile(this._state.dest, this._written);
break;
case 'webp':
await image.webp(CONFIG.webp).toFile(this._state.dest, this._written);
break;
case 'png':
await image.png(CONFIG.png).toFile(this._state.dest, this._written);
break;
default:
try {
await copyFile(this._state.src, this._state.dest);
} catch (error) {
log.error(`Failed to copy file from ${this._state.src} to ${this._state.dest}:`, error);
}
}
}
written (error, info) {
const size = (info.size / 1024).toFixed(2);
const diff = (size - this._size).toFixed(2);
const percent = ((size / this._size) * 100).toFixed(2);
log.file(`${this._state.src} (-${this._size} kb) -> ${this._state.dest} (${size} kb)`, `${diff} kb (${percent}%)`);
}
}
export { ImageRefiner };