vite-plugin-single-image-format
Version:
vite-plugin-single-image-format is a Vite/Rollup plugin that converts every raster asset in your build to a single output format – webp, png or avif. It can optionally re‑compress images that are already in the target format and automatically rewrites all
2 lines (1 loc) • 1.22 kB
JavaScript
;const r=require("sharp");module.exports=function(u={}){const{format:n="webp",reencode:l=!1,webp:g={},png:m={},avif:w={}}=u,b={quality:88,alphaQuality:90,smartSubsample:!0,...g},y={quality:80,compressionLevel:9,palette:!0,adaptiveFiltering:!0,...m},d={quality:60,lossless:!1,speed:5,...w},p=/\.(png|jpe?g|webp|gif|avif|heif|heic|tiff?|bmp|jp2)$/i,$=[".html",".css",".js",".mjs",".ts"];return{name:"vite-plugin-single-image-format",apply:"build",enforce:"post",async generateBundle(v,o){const f=new Map;for(const[e,t]of Object.entries(o)){if(t.type!=="asset"||!p.test(e))continue;const s=e.toLowerCase().endsWith(`.${n}`);if(s&&!l)continue;const i=(t.source,Buffer.from(t.source)),a=n==="webp"?await r(i).webp(b).toBuffer():n==="png"?await r(i).png(y).toBuffer():await r(i).avif(d).toBuffer();if(s){t.source=a;continue}const c=e.replace(p,`.${n}`);o[c]||(this.emitFile({type:"asset",fileName:c,source:a}),f.set(e,c),delete o[e])}if(f.size!==0)for(const e of Object.values(o)){if(e.type!=="asset"||!$.some(s=>e.fileName.endsWith(s)))continue;let t=e.source.toString();for(const[s,i]of f){const a=s.replace(/[.*+?^${}()|[\]\\]/g,"\\$&");t=t.replace(new RegExp(`([./]*)${a}`,"g"),(c,h)=>`${h}${i}`)}e.source=t}}}};