eleventy-plugin-compress
Version:
Plugin for compressing HTML, CSS and JavaScript from templates with brotli/gzip/deflate algorithms.
3 lines (2 loc) • 3.01 kB
JavaScript
;Object.defineProperty(exports,"__esModule",{value:!0});var e=require("path");require("fs/promises");var t=require("fs"),r=require("chalk");require("util/types"),require("debug"),require("crypto");var s=require("zlib");function n(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var a=n(r);const o=e=>(...t)=>!e(...t);var l,i;(i=l||(l={})).Ok="__$Ok",i.Err="__$Error";const c=e=>null!=e,u=e=>({__$Option:null,map:t=>c(e)?m(t(e)):d,chain:t=>c(e)?t(e):d,apply:t=>c(e)?t.map((t=>t(e))):d,isNone:()=>!c(e),isSome:()=>c(e),extract:t=>null!=e?e:t(),toJSON:()=>({type:"__$Option",value:null!=e?e:null})}),d=u(null),m=u,p=e=>(t,r)=>(...s)=>{const n=e(...s)?t(...s):null==r?void 0:r(...s);return c(r)?n:c(n)?m(n):d},f=e=>/^https?/.test(e),h=(e,t,r=(()=>!0))=>{const s=[];let n=null;for(;null!==(n=t.exec(e));)r(n[1])&&s.push(n[1]);return s},_=()=>"production"===process.env.NODE_ENV,g=Promise.resolve.bind(Promise);Promise.reject.bind(Promise);const v=((...e)=>e.reduce(((e,t)=>(...r)=>{const s=e(...r);return(e=>e instanceof Promise)(s)?s.then(t):t(s)})))(p((t=>""===e.extname(t)))((e=>e),e.dirname),p((e=>t.existsSync(e)))(g,(e=>t.promises.mkdir(e,{recursive:!0}))));let b="";const y=(e,t,r)=>{return console.info(" "+a.default.black.bgYellowBright((new Date).toLocaleTimeString())+" -> "+a.default.bold.gray(b)+": "+e(t instanceof Error?(s=t).name+": "+s.message+"\n"+s.stack:t)+" "+r);var s},P=e=>y(a.default.red,e,"💥");a.default.bold;const w=async r=>({data:await t.promises.readFile(e.resolve(r),{encoding:"utf-8"}).catch((e=>(P(e),""))),url:r}),E=({data:e,url:r})=>t.promises.writeFile(r,e,{encoding:"utf-8"}),L=e=>"."===e.charAt(0),O=/<link\s+[^>]*href="([^"]+\.css)"[^>]*>/g,k=/<script\s+[^>]*src="([^"]+\.js)"[^>]*>/g,q={gzip:(e,t)=>new Promise(((t,r)=>s.gzip(e,{level:s.constants.Z_MAX_LEVEL},((e,s)=>e?r(e):t(s))))).then((e=>({data:e,url:t+".gz"}))),brotli:(e,t)=>new Promise(((t,r)=>s.brotliCompress(e,{params:{[s.constants.BROTLI_PARAM_QUALITY]:s.constants.BROTLI_MAX_QUALITY}},((e,s)=>e?r(e):t(s))))).then((e=>({data:e,url:t+".br"}))),deflate:(e,t)=>new Promise(((t,r)=>s.deflate(e,{level:s.constants.Z_MAX_LEVEL},((e,s)=>e?r(e):t(s))))).then((e=>({data:e,url:t+".deflate"})))},A=async(t,r,s,n)=>{const l="string"==typeof s?[s]:s,i=[Promise.resolve({data:t,url:r})].concat(h(t,O,o(f)).map((t=>w(e.join(L(t)?e.dirname(r):n,t))))).concat(h(t,k,o(f)).map((t=>w(e.join(L(t)?e.dirname(r):n,t)))));await Promise.all(l.map((e=>{const t=q[e];return Promise.all(i.map((e=>e.then((async({data:e,url:r})=>{var s;s=`Start to compress "${r}" file`,y(a.default.green,s,"🆙"),await v(r).then((()=>t(e,r))).then(E).then((()=>(e=>y(a.default.magenta,e,"🙌"))(`"${r}" file was successfully compressed and written to disk`)),P)})))))})))};let j;b="Icons";exports.compress=(t,{enabled:r=_(),algorithm:s="brotli"}={})=>{r&&t.addTransform("compress",(async(t,r)=>{const n=e.normalize(r);return n.endsWith("html")&&(j??=n.split(e.sep)[0],await A(t,n,s,j)),t}))};
//# sourceMappingURL=index.js.map