UNPKG

@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
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 };